exchange.IO("api", ...)
exchange.IO("api", ...)函数用于调用智能合约的方法。
exchange.IO(k, address, method)
exchange.IO(k, address, method, ...args)
exchange.IO(k, address, method, value, ...args)示例
-
decimals方法是ERC20的一个constant方法,不会产生gas消耗,可以查询某个token的精度数据。decimals方法无需参数。返回值:token的精度数据。javascriptfunction main(){ var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302" // 代币的合约地址,例子中的代币为1INCH Log(exchange.IO("api", tokenAddress, "decimals")) // 查询,打印1INCH代币的精度指数为18 } -
allowance方法是ERC20的一个constant方法,不会产生gas消耗,可以查询某个token对于某个合约地址的授权额度。allowance方法需要传入2个参数,第一个参数为钱包地址,第二个参数为被授权的地址。返回值:token的授权额度。owner:钱包地址,例子中以字符串"owner"代替,实际使用需要具体填写地址。spender:被授权的合约地址,例子中以字符串"spender"代替,实际使用需要具体填写地址,例如可以是Uniswap V3 router v1地址。javascriptfunction main(){ // 代币的合约地址,例子中的代币为1INCH var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302" // 例如查询得出1000000000000000000,除以该token的精度单位1e18,得出当前交易所对象绑定的钱包给spender地址授权了1个1INCH数量 Log(exchange.IO("api", tokenAddress, "allowance", "owner", "spender")) } -
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)"。javascriptfunction main(){ // 代币的合约地址,例子中的代币为1INCH var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302" // 授权量的十六进制字符串: 0xde0b6b3a7640000 , 对应的十进制字符串: 1e18 , 1e18除以该token的精度单位,即1个代币数量 , 所以这里指授权一个代币 Log(exchange.IO("api", tokenAddress, "approve", "spender", "0xde0b6b3a7640000")) } -
multicall方法是Uniswap V3的一个非constant方法,会产生gas消耗,用于多路兑换代币。multicall方法可能有多种传参方式,具体可以查询包含该方法的ABI,调用该方法之前需要先注册ABI。返回值:txid。具体的
multicall方法调用示例,可以参考平台公开的「Uniswap V3 交易类库」模板这里使用伪代码来描述一些细节:
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,全部使用系统默认值。javascriptfunction 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 || {}) }
返回值
| 类型 | 描述 |
string / number / bool / object / array / any (平台支持的任意类型) |
|
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 |
|
address | string | 是 |
|
method | string | 是 |
|
value | number / string | 否 |
|
arg | string / number / bool / any (平台支持的任意类型) | 否 |
|