Erc-721

將 ERC721 代幣部署到多個地址

  • April 7, 2022

如何將我的許多 ERC721 代幣轉移到多個地址?

我的ERC721:

function mintUniqueTokenTo (
   address _to,
   uint256 _tokenId,               
   string  _tokenURI // Store, receipient's name, grade and program details
) public
{        
   super.mint(_to, _tokenId);        
   super._setTokenURI(_tokenId, _tokenURI);
}

鑄造一個代幣很容易:

nftInstance.mintUniqueTokenTo(address, tokenId, tokenURI)

對於許多收件人,我想創建一個分發契約,但solidity 不能接受字元串數組。所以我不能將tokenIdstokenURIs傳遞給它

addresses[]; //List of receipients of my NFT tokens
tokenIds[];
tokenURIs[];

所以這就是我卡住的地方。我的方法錯了嗎?

有幾種方法可以設置 ERC721“令牌元數據 URI”。

1.在程式碼中計算URI

由於我們將“addresses”和“tokenIds”作為數組傳遞,我們可以通過連接“base_uri”+目前 tokenId 來計算 URI 字元串,然後設置它。

  1. 創建自己的數據序列化/反序列化程式碼。 ======================

正如您所注意到的 Solidity 的 ABI(應用程序二進制介面)不支持處理嵌套/多級數組。

由於一個字元串已經是一個字節數組,(前 32 個字節包含長度 uint256 0x00 到 0x20 / 下一個 0x20 到任何包含實際數據)我們可以編寫一個自定義數據解析器,無論是純solidity 還是solidity 彙編。

這個解析器可以只處理 tokenURI,甚至可以組合我們需要的所有參數(地址/tokenId/tokenURI)。

查看Zoom Src / Zoom Docs,了解如何直接在裝配中完成此操作。

希望這可以幫助。

Su Squares的程式碼包括這個塊

/// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
/// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
///  3986. The URI may point to a JSON file that conforms to the "ERC721
///  Metadata JSON Schema".
function tokenURI(uint256 _tokenId)
   external
   view
   mustBeValidToken(_tokenId)
   returns (string _tokenURI)
{
   _tokenURI = "https://tenthousandsu.com/erc721/00000.json";
   bytes memory _tokenURIBytes = bytes(_tokenURI);
   _tokenURIBytes[33] = byte(48+(_tokenId / 10000) % 10);
   _tokenURIBytes[34] = byte(48+(_tokenId / 1000) % 10);
   _tokenURIBytes[35] = byte(48+(_tokenId / 100) % 10);
   _tokenURIBytes[36] = byte(48+(_tokenId / 10) % 10);
   _tokenURIBytes[37] = byte(48+(_tokenId / 1) % 10);

}

在這種方法中,URI 是動態計算的。您可以對 URI 使用類似的方法,這允許您將數組方法用於您自己的mintUniqueTokensTo函式。

^ 這假設您正在使用中等數量的造幣廠操作。例如,OpenSea 最近引入了限制為 30 項的捆綁傳輸(請參見此處的其中之一)。如果您正在做比這更大的事情,您需要一個更具可擴展性的解決方案。我們可以討論這些,但這超出了這個問題的範圍。

引用自:https://ethereum.stackexchange.com/questions/64946