输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
预测市场
证券与期货
链上与自定义接入

对数据进行ABI编码。

exchange.IO(k, dataFormat, ...args)
exchange.IO(k, address, dataFormat)
exchange.IO(k, address, dataFormat, ...args)

示例

  • 以编码unwrapWETH9方法的调用为例。

    javascript
    function main() { // ContractV3SwapRouterV2 主网地址 : 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 // unwrapWETH9不是ERC20方法,需要先注册ABI,这里使用内置模板uniswapV3SwapRouter02 var router = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45" exchange.IO("abi", router, "uniswapV3SwapRouter02") // 1为amountMinimum,即最少解包装数量,单位为wei(不是1个WETH):路由合约把自己持有的 // 全部WETH解包装为ETH转给接收地址(这里为当前钱包),数量少于amountMinimum时交易失败 var data = exchange.IO("encode", router, "unwrapWETH9(uint256,address)", 1, exchange.IO("address")) Log(data) // 输出:49404b7c开头的调用数据(不带0x) }
  • 等同于Solidity中abi.encode的编码示例。

    javascript
    function main() { var x = 10 var address = "0x02a5fBb259d20A3Ad2Fdf9CCADeF86F6C1c1Ccc9" var str = "Hello World" var array = [1, 2, 3] // uint 等同于 uint256,也可以直接写 uint var ret = exchange.IO("encode", "uint256,address,string,uint256[]", x, address, str, array) Log("ret:", ret) // 输出:ret 为以下各32字节字段依次拼接而成的十六进制字符串 // 000000000000000000000000000000000000000000000000000000000000000a x // 00000000000000000000000002a5fbb259d20a3ad2fdf9ccadef86f6c1c1ccc9 address // 0000000000000000000000000000000000000000000000000000000000000080 str 的偏移量 // 00000000000000000000000000000000000000000000000000000000000000c0 array 的偏移量 // 000000000000000000000000000000000000000000000000000000000000000b str 的长度 // 48656c6c6f20576f726c64000000000000000000000000000000000000000000 str 的数据 // 0000000000000000000000000000000000000000000000000000000000000003 array 的长度 // 0000000000000000000000000000000000000000000000000000000000000001 array 的第一个元素 // 0000000000000000000000000000000000000000000000000000000000000002 array 的第二个元素 // 0000000000000000000000000000000000000000000000000000000000000003 array 的第三个元素 }
  • 支持对元组(tuple)或包含元组的类型序列进行编码。本例的类型序列由tuple和bytes组成,因此调用exchange.IO()进行encode时需要再传入两个参数:

    • 1、对应tuple类型的变量:
      json
      [30, 20, "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"]
      元组的值以数组形式按位置传入,其元素个数、顺序和类型都必须与types参数中的(uint256,uint8,address)一致。字面元组没有字段名,解码时各字段按位置依次命名为Field1、Field2……
    • 2、对应bytes类型的变量:
      json
      "0011"
    javascript
    function main() { var types = "(uint256,uint8,address),bytes" var ret = exchange.IO("encode", types, [30, 20, "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"], "0011") Log("encode: ", ret) }
  • 支持对数组或包含数组的类型序列进行编码。

    javascript
    function main() { var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"] // ETH address, USDT address var ret = exchange.IO("encode", "address[]", path) Log("encode: ", ret) }

返回值

类型描述

string

编码后的数据。

参数

名称类型必填描述

k

string

是

固定为encode,表示进行数据编码。

address

string

否

智能合约地址。调用exchange.IO("encode", ...)函数时,传入address参数表示对智能合约上的方法调用进行编码(encode);未传入address参数时,该函数按指定的类型序列对数据进行编码,功能等同于Solidity中的abi.encode。

dataFormat

string

是

待编码数据的方法、类型及顺序。

arg

string / number / array / any

否

与dataFormat参数相匹配的具体数据值。
arg参数可以有多个,其类型与个数由dataFormat参数决定。元组(tuple)以数组形式传入。

参考

备注

exchange.IO()函数封装了encode方法,可将函数调用编码后以hex字符串格式返回。在Uniswap、PancakeSwap上兑换时,可直接使用Uniswap、PancakeSwap交易所对象,无需自行编码调用。

对智能合约上的方法调用进行编码时,方法可以写为方法名、完整的方法签名或方法选择器;标准ERC20方法已内置,其他方法需要先注册对应的ABI。

返回不带0x前缀的十六进制字符串。bytesN类型的值可以传入十六进制字符串(0x前缀可选)或字节数值数组;address类型可以传入以T开头的波场(TRON)地址。

exchange.IO("pack", ...)是exchange.IO("encode", ...)的别名。