exchange.IO("encode", ...)
对数据进行ABI编码。
exchange.IO(k, dataFormat, ...args)
exchange.IO(k, address, dataFormat)
exchange.IO(k, address, dataFormat, ...args)示例
-
以编码
unwrapWETH9方法的调用为例。javascriptfunction 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的编码示例。javascriptfunction 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"
javascriptfunction main() { var types = "(uint256,uint8,address),bytes" var ret = exchange.IO("encode", types, [30, 20, "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"], "0011") Log("encode: ", ret) } - 1、对应tuple类型的变量:
-
支持对数组或包含数组的类型序列进行编码。
javascriptfunction main() { var path = ["0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "0xdac17f958d2ee523a2206206994597c13d831ec7"] // ETH address, USDT address var ret = exchange.IO("encode", "address[]", path) Log("encode: ", ret) }
返回值
| 类型 | 描述 |
string | 编码后的数据。 |
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
address | string | 否 | 智能合约地址。调用 |
dataFormat | string | 是 | 待编码数据的方法、类型及顺序。 |
arg | string / number / array / any | 否 | 与 |
参考
Web3 exchange.IO exchange.IO("decode") exchange.IO("encodePacked") exchange.IO("abi") exchange.IO("call")
备注
exchange.IO()函数封装了encode方法,可将函数调用编码后以hex字符串格式返回。在Uniswap、PancakeSwap上兑换时,可直接使用Uniswap、PancakeSwap交易所对象,无需自行编码调用。
对智能合约上的方法调用进行编码时,方法可以写为方法名、完整的方法签名或方法选择器;标准ERC20方法已内置,其他方法需要先注册对应的ABI。
返回不带0x前缀的十六进制字符串。bytesN类型的值可以传入十六进制字符串(0x前缀可选)或字节数值数组;address类型可以传入以T开头的波场(TRON)地址。
exchange.IO("pack", ...)是exchange.IO("encode", ...)的别名。