exchange.IO(“decode”, …)

exchange.IO("decode", ...)函数用于数据解码操作。

exchange.IO("decode", ...)函数返回解码后的数据。当dataFormat参数指定的数据结构只包含单个字段时,返回字符串类型;当包含多个字段时,返回数组类型。 array / string

exchange.IO(k, dataFormat, data)

k参数用于设置exchange.IO()函数的功能模式,设置为"decode"时表示执行数据解码操作。 k true string dataFormat参数用于指定待解码数据的格式类型和字段顺序。 dataFormat true string data参数用于传入需要解码的原始数据。 data true string

”`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)

var rawData = exchange.IO("decode", types, ret)
Log("decode:", rawData)

} exchange.IO(“encode”, …)函数的逆向操作示例: 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", "tuple(path bytes,recipient address,amountOut uint256,amountInMaximum uint256)", rawData.slice(8))
Log("decodeRaw:", decodeRaw)

} 以下示例首先对path参数执行encodePacked操作,因为后续需要编码的exactOutput方法调用需要path作为参数。然后对路由合约的exactOutput方法进行编码,该方法只有一个参数,参数类型为tuple类型。exactOutput方法名编码后的结果为:0x09b81346,使用exchange.IO(“decode”, …)方法解码得到decodeRaw,其结果与变量dataTuple”`保持一致。

exchange.IO()函数支持数据的双向处理,既可以进行编码(encode)操作,也可以进行解码(decode)操作。