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),
})
我正在使用 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),
})