NIFTEX Docs
Search…
Supported NFTs
An overview of NFTs supported by NIFTEX
NIFTEX smart contracts support all existing NFTs, including early implementations such as CryptoPunks and CryptoKitties.

Supported Standards

The NIFTEX smart contracts explicitly support ERC721, ERC777 and ERC1155. The receivers for these standards can be found in the Token Receiver Module (TokenReceiverModule.sol). These receivers are called via the fallback function in the Wallet (ShardedWallet.sol).

Ingoing Transfers

Custody of NFTs is effected by the Wallet (ShardedWallet.sol), which accepts all incoming transfers and via its fallback functions calls Receivers in the Token Receiver Module (TokenReceiverModule.sol) where necessary.
Some older NFT implementations use non-standard Receiver constants that can cause a failed transfer if triggered via safeTransferFrom() . It is recommended to avoid using this function in favor of transfer(), transferFrom() or equivalent functions when transferring NFTs into NIFTEX smart contracts.

Outgoing Transfers

The smart contracts do not contain specific functions to transfer out NFTs. Instead, outgoing transfers should be triggered via ShardedWallet.execute() or ShardedWallet.moduleExecute().

List of Non-Standard NFTs

The following is a list of non-standard NFT implementations from prominent projects, purely for reference.
  • CryptoPunks
    • Completely custom implementation before ERC721 existed at all, partially relies on ERC20
    • Transfers:
      • function transferPunk(address to, uint punkIndex)
      • event Transfer(address indexed from, address indexed to, uint256 value);
      • event PunkTransfer(address indexed from, address indexed to, uint256 punkIndex);
    • Ownership:
      • mapping (uint => address) public punkIndexToAddress;
      • mapping (address => uint256) public balanceOf;
  • CryptoKitties
    • Earliest ERC721 implementation with important divergences and inspiration taken from ERC20
    • Transfers:
      • Does not implement safeTransferFrom() at all, does implement transfer() (ERC20)
      • event Transfer(address from, address to, uint256 tokenId);
    • Ownership:
      • function ownerOf(uint256 _tokenId) external view returns (address owner);
  • CryptoVoxels parcels
    • Early ERC721 implementation with important divergences
    • Transfers:
      • Wrong onERC721Received constant
        • bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;
      • event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    • Ownership:
      • function balanceOf(address _owner) public view returns (uint256 _balance);
      • function ownerOf(uint256 _tokenId) public view returns (address _owner);
  • Axie Infinity Axies
    • Early ERC721 implementation with some divergences
    • Transfers:
      • Does not check return value for onERC721Received
      • IERC721TokenReceiver(_to).onERC721Received.gas(50000)(_from, _tokenId, _data);
      • Call will always pass because of fallback
      • event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    • Ownership:
      • function balanceOf(address _owner) external view returns (uint256);
      • function ownerOf(uint256 _tokenId) external view returns (address);
  • Blockchain Cuties
    • Early ERC721 implementation with some divergences
    • Transfers:
      • Does not check return value for onERC721Received
      • ERC721TokenReceiver (_to).onERC721Received(_from, _tokenId, data);
      • Call will always pass because of fallback
      • event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    • Ownership:
      • mapping (uint40 => address) public cutieIndexToOwner;
      • mapping (address => uint256) ownershipTokenCount;
      • function balanceOf(address _owner) external view returns (uint256 count)
      • function ownerOf(uint256 _cutieId) external view canBeStoredIn40Bits(_cutieId) returns (address owner)
  • Makersplace v2
Last modified 9mo ago