Ethers.js
如何在ethers中呼叫帶有struct參數的函式?
我的堅定:
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]
我最近寫了一個使用結構的契約,這是我的測試文件中的一個片段。
我希望我能幫助你,伙計!繼續黑客攻擊!:)