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

解码。

exchange.IO(k, dataFormat, data)

示例

  • exchange.IO("encode", ...)函数的反向操作。

    javascript
    function main() { // 元组写在圆括号里,字段按位置排列;这里是一个三字段元组,外加一个bytes参数 var types = "(uint256,uint8,address),bytes" // 元组的值按位置传数组 var ret = exchange.IO("encode", types, [30, 20, "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"], "0011") Log("encode: ", ret) // 字面元组没有字段名,按位置编号为Field1、Field2……要用有意义的字段名, // 需要先用exchange.IO("abi", ...)注册合约ABI,参考下一个例子 var rawData = exchange.IO("decode", types, ret) Log("decode:", rawData) // 输出:decode: [{"Field1":"30","Field2":20,"Field3":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"}, "0011"] }
  • 以下例子首先在path参数处理时进行了encodePacked操作,因为之后需要编码的exactOutput方法调用需要path作为参数。然后encode路由合约的exactOutput方法,该方法只有一个参数,参数类型是tuple类型。exactOutput这个方法名编码后即:0x09b81346,使用exchange.IO("decode", ...)方法按(bytes,address,uint256,uint256)解码得出decodeRaw,其字段按位置编号为Field1~Field4,值与变量dataTuple依次对应。

    javascript
    function main() { // register SwapRouter02 abi var walletAddress = "0x398a93ca23CBdd2642a07445bCD2b8435e0a373f" var routerAddress = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45" var abi = `[{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct IV3SwapRouter.ExactOutputParams","name":"params","type":"tuple"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"}]` exchange.IO("abi", routerAddress, abi) // abi只使用了局部的exactOutput方法的内容,完整的abi可以在网上搜索 // encode path var fee = exchange.IO("encodePacked", "uint24", 3000) var tokenInAddress = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" var tokenOutAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7" var path = tokenInAddress.slice(2).toLowerCase() path += fee + tokenOutAddress.slice(2).toLowerCase() Log("path:", path) var dataTuple = { "path" : path, "recipient" : walletAddress, "amountOut" : 1000, "amountInMaximum" : 1, } // encode SwapRouter02 exactOutput var rawData = exchange.IO("encode", routerAddress, "exactOutput", dataTuple) Log("method hash:", rawData.slice(0, 8)) // 输出:09b81346 Log("params hash:", rawData.slice(8)) // decode exactOutput params var decodeRaw = exchange.IO("decode", "(bytes,address,uint256,uint256)", rawData.slice(8)) Log("decodeRaw:", decodeRaw) }

返回值

类型描述

string / number / bool / object / array

dataFormat只有一个类型时直接返回解码后的值,有多个类型时返回数组。整数中uint64、int64及以下位宽为数字,更大位宽为十进制字符串(JavaScript、Python中绝对值不小于2^53的整数也返回十进制字符串,避免丢失精度);address为0x开头的小写地址(波场上同样返回0x格式);bytes为不带0x的十六进制字符串;bytes32等定长bytesN为字节数值数组;字面元组为以Field1、Field2……为键的对象。

参数

名称类型必填描述

k

string

是

固定为decode,用于数据解码。

dataFormat

string

是

解码数据的类型、顺序。

data

string

是

要解码的数据,十六进制字符串,0x前缀可选。

参考

备注

对于数据的处理,exchange.IO()函数不仅支持编码(encode),也支持解码(decode)。

exchange.IO("unpack", ...)是exchange.IO("decode", ...)的别名。