Ethers 使用参数而不是 hexdata 传递方法名称

Ethers pass method name with parameters instead of hexdata

我正在使用 ethers 与以太坊上的合约进行交互。 这就是我的方法:

const tx = await signer
      .sendTransaction({
        to: contractAddress,
        value: ethers.utils.parseEther(price),
        data: hex,
        gasPrice: ethers.utils.parseUnits(gas, 9),
      })

而且效果很好。但每次我都必须查看 Etherscan 以找到交易十六进制并将其传递给 data 参数。是否可以只将方法名称从合同和参数传递给它而不是传递此 hex 值?

也许 ethers 中有任何方法可以将带有参数的方法编码为十六进制值?

你需要的是合约ABI。一般写成一个json对象你可以在你的js脚本中导入,也可以这样写(human-readable-ABI):

const contractABI = [
  "function foo(uint256 bar) external",
  // other functions or events ...
]

ABI 包含合约的所有(或部分)方法以及如何encode/decode它们。

使用 ABI,您可以像这样创建合约对象:

const contract = new ethers.Contract(contractAddress, contractABI, provider);

可用于发送这样的交易:

const my_bar = 123  // example
const tx = await contract.connect(signer).foo(my_bar, {
  value: ethers.utils.parseEther(price),
  gasPrice: ethers.utils.parseUnits(gas, 9),
})