具体使用可以参考平台公开的[「Uniswap V3 交易类库」模板](https://www.fmz.com/strategy/397260)。
这里使用编码```unwrapWETH9```方法的调用为例子:
function main() { // ContractV3SwapRouterV2 主网地址 : 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 // 调用unwrapWETH9方法需要先注册ABI,此处省略注册 // “owner”代表钱包地址,需要具体填写,1代表解包装数量,把一个WETH解包装为ETH var data = exchange.IO(“encode”, “0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45”, “unwrapWETH9(uint256,address)”, 1, “owner”) Log(data) }
在调用```exchange.IO("encode", ...)```函数时,如果第二个参数(字符串类型)为```0x```开头,表示编码(encode)智能合约上的方法调用。
如果不是以```0x```开头则用于编码指定的类型顺序,功能等同```solidity```里的```abi.encode```,参考以下例子。
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 第三个数据 */ }
支持对元组(tuple)或者包含元组的类型顺序编码:
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```、```bytes```组成,所以在调用```exchange.IO()```函数进行```encode```时需要继续传入两个参数:
- 对应tuple类型的变量:
{ a: 30, b: 20, c: “0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2” }
传入的参数也必须和```tuple```的结构、类型保持一致,如同```types```参数中定义的形式:```tuple(a uint256,b uint8,c address)```。
- 对应bytes类型的变量:
“0011”
支持对数组或者包含数组的类型顺序编码:
function main() { var path = [“0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2”, “0xdac17f958d2ee523a2206206994597c13d831ec7”] // ETH address, USDT address var ret = exchange.IO(“encode”, “address[]”, path) Log(“encode: “, ret) } “`
调用以太坊RPC方法 支持encodePacked