NFT Lightning Talk

Ben Beecher

 

What is an NFT

Sample Examples:

Sample examples:


Physical property — houses, unique artwork


Virtual collectables — unique pictures of kittens, collectable cards


"Negative value" assets — loans, burdens and other responsibilities

 

In general, all houses are distinct and no two kittens are alike. NFTs are distinguishable and you must track the ownership of each one separately.

 

ERC 721

Examples in the wild

CryptoKitties

Each Cat has a separate genome + owner

Decentraland

Property is unique and differentiated 

How are they actually distinguished?

 

 

Token id is integer, and unique token location is defined as contractID + TokenID

NFT is very similar to an ERC20 token + a bunch of optional expansions

(missing the decimal value though)

So not a direct extension

Implementation

Details

safeTransferFrom

checks ownership of the sender and is supposed to throw if not an allowed operator

 

function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;

 

function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

Wallets must implement

 

function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);

 

To handle incoming assets and can throw to reject transfer

Metadata Expansion 

This allows your smart contract to be interrogated for its name and for details about the assets which your NFT represent

interface ERC721Metadata  {
    function name() external pure returns (string _name);

    function symbol() external pure returns (string _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string);
}

{

    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents",
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents",
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive.",
        }
    }
}

Example metadata:

 

Metadata is not used on chain

Is only accessible via web3 - no usecase for on chain querying of metadata

 

Enumeration Extension

Allows your contract to publish its full list of NFTs and make them discoverable.

 

interface ERC721Enumerable  {
    function totalSupply() external view returns (uint256);

    ///  (sort order not specified)
    function tokenByIndex(uint256 _index) external view returns (uint256);

    ///   (sort order not specified)
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

Thanks!

Privacy

 

Ownership of a token is _public_ and that is unchangeable. No such thing as private holder if your wallet id is leaked!

NFTs

By Ben Beecher

NFTs

  • 957