Web3js

如何在函式中傳遞參數,該參數將用作帶有 web3.js 的 web3 實例中的方法名稱?

  • September 15, 2022

我正在嘗試創建一個函式,該函式將使用 web3.js 的契約方法的名稱作為參數。這是原始功能:

async function estimateGas() {
 const w3 = await new Web3(window.ethereum);
 window.contract = await new w3.eth.Contract(myContr.abi, myContr.addr);
 window.contract.methods.buy().estimateGas({from: ethereum.selectedAddress});
}

這個函式像這樣工作得很好,但我想修改它,以便我可以使用合約上的所有其他方法(例如 .claim()、.transfer() 等)作為參數,比如所以:

async function estimateGas(argumentName) {
 const w3 = await new Web3(window.ethereum);
 window.contract = await new w3.eth.Contract(myContr.abi, myContr.addr);    
 // I want to change here below what was the ".buy()" method with my argument as if it would have been ".argumentName()"
 window.contract.methods.argumentName().estimateGas({from: ethereum.selectedAddress});
}

我怎樣才能做到這一點?

你可以用 Javascript 明確地做到這一點。看看另一種訪問 js 對象屬性的方法,obj["property"]語法如下:

async function estimateGas(argumentName) {
 const w3 = await new Web3(window.ethereum);
 window.contract = await new w3.eth.Contract(myContr.abi, myContr.addr);    
 // I want to change here below what was the ".buy()" method with my argument as if it would have been ".argumentName()"
 window.contract.methods[argumentName]().estimateGas({from: ethereum.selectedAddress});
}

例如,看一下這個答案,我使用這種方法動態呼叫 js web3 對象的函式:有沒有辦法從 ABI 中提取函式並在前端顯示它?

const result = await counter.methods[functionName](...args).call();

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