Openzeppelin
totalSupply() 計數問題
我正在使用 openZeppelin 編寫 NFT 鑄造合約,並具有 2 個可以鑄造代幣的功能。薄荷和儲備薄荷。每個函式都可以在不同的時間以不同的順序相互獨立地呼叫,直到 totalSupply 用完為止。可以呼叫 reserveMint 直到 _reserve 用完。
我遇到的問題是,畢竟鑄造了totalSupply 顯示為29 而不是30。鑄造了30 個代幣。第一個 tokenID 從 0 開始,最後一個 tokenID 在 29 結束。這很好。我可以做些什麼來確保合約中的 totalSupply 為 30。我不想讓那些查看合約認為只有 29 個被鑄造的使用者感到困惑。
謝謝!
uint256 private _reserve = 10; uint256 public constant totalSupply = 20; function mint(uint256 numberOfTokens) public payable { uint256 supply = totalSupply(); require( numberOfTokens <= 20, "You can mint 20 at a time." ); require( supply + numberOfTokens < (totalSupply - _reserve), "Exceeds total supply" ); require( msg.value >= Price * numberOfTokens, "Ether sent is not correct" ); for(uint256 i; i < numberOfTokens; i++){ _safeMint( msg.sender, supply + i ); } } function reserveMint(address _to, uint256 _amount) external onlyOwner() { require( _amount <= _reserve, "Exceeds reserved supply" ); uint256 supply = totalSupply(); for(uint256 i; i < _amount; i++){ _safeMint( _to, supply + i ); } _reserve -= _amount; }
讓我們看一下您的程式碼:
uint256 public constant totalSupply = 20; ... function reserveMint(address _to, uint256 _amount) external onlyOwner() { require( _amount <= _reserve, "Exceeds reserved supply" ); uint256 supply = totalSupply(); for(uint256 i; i < _amount; i++){ _safeMint( _to, supply + i ); } _reserve -= _amount; }
你從一個
totalSupply
of開始20
。然後for
循環初始化一個變數i
。這將被初始化為零(Solidity 中的所有變數都被初始化為它們的零表示:0
、address(0)
、false
等)。結果,在 for 循環的第一次迭代中,當_safeMint
被呼叫時,它將以_to
和supply + 0
作為參數呼叫,這意味著它正在鑄造到第 20 個插槽,這已經被計算在內。您可能希望使用以下方法初始化
for
循環:for(uint256 i=1; i <= _amount; i++){
而不是初始化
i
為零。(還有很多其他解決方案,但這是我們推薦的解決方案。)除此之外,程式碼看起來應該可以按預期工作。快樂編碼!