Every WRC-721 compliant contract must implement the WRC721 and WRC165 interfaces. Other extension interfaces can be implemented according to specific business requirements.
1.1.1 WRC-721 & WRC-165 Interfaces
pragma solidity ^0.4.20;interfaceWRC721 {// Returns the number of NFTs owned by the given accountfunctionbalanceOf(address _owner) externalviewreturns (uint256);//Returns the owner of the given NFTfunctionownerOf(uint256 _tokenId) externalviewreturns (address);//Transfer ownership of NFTfunctionsafeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) externalpayable;//Transfer ownership of NFTfunctionsafeTransferFrom(address _from, address _to, uint256 _tokenId) externalpayable;//Transfer ownership of NFTfunctiontransferFrom(address _from, address _to, uint256 _tokenId) externalpayable;//Grants address ‘_approved’ the authorization of the NFT ‘_tokenId’functionapprove(address _approved, uint256 _tokenId) externalpayable;//Grant/recover all NFTs’ authorization of the ‘_operator’functionsetApprovalForAll(address _operator, bool _approved) external;//Query the authorized address of NFTfunctiongetApproved(uint256 _tokenId) externalviewreturns (address);//Query whether the ‘_operator’ is the authorized address of the ‘_owner’functionisApprovedForAll(address _owner, address _operator) externalviewreturns (bool);//The successful ‘transferFrom’ and ‘safeTransferFrom’ will trigger the ‘Transfer’ Event event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);//The successful ‘Approval’ will trigger the ‘Approval’ event event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);//The successful ‘setApprovalForAll’ will trigger the ‘ApprovalForAll’ event event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); }interfaceWRC165 {//Query whether the interface ‘interfaceID’ is supportedfunctionsupportsInterface(bytes4 interfaceID) externalviewreturns (bool); }
A wallet/broker/auction application MUST implement the wallet interface if it will accept safe transfers.
Solidity
interfaceWRC721TokenReceiver {//This method will be triggered when the ‘_to’ is the contract address during the ‘safeTransferFrom’ execution, and the return value must be checked, If the return value is not bytes4(keccak256("onTRC721Received(address,address,uint256,bytes)")) throws an exception. The smart contract which can receive NFT must implement the TRC721TokenReceiver interface.functiononWRC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) externalreturns(bytes4); }
The hash of bytes4(keccak256("onWRC721Received(address,address,uint256,bytes))) is different from the Ethereum version bytes4(keccak256("onERC721Received(address,address,uint256,bytes))). Please use 0x5175f878 instead of 0x150b7a02.
1.1.2 OPTIONAL Metadata Extension Interface
The metadata extension is OPTIONAL for WRC-721 smart contracts. This allows your smart contract to be interrogated for its name and for details about the assets which your NFTs represent.
Solidity
interfaceWRC721Metadata {//Return the token namefunctionname() externalviewreturns (string _name);//Return the token symbolfunctionsymbol() externalviewreturns (string _symbol);//Returns the URI of the external file corresponding to ‘_tokenId’. External resource files need to include names, descriptions and pictures. functiontokenURI(uint256 _tokenId) externalviewreturns (string); }
URI is a URI link describing the _tokenId asset, pointing to a JSON file that conforms to the WRC721 metadata description structure. When tokens are minted, each token needs to be assigned a unique URI:
JSON
{"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." } }}
1.1.3 OPTIONAL Enumeration Extension Interface
The enumeration extension is OPTIONAL for WRC-721 smart contracts. This allows your contract to publish its full list of NFTs and make them discoverable.
Solidity
interfaceWRC721Enumerable {//Return the total supply of NFTfunctiontotalSupply() externalviewreturns (uint256);//Return the corresponding ‘tokenId’ through ‘_index’functiontokenByIndex(uint256 _index) externalviewreturns (uint256);//Return the ‘tokenId’ corresponding to the index in the NFT list owned by the ‘_owner'functiontokenOfOwnerByIndex(address _owner, uint256 _index) externalviewreturns (uint256); }