Dapps

要求陣列長度無效

  • October 22, 2021

我有以下功能

function mint(uint256[] memory tokens) public payable {
       require(saleIsActive, "Sale is not active");
       require(tokens.length == 0, "No tokens to mint");
   require(
       tokens.length > maxGradisPurchase,
       "number of tokens incorrect"
   );
       for (uint256 i = 0; i < tokens.length; i++) {
           _safeMint(msg.sender, tokens[i]);
           _setTokenURI(tokens[i], "sometokeuri");
           _totalTokens.increment();
       }

}

require(tokens.length == 0, "No tokens to mint");不起作用,這是我的 javascript 測試:

it('should not allow to mint a gradis if token array is empty', async () => {
   // activate sales before test
   await myContractInstance.flipSaleState({ from: accounts[0] });

   const tokensToMint = [1];
   await myContractInstance.flipSaleState
     .mint(tokensToMint, {
       from: accounts[1],
       value: 1000000000000000,
     })
     .catch((error) => {
       console.log(error);
       assert(
         error.message,
         'Returned error: VM Exception while processing transaction: revert Sale is not active -- Reason given: Token is not correct.'
       );
     });

   const minted = await gradisInstance.totalSupply();
 });

但是總是觸發要求,我不明白為什麼程式碼總是token.length等於零,即使我正在編寫正確的令牌

您說 require 不起作用並且令牌正在被鑄造,但這正如預期的那樣:require(condition, revertString)意味著如果條件為false,則事務將恢復。

在您的情況下,由於您傳遞給滿足條件的函式參數(長度為 0 或 6 的令牌列表),因此不會觸發 require 並且令牌會按照您的描述進行鑄造。

如果您想測試它是否正常工作,只需將 4 項傳遞給它:const tokensToMint = [1, 2, 3, 4]. "Token is not correct"然後交易應該與您的消息一起恢復。

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