exchange.IO(“api”, …)


```exchange.IO("api", ...)```函数返回所调用的智能合约方法的返回值。
string / number / bool / object / array / any (平台支持的任意类型)

exchange.IO(k, address, method)
exchange.IO(k, address, method, ...args)
exchange.IO(k, address, method, value, ...args)

```k```参数用于设置```exchange.IO()```函数的功能,设置为```"api"```表示该函数用于扩展API调用请求。
k
true
string
```address```参数用于指定智能合约的地址。
address
true
string
```method```参数用于指定要调用的智能合约方法。
method
true
string
```value```参数用于设置发送的ETH数量。当要执行的智能合约方法的```stateMutability```属性为```payable```时,需要传入```value```参数。```"stateMutability":"payable"```属性可以从ABI中查看,```exchange.IO()```函数会根据已注册的ABI中的```stateMutability```属性判断所需参数,如果```stateMutability```属性为```nonpayable```则无需传入```value```参数。
value
false
number / string
```arg```参数用于指定要调用的智能合约方法的参数。

```arg```参数可能有多个,```arg```参数的类型与个数根据要调用的智能合约方法而定。
arg
false
string / number / bool / any (平台支持的任意类型)

```javascript
function main(){
    var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"    // 代币的合约地址,例子中的代币为1INCH
    Log(exchange.IO("api", tokenAddress, "decimals"))                  // 查询,打印1INCH代币的精度指数为18
}```
```decimals```方法是ERC20的一个```constant```方法,不会产生gas消耗,可以查询某个token的精度数据。

```decimals```方法无需参数。返回值:token的精度数据。
```javascript
function main(){
    // 代币的合约地址,例子中的代币为1INCH
    var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"

    // 例如查询得出1000000000000000000,除以该token的精度单位1e18,得出当前交易所对象绑定的钱包给spender地址授权了1个1INCH数量
    Log(exchange.IO("api", tokenAddress, "allowance", "owner", "spender"))
}```
```allowance```方法是ERC20的一个```constant```方法,不会产生gas消耗,可以查询某个token对于某个合约地址的授权额度。

```allowance```方法需要传入2个参数,第一个参数为钱包地址,第二个参数为被授权的地址。返回值:token的授权额度。

```owner```:钱包地址,例子中以字符串"owner"代替,实际使用需要具体填写地址。

```spender```:被授权的合约地址,例子中以字符串"spender"代替,实际使用需要具体填写地址,例如可以是```Uniswap V3 router v1```地址。
```javascript
function main(){
    // 代币的合约地址,例子中的代币为1INCH
    var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"

    // 授权量的十六进制字符串: 0xde0b6b3a7640000 , 对应的十进制字符串: 1e18 , 1e18除以该token的精度单位,即1个代币数量 , 所以这里指授权一个代币
    Log(exchange.IO("api", tokenAddress, "approve", "spender", "0xde0b6b3a7640000"))
}```
```approve```方法是ERC20的一个非```constant```方法,会产生gas消耗,用于给某个合约地址授权token的操作额度。

```approve```方法需要传入2个参数,第一个参数为被授权的地址,第二个参数为授权的额度。返回值:txid。

```spender```:被授权的合约地址,例子中以字符串"spender"代替,实际使用需要具体填写地址,例如可以是```Uniswap V3 router v1```地址。

```0xde0b6b3a7640000```:授权数量,这里使用十六进制字符串表示,对应的十进制数值为1e18,除以例子中的token精度单位(即1e18),得出授权了1个token。

```exchange.IO()```函数的第三个参数传入方法名```approve```,也可以写methodId的形式,例如:"0x571ac8b0"。也可以写完整标准方法名,例如:"approve(address,uint256)"。
```javascript
function main() {
    var ContractV3SwapRouterV2 = "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"
    var tokenInName = "ETH"
    var amountIn = 0.01
    var options = {gasPrice: 5000000000, gasLimit: 21000, nonce: 100}   // 此处为举例,具体要根据实际场景设置
    var data = ""                                                       // 编码后的数据,此处为空字符串,具体要根据实际场景设置
    var tx = exchange.IO("api", ContractV3SwapRouterV2, "multicall(uint256,bytes[])", (tokenInName == 'ETH' ? amountIn : 0), (new Date().getTime() / 1000) + 3600, data, options || {})
}```
```multicall```方法是```Uniswap V3```的一个非```constant```方法,会产生gas消耗,用于多路兑换代币。

```multicall```方法可能有多种传参方式,具体可以查询包含该方法的ABI,调用该方法之前需要先注册ABI。返回值:txid。

具体的```multicall```方法调用示例,可以参考平台公开的[「Uniswap V3 交易类库」模板](https://www.fmz.com/strategy/397260)

这里使用伪代码来描述一些细节:

exchange.IO(“api”, ContractV3SwapRouterV2, “multicall(uint256,bytes[])”, value, deadline, data)


```ContractV3SwapRouterV2```:Uniswap V3的router v2地址。

```value```:转账的ETH数量,如果兑换操作的tokenIn代币不是ETH,则设置为0。

```deadline```:```deadline```是```multicall```方法的参数,可以设置为(new Date().getTime() / 1000) + 3600,表示一小时内有效。

```data```:```data```是```multicall```方法的参数,需要执行的打包操作数据。与```exchange.IO("api", "eth", "send", "toAddress", toAmount)```类似,在调用```multicall```方法时也可以指定方法调用的```gasLimit/gasPrice/nonce```设置,同样使用伪代码来描述:

exchange.IO(“api”, ContractV3SwapRouterV2, “multicall(uint256,bytes[])”, value, deadline, data, {gasPrice: 123456, gasLimit: 21000}) “`

可以根据具体需求设置{gasPrice: 11, gasLimit: 111, nonce: 111}参数,该参数设置在exchange.IO()函数的最后一个参数上。

可以省略其中的nonce使用系统默认值,或者不设置gasLimit/gasPrice/nonce,全部使用系统默认值。