Delegatecall

如何對您擁有地址的已部署庫進行委託呼叫

  • November 7, 2022

在 TestContract 上呼叫 foo() 時,以下程式碼失敗。已將adaptedLib 設置為正確的地址。您如何正確地對庫進行委託呼叫?

contract TestContract {
   address public adapterLib;
   uint public a;

   function setLib(address lib)public{
       adapterLib = lib;
   }

   function foo()public {
       (bool success, bytes memory returnData) = adapterLib.delegatecall(
               abi.encodeWithSignature('foo(uint)', 1)
           );
   }
   
}

library Test{

   function foo(State storage state)external returns(uint){
       return 1;
   }
}

嘗試將函式簽名更改為“foo(uint256)”。這當然是一個問題,因為 uint 是 uint256 的簡寫,但你不能將那個簡寫用於函式簽名

您的庫在您的智能合約中實現並且您在那裡使用該庫,在這種情況下“delegateCall”不適合,您可以使用“yourLibrary.yourFunc()”,但如果您在另一個合約中實現您的庫,我建議檢查您的輸入參數類型(uint 到 uint256)

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