exchange.IO(“encode”, …)


```exchange.IO("encode", ...)```函数返回编码后的数据字符串。
string

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

```k```参数用于设置```exchange.IO()```函数的功能模式,设置为```"encode"```时表示该函数执行数据编码操作。
k
true
string
```address```参数用于指定智能合约地址。当调用```exchange.IO("encode", ...)```函数时,如果传入```address```参数,则表示对智能合约方法调用进行编码;如果未传入```address```参数,则该函数用于按指定类型顺序进行编码,功能等同于```Solidity```中的```abi.encode```。
address
false
string
```dataFormat```参数用于指定编码数据的方法名称、数据类型及参数顺序。
dataFormat
true
string
```arg```参数用于指定与```dataFormat```参数相匹配的具体数据值。

```arg```参数可能有多个,其类型和数量根据```dataFormat```参数的设置而定。
arg
false
string / number / tuple / array / any (平台支持的任意类型)

```javascript
function main() {
    // ContractV3SwapRouterV2 主网地址 : 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45
    // 调用unwrapWETH9方法需要先注册ABI,此处省略注册
    // "owner"代表钱包地址,需要具体填写,1代表解包装数量,把一个WETH解包装为ETH
    var data = exchange.IO("encode", "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45", "unwrapWETH9(uint256,address)", 1, "owner")
    Log(data)
}```
以编码```unwrapWETH9```方法调用为例:
```javascript
function main() {
    var x = 10
    var address = "0x02a5fBb259d20A3Ad2Fdf9CCADeF86F6C1c1Ccc9"
    var str = "Hello World"
    var array = [1, 2, 3]
    var ret = exchange.IO("encode", "uint256,address,string,uint256[]", x, address, str, array)   // uint 即 uint256 , FMZ上需要指定类型长度
    Log("ret:", ret)
    /*
    000000000000000000000000000000000000000000000000000000000000000a    // x
    00000000000000000000000002a5fbb259d20a3ad2fdf9ccadef86f6c1c1ccc9    // address
    0000000000000000000000000000000000000000000000000000000000000080    // str 的偏移
    00000000000000000000000000000000000000000000000000000000000000c0    // array 的偏移
    000000000000000000000000000000000000000000000000000000000000000b    // str 的长度
    48656c6c6f20576f726c64000000000000000000000000000000000000000000    // str 数据
    0000000000000000000000000000000000000000000000000000000000000003    // array 的长度
    0000000000000000000000000000000000000000000000000000000000000001    // array 第一个数据
    0000000000000000000000000000000000000000000000000000000000000002    // array 第二个数据
    0000000000000000000000000000000000000000000000000000000000000003    // array 第三个数据
    */
}```
等同于```Solidity```中```abi.encode```的编码示例:
```javascript
function main() {
    var types = "tuple(a uint256,b uint8,c address),bytes"
    var ret = exchange.IO("encode", types, {
        a: 30,
        b: 20,
        c: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
    }, "0011")
    Log("encode: ", ret)
}```
支持对元组(tuple)或包含元组的类型顺序进行编码。此类型顺序由```tuple```、```bytes```组成,因此在调用```exchange.IO()```进行encode时需要传入两个对应参数:
- 1、对应tuple类型的变量:

{ a: 30, b: 20, c: “0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2” }

  传入的参数必须与```tuple```的结构、类型保持一致,如同```types```参数中定义的形式:```tuple(a uint256,b uint8,c address)```。
- 2、对应```bytes```类型的变量:

“0011” javascript function main() { var path = [“0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2”, “0xdac17f958d2ee523a2206206994597c13d831ec7”] // ETH address, USDT address var ret = exchange.IO(“encode”, “address[]”, path) Log(“encode: “, ret) }”` 支持对数组或包含数组的类型顺序进行编码:

exchange.IO()函数封装了encode方法,可以将函数调用编码并返回为hex字符串格式。具体使用方法可参考平台公开的「Uniswap V3 交易类库」模板。 对智能合约方法调用进行编码时,需要先注册相应的ABI。