Erc-721

如何獲取令牌 ID?

  • September 11, 2021

我試圖在鑄造後取回令牌 ID。我的契約 sol 中有以下功能。

   function createToken(address to) public onlyOwner returns (uint256)  {
       _tokenIdCounter.increment();
       uint256 newItemId = _tokenIdCounter.current();

       _safeMint(to, newItemId);
       return newItemId;
   }

鑄幣工作有效,但我沒有返回 newItemId,而是返回了 json 數據。就像我只是直接呼叫 mint 方法一樣。

{
 tx: '0xf...',
 receipt: {
   transactionHash: '0x...',
   transactionIndex: 0,
   blockHash: '0x...',
   blockNumber: 5,
   from: '0x...',
   to: '0x...',
   gasUsed: 154884,
   cumulativeGasUsed: 154884,
   ...

我正在用松露在本地進行測試。

這基本上是一個eth_getTransactionReceipt響應,但是除非您的函式具有 view/pure 修飾符,否則您不會使用它來檢索返回值,在您的情況下,此函式需要修改契約的狀態,因此您需要創建一個事件來功能完成後記錄它,然後您將能夠檢查它,例如:

// you can also use "indexed" if you want the value in the topics 
event Mint(uint256 _tokenId);

function createToken ...
...
emit Mint(newItemId);
...
}

響應將是相同的,但在日誌欄位中您會發現類似的內容(在此範例中,tokenId 為 10):

logs": [
     {
       ...
       "data": "0x000000000000000000000000000000000000000000000000000000000000000a",
       "topics": [
         "0x07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a84665"
       ],
     }
]

基本上,主題將儲存 keccak256 函式名稱和事件的任何索引參數(在本例中為無),並且數據將儲存非索引值(在本例中為 10)。

因此,要獲取 tokenId,您只需將數據欄位轉換為 uint 0x000000000000000000000000000000000000000000000000000000000000000a= 64 bytes hex string => 10

值得一看:

https://docs.soliditylang.org/en/latest/contracts.html#events

https://docs.soliditylang.org/en/latest/contracts.html#functions

https://docs.soliditylang.org/en/latest/abi-spec.html

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