假设我们这里有一段代码
function gift(address _account) external onlyOwner {
if (totalSupply() + 1 > MAX_SUPPLY) {
revert Contract__MintGiftExceeded();
}
_safeMint(_account, (s_nftIdCounter).current());
(s_nftIdCounter).increment();
}我注意到,在这个函数中,虽然我们没有将天赋的NFT添加到totalSupply()中,但是我们只做counters.increment(),而totalSupply()仍然知道令牌的总数。
因此,我一直在想,这到底是如何工作的,为什么totalSupply()不忘记跟踪令牌的总数。
发布于 2022-08-30 11:53:12
由于您使用的是ERC721Enumberable,所以更改是从ERC721Enumberable.sol _allTokens私有变量中进行的,而不是像这里的其他用户所提到的ERC777。但是是的,_safeMint()是负责在内部更改totalSupply()的。
-> in ERC721.sol有调用_mint的_safeMint
-> _mint调用_beforeTokenTransfer
->现在这个_beforeTokenTransfer是虚拟的,并且被ERC721Enumberable合同覆盖。
-> _beforeTokenTransfer调用_addTokenToAllTokensEnumeration
-> _addTokenToAllTokensEnumeration调用_allTokens.push(tokenId);推送数组中的令牌。
-> totalSupply()从_allTokens读取
发布于 2022-08-30 11:30:31
总供应量将在_safeMint()函数中更新。在ERC777的openzeppelin实现中发生这里。
https://ethereum.stackexchange.com/questions/134640
复制相似问题