/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.web
interface ERC721 /* is ERC165 */ {
//變動NFT全部權
//NFT的建立和銷燬時觸發
//除外狀況:建立合約時,不須要transfer也能夠建立和分配NFT
//發起transfer時,approved address會被重置爲none網絡
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
//在NFT的approved address變動或從新確認時被觸發。
//zero address表明沒有approved address。
//當i一個transfer事件發生時,approved address會被重置爲none。app
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
//operator被受權或撤權時觸發。
//operator能夠管理owner 的全部NFT。ide
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
//計數owner名下的全部NFT。
//分配NFT給zero address 是無效的。同時,query zero address 的時候,函數拋出異常。
//參數是發起查詢的人。
//返回NFT數量,多是0。函數
function balanceOf(address _owner) external view returns (uint256);
//獲取NFT全部者。
//分配NFT給zero address 是無效的。同時,query zero address 的時候,函數拋出異常。
// 參數 _tokenId 是NFT的標識符identifier。
//返回owner地址。ui
function ownerOf(uint256 _tokenId) external view returns (address);
//將NFT的全部權從一個地址轉移到另外一個地址。
//拋出異常的狀況包括:
// _from 不是當前全部者,
// _to 是zero address,
//_tokenId 不是有效NFT,
//當轉移完成,函數會校驗_to 是否是一個合約。
//若是是,就會使用_to 來調用onERC721Received 方法,
//而且這個方法,在返回值不是 bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")) 時拋出異常。
// _from 是NFT當前全部者,
// _to 是新全部者,
// _tokenId 是要被轉移的NFT ,
// data是沒有特定格式的數據,用來sent in call to _to
this
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
//如上,只是將data參數置空,「」。url
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
//轉移NFT全部權。
//調用方有責任檢查 _to 是否可以有效接收NFT,若是無做爲可能會致使永久丟失。
//拋出異常:當msg.sender不是當前owner,不是approved address,不是authorized operator。
//三個參數任一無效,則拋出異常。code
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
//爲NFT設置或從新確認approved address。
//zero address表明沒有approved address。
//拋出異常:當msg.sender不是當前owner,不是approved address,不是authorized operator。
//_approved 將被設爲owner的角色。
//_tokenId 當前被操做的幣。token
function approve(address _approved, uint256 _tokenId) external payable;
//受權或撤銷權利,對第三方operator,對msg.sender全部資產的操做的權利。
//觸發ApprovalForAll事件。
//合約必須容許每一個owner有多個operator。
//參數 _operator 添加到authorized operators裏面。
//參數bool值,true表示容許,false表示撤銷。
function setApprovalForAll(address _operator, bool _approved) external;
//獲取單個NFT的approved address。
//拋出異常:_tokenId無效時。
//_tokenId指代哪一個幣。
//返回approved address
function getApproved(uint256 _tokenId) external view returns (address);
//查詢address是不是另外一個address的authorized operator 。
//interfaceID是接口標識符,(ERC-165中規定的)。
//ERC-165中規定了,對接口的鑑別。
//返回值爲true,表明合約實現了interfaceID這個接口。而且interfaceID
不是 0xffffffff。
//false表明沒實現。
function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
================================================================================================
interface ERC165 {
//查詢一個合約是否實現了這個接口。
function supportsInterface(bytes4 interfaceID) external view returns (bool); }
================================================================================================
/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface ERC721TokenReceiver {
//處理NFT的收據。
//ERC721合約在transfer執行後,對接收者recipient調用這個方法。
//若是傳值不對,函數會拋出異常以回覆或拒絕這個transfer。而這將致使整個交易被拒絕。
//合約地址老是message sender。
// _operator, 調用函數safeTransferFrom的地址。
//_from,以前的token擁有者。
//_tokenId,被轉移的NFT。
//data,無規定格式的additional數據。
//返回bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))
,否則就拋出異常。
function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4); }
================================================================================================
//metadata extension是erc721合約的可選項。它容許其餘人對智能合約發出有關NFT所表明資產的name和details。
/// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface ERC721Metadata / is ERC721 / {
//對NFT的描述性名稱。
function name() external view returns (string _name);
//合約中NFT的簡短名稱。
function symbol() external view returns (string _symbol);
//對指定資產的惟一URI。
//拋出異常:tokenId不正確時,
//URI可能指向(符合元數據JSON模型的)JSON file。。
function tokenURI(uint256 _tokenId) external view returns (string);
//這是上面提到的"ERC721 Metadata JSON Schema"。
{
"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.", } }
//enumeration extension是erc721合約的可選項。它能使合約提供完整列表和和可發現。
/// Note: the ERC-165 identifier for this interface is 0x780e9d63.
interface ERC721Enumerable / is ERC721 / {
//計數合約追蹤的NFT。
//合約追蹤的有效NFT,每一個NFT都是已分配和可查詢的地址(不能是zero address)
function totalSupply() external view returns (uint256);
//枚舉有效NFT。
//拋出異常: _index
>= totalSupply()
時。
//(不指定排列順序。)
function tokenByIndex(uint256 _index) external view returns (uint256);
//計算屬於某個owner的NFT數量。
//拋出異常:_index
>= balanceOf(_owner)
或zero address。
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
//關於NFT標識符 NFT Identifiers。
//每一個NFT在合約內都有惟一的ID。這個號碼不會變動。這個mapping會全局惟一併呵護規範。
//有些合約會從ID 0 開始自增1。
//調用者不該假設ID號有任何特殊含義,應建議將ID視爲「black box」通常。
//元數據選擇(元數據擴展)
//在metadata extension裏面須要有name和symbol函數。
//上述兩個函數返回值爲空也能夠。 //合約可使用相同的名字和標識。
//提示:其餘人合約名稱可能相同。
//NFT和URI相關聯。
//咱們但願每一個實現均可以受益於此,並給每一個NFT都提供metadata。
//URI多是可變的。
//元數據是以string返回的。當前只在web3調用有效。但前還行,由於暫時鏈上應用沒有特定需求去發出這樣的請求。
//erc721指向total supply的兩個函數:addTokenTo()和 _mint().
//在徹底實現的合約裏面,調用addTokenTo(),以後super.addTokenTo()容許咱們調用addTokenTo()函數。
//在這兩個函數以後,就能夠更新全局的ownership變量了。
The functions take in two parameters _to or the address to which the token will be owned and _tokenId or the unique id of the token — chosen by whomever you allow to call this function, you’d likely limit this call to the owner of the contract. In this case, the user can choose any unique number id. First, in the ERC721BasicToken contract, we check that the token id is not already owned. Then we set the token owner of the requested token id, and add one to the number of owned tokens of that individual account. Going back to the full implementation contract, we also update the array of the new owner’s (_to)tokens by adding this new token to the end of their ownedTokens array and saving the index of that new token.
luckycoin可能用到的erc721接口
1,生成NFT /發放:
2,查詢NFT:
3,交易NFT,使用NFT參與遊戲時發起轉帳,或給其餘地址轉NFT:(下面兩個函數二選一使用均可以)
如下函數同上一摸同樣,除了能夠加一個相似於備註的data(上面這個函數等同於data置空。)
4,設置合約對單個NFT的操做權限:to是合約。
5設置對某address名下的全部NFT可操做的權限: