Openzeppelin

totalSupply() 計數問題

  • August 3, 2021

我正在使用 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;
}

你從一個totalSupplyof開始20。然後for循環初始化一個變數i。這將被初始化為零(Solidity 中的所有變數都被初始化為它們的零表示:0address(0)false等)。結果,在 for 循環的第一次迭代中,當_safeMint被呼叫時,它將以_tosupply + 0作為參數呼叫,這意味著它正在鑄造到第 20 個插槽,這已經被計算在內。

您可能希望使用以下方法初始化for循環:

for(uint256 i=1; i <= _amount; i++){

而不是初始化i為零。(還有很多其他解決方案,但這是我們推薦的解決方案。)除此之外,程式碼看起來應該可以按預期工作。快樂編碼!

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