Solidity
如何將記憶體中的靜態數組轉換為 calldata 靜態數組?
我有一個契約
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
而不是calldata
for即可tokens
解決問題。如果您通過事務呼叫合約,這只會將呼叫數據複製到記憶體中。