Ethers.js

如何在ethers中呼叫帶有struct參數的函式?

  • October 26, 2022

我的堅定:

contract Test {

   struct Num {
       uint value;
   }

   function double(Num calldata num) external pure returns(Num memory) {
       return Num({ value: num.value * 2 });
   }
}

我的醚:

await test.double(2); // doesn't work
await test.double([ 2 ]); // doesn't work
await test.double({ value: 2 }); // doesn't work
await test.double(ethers.BigNumber.from(2)); // doesn't work
await test.double([ ethers.BigNumber.from(2) ]); // doesn't work
await test.double({ value: ethers.BigNumber.from(2) }); // doesn't work

如果我呼叫一個返回Num類型(例如值為 5)的函式,我會得到:

[
 BigNumber { value: "5" },
 value: BigNumber { value: "5" }
]

所以我也嘗試了:

const params = [ ethers.BigNumber.from("2"), value: ethers.BigNumber.from("2") ]
await test.double(params);

但這甚至沒有編譯…

我也看過這裡:https ://docs.ethers.io/v5/api/utils/abi/coder/#AbiCoder-decode

在此處輸入圖像描述

這似乎返回了我需要的結構類型。所以我也嘗試了:

let params = ethers.utils.defaultAbiCoder.encode(
   [ 'uint value' ],
   [ 2 ]
);
params = ethers.utils.defaultAbiCoder.decode([ "uint value" ], params);
await test.double(params) // doesn't work

但這也不起作用……

幫助?

對於結構,您使用一個對象來插入參數:

const data = {
   value: 100,
}
const tx = await test.double(data);
console.log(tx);

我嘗試並得到了輸出:

[ 
BigNumber { value: "200" }, 
value: BigNumber { value: "200" } 
]

如果您嘗試將參數傳遞給結構,只需嘗試使用方括號,如下所示:

await contractName.functionFoo([exampleNumber]);

如果一個函式返回一個結構並且您想與其中的鍵進行互動,您也可以嘗試:

let response = await contractName.functionFoo([exampleNumber])
// the number from the struct is now stored at response[0]

我最近寫了一個使用結構的契約,這是我的測試文件中的一個片段。

我希望我能幫助你,伙計!繼續黑客攻擊!:)

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