发布Web3地址的编码数组

问题描述

我正试图像这样称呼Uniswap Router合同:

// 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',{
          name: 'path',type: 'address[]',{
          name: 'to',type: 'address',{
          name: 'deadline',],[
      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)

完整来源:https://github.com/ZaneH/tradr/blob/56d670aeec09ed0e8c3e359c48ae8b36fdea7c30/packages/backend/src/modules/Trades.ts#L37

解决方法

我相信web3.eth.abi.encodeFunctionCall需要使用JSON类型的参数,例如address[]表示为简单的字符串数组["0x...","0x..."]

// the problem
web3.eth.abi.encodeParameter('address[]',[
  '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2','0x20fe562d797a42dcb3399062ae9546cd06f63280',]),

而不是请尝试:

[
  "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2","0x20fe562d797a42dcb3399062ae9546cd06f63280"
],

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...