javascript - 为 Web3 发出编码地址数组
问题描述
我正在尝试调用Uniswap 路由器合约,例如:
// dummy data
Function: swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline)
MethodID: 0x7ff36ab5
[0]: 000000000000000000000000000000000000000000000000000000dd0f593444
[1]: 0000000000000000000000000000000000000000000000000000000000000080
[2]: 00000000000000000000000047c0a182235478ca13d248d049eaa28d4ff7520f
[3]: 000000000000000000000000000000000000000000000000000000005f9a1e44
[4]: 0000000000000000000000000000000000000000000000000000000000000002
[5]: 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
[6]: 0000000000000000000000001a969239e12f07281f8876d11afcee081d872adf
在我的 TypeScript 代码中,我有:
const abi = web3.eth.abi.encodeFunctionCall(
{
type: 'function',
name: 'swapExactTokensForTokens',
inputs: [
{
name: 'amountIn',
type: 'uint256',
},
{
name: 'amountOutMin',
type: 'uint256',
},
{
name: 'path',
type: 'address[]',
},
{
name: 'to',
type: 'address',
},
{
name: 'deadline',
type: 'uint256',
},
],
},
[
fromWei,
toWei,
// the problem
web3.eth.abi.encodeParameter('address[]', [
'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
'0x20fe562d797a42dcb3399062ae9546cd06f63280',
]),
getAddress(),
deadline,
]
)
从错误中,看起来 encodeFunctionCall 并不期望编码数组(至少,我这样做的方式)。那么我将如何传递一个地址数组呢?
(node:21008) UnhandledPromiseRejectionWarning:
Error: expected array value
(argument="path", value="0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000020fe562d797a42dcb3399062ae9546cd06f63280", code=INVALID_ARGUMENT, version=abi/5.0.0-beta.153)
解决方案
我相信web3.eth.abi.encodeFunctionCall
期望 JSON 类型的参数,例如address[]
表示为一个简单的字符串数组["0x...", "0x..."]
// the problem
web3.eth.abi.encodeParameter('address[]', [
'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
'0x20fe562d797a42dcb3399062ae9546cd06f63280',
]),
而不是请尝试:
[
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"0x20fe562d797a42dcb3399062ae9546cd06f63280"
],
推荐阅读
- hive - 将 csv 数据上传到 hive 表时出现问题
- qt - SVG QIcon 无法返回要在 QToolButton 中使用的放大像素图
- cakephp - 尝试在 cakephp2.x 中配置 mpdf 插件
- javascript - Laravel - PHP - 无法在单个视图中切换两个表单
- azure - Azure 中的存储消耗报告
- google-maps - MapView 的自定义信息窗口
- javascript - 将 websocket 事件转换为 observables
- stm32 - 启用流后 DMA_SxNDTR 将自身设置为最大值 (65535)
- java - AndroidX jetifier:无法使用转换 JetifyTransform 转换文件“android-all-9-robolectric-4913185-2.jar”以匹配属性
- mysql - 无法在 cPanel 上的“实时”mySQL 数据库上更新/插入或删除