Solidity

如何將記憶體中的靜態數組轉換為 calldata 靜態數組?

  • September 14, 2021

我有一個契約Erc20Recover,其中我有以下功能:

pragma solidity >=0.8.0;

contract Erc20Recover {
   function _setNonRecoverableTokens(IErc20[] calldata tokens) public {
       // ...
   }
}

我有另一個呼叫的契約HToken,它繼承自我Erc20Recover試圖呼叫的建構子並在其建構子中呼叫_setNonRecoverableTokens

pragma solidity >=0.8.0;

contract HToken is Erc20Recover {
   constructor(underlying) {
       IErc20[1] memory nonRecoverableTokens = [underlying];
       _setNonRecoverableTokens(nonRecoverableTokens);
   }
}

但程式碼無法編譯:

函式呼叫中的參數類型無效。來自合約 IErc20 的無效隱式轉換

$$ 1 $$記憶收縮IErc20$$ $$請求的呼叫數據。

如何將記憶體中的靜態數組轉換為 calldata 數組?或者,更一般地說,我該如何打電話_setNonRecoverableTokens

對於上下文:IErc20是我對 ERC-20 介面的實現。

無法將數據從記憶體複製到呼叫數據。Calldata 是最便宜的儲存類型,它是只讀的,只能用於通過事務輸入傳遞給函式的數據。

來自Solidity 文件

如前所述,被呼叫的合約(可以與呼叫者相同)將接收一個新清除的記憶體實例,並可以訪問呼叫有效負載 - 這將在稱為 calldata 的單獨區域中提供。

正如您在評論中提到的,只需使用memory而不是calldatafor即可tokens解決問題。如果您通過事務呼叫合約,這只會將呼叫數據複製到記憶體中。

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