Contract-Invocation

是否需要 ABI 呼叫與 ethers.js 的合約?

  • March 6, 2021

文件

// The Contract interface
let abi = [ ... ];

// Connect to the network
let provider = ethers.getDefaultProvider();

// The address from the above deployment example
let contractAddress = "...";

// We connect to the Contract using a Provider, so we will only
// have read-only access to the Contract
let contract = new ethers.Contract(contractAddress, abi, provider);

我了解這是如何工作的,但我很好奇您是否需要 ABI?在 web3.js 中,你不需要,這要歸功於將合約方法作為字元串傳遞的能力:

// in web3.js
contract.methods["someMethod()"]()

至少從 v4 開始,答案是肯定的,必須提供合約 ABI。創建沒有 ABI 且沒有提供者或簽名者的契約:

let tokenContract = new ethers.Contract(tokenAddress);

產生此錯誤:

TypeError:無法讀取未定義的屬性“forEach”

創建沒有提供者或簽名者的契約:

let tokenContract = new ethers.Contract(tokenAddress, erc20Abi);

產生另一個錯誤:

錯誤:無效的簽名者或提供者(arg=“signerOrProvider”,value=undefined,version=4.0.41)

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