资源加载中... loading...

调用智能合约方法

以下内容是一些智能合约方法的调用例子。 - decimals

  ```decimals```方法没有参数,返回值为```token```的精度数据。  
  
  ```javascript
  function main(){
      var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"    // 代币的合约地址,例子中的代币为1INCH
      Log(exchange.IO("api", tokenAddress, "decimals"))                  // 查询,打印1INCH代币的精度指数为18
  }
  • allowance allowance方法是ERC20的一个constant的方法,不会产生gas消耗,可以查询某个token对于某个合约地址的授权额度。 allowance方法需要传2个参数,第一个参数为钱包地址,第二个参数为被授权的地址。返回值为token的授权额度。
  function main(){
      // 代币的合约地址,例子中的代币为1INCH
      var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"            
      var owner = ""
      var spender = ""
      
      // 例如查询得出1000000000000000000,除以该token的精度单位1e18,得出当前交易所对象绑定的钱包给spender地址授权了1个1INCH数量
      Log(exchange.IO("api", tokenAddress, "allowance", owner, spender))
  }
  ```spender```:被授权的合约地址,实际使用需要具体填写地址,例如可以是```Uniswap V3 router v1```地址。
- approve
  ```approve```方法是```ERC20```的一个非```constant```的方法,会产生```gas```消耗,用来给某个合约地址授权```token```的操作额度。
  ```approve```方法需要传2个参数,第一个参数为被授权的地址,第二个参数为授权的额度。返回值为```txid```。
  
  ```javascript
  function main(){
      // 代币的合约地址,例子中的代币为1INCH
      var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302"
      var spender = ""
      var amount = "0xde0b6b3a7640000"
      
      // 授权量的十六进制字符串: 0xde0b6b3a7640000 , 对应的十进制字符串: 1e18 , 1e18除以该token的精度单位,即1个代币数量 , 所以这里指授权一个代币
      Log(exchange.IO("api", tokenAddress, "approve", spender, amount))
  }
  ```amount```:授权数量,这里使用的是十六进制字符串表示。对应的十进制数值为```1e18```,除以例子中的```token```精度单位(即1e18),得出授权了1个```token```。  
  
  ```exchange.IO()```函数的第三个参数传入方法名```approve```,也可以写```methodId```的形式,例如:"0x571ac8b0"。也可以写完整标准方法名,例如:"approve(address,uint256)"。
- multicall
  ```multicall```方法是```Uniswap V3```的一个非constant的方法,会产生```gas```消耗,用来多路兑换代币。
  ```multicall```方法可能有多种传参方式,具体可以查询包含该方法的ABI,调用该方法之前需要先注册ABI。返回值为```txid```。
  
  具体的```multicall```方法调用例子,可以参考平台公开的[「Uniswap V3 交易类库」模板](https://www.fmz.com/strategy/397260)
  
  ```javascript
  function main() {
      var ABI_Route = ""
      var contractV3SwapRouterV2 = ""
      var value = 0
      var deadline = (new Date().getTime() / 1000) + 3600
      var data = ""
      exchange.IO("abi", contractV3SwapRouterV2, ABI_Route)
      exchange.IO("api", contractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data)
  }
  ```contractV3SwapRouterV2```:Uniswap V3的router v2地址,实际使用需要具体填写地址。
  ```value```:转账的ETH数量,如果兑换操作的```tokenIn```代币不是ETH则设置为0,需要根据实际情况填写。
  ```deadline```:可以设置为```(new Date().getTime() / 1000) + 3600```,表示一小时内有效。
  ```data```:需要执行的打包操作数据,需要根据实际情况填写。

  也可以指定方法调用的```gasLimit/gasPrice/nonce```设置:
  
  ```javascript
  exchange.IO("api", contractV3SwapRouterV2, "multicall(uint256,bytes[])", value, deadline, data, {gasPrice: 5000000000, gasLimit: 21000})

可以根据具体需求设置{gasPrice: 5000000000, gasLimit: 21000, nonce: 100}参数,该参数设置在exchange.IO()函数的最后一个参数上。 可以省略其中的nonce使用系统默认的值,或者不设置gasLimit/gasPrice/nonce,全部使用系统默认值。

需要注意例子中的multicall(uint256,bytes[])方法的stateMutability属性是payable,是需要传value这个参数的。 stateMutability":"payable"属性可以从ABI中查看,exchange.IO()函数会根据已经注册的ABI中的stateMutability属性判断所需要的参数, 如果stateMutability属性是nonpayable则不需要传value参数。

支持切换私钥 其它功能调用