调用智能合约方法
以下内容是一些智能合约方法的调用示例。
-
decimals
decimals方法是ERC20的一个constant方法(在FMZ量化策略代码中调用标准ERC20方法时无需注册ABI),不会产生gas消耗,可以查询某个token的精度数据。
decimals方法没有参数,返回值为token的精度数据。javascriptfunction main(){ var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302" // 代币的合约地址,例子中的代币为1INCH Log(exchange.IO("api", tokenAddress, "decimals")) // 查询,打印1INCH代币的精度指数为18 } -
allowance
allowance方法是ERC20的一个constant方法,不会产生gas消耗,可以查询某个token对某个合约地址的授权额度。
allowance方法需要传入2个参数,第一个参数为钱包地址,第二个参数为被授权的地址。返回值为token的授权额度。javascriptfunction main(){ // 代币的合约地址,例子中的代币为1INCH var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302" var owner = "" var spender = "" // 例如查询得出1000000000000000000,除以该token的精度单位1e18,得出当前交易所对象绑定的钱包给spender地址授权了1个1INCH数量 Log(exchange.IO("api", tokenAddress, "allowance", owner, spender)) }owner:钱包地址,实际使用时需要填写具体地址。
spender:被授权的合约地址,实际使用时需要填写具体地址,例如可以是Uniswap V3 router v1地址。 -
approve
approve方法是ERC20的一个非constant方法,会产生gas消耗,用于给某个合约地址授权token的操作额度。
approve方法需要传入2个参数,第一个参数为被授权的地址,第二个参数为授权的额度。返回值为txid。javascriptfunction main(){ // 代币的合约地址,例子中的代币为1INCH var tokenAddress = "0x111111111117dC0aa78b770fA6A738034120C302" var spender = "" var amount = "0xde0b6b3a7640000" // 授权量的十六进制字符串: 0xde0b6b3a7640000 , 对应的十进制字符串: 1e18 , 1e18除以该token的精度单位,即1个代币数量 , 所以这里指授权一个代币 Log(exchange.IO("api", tokenAddress, "approve", spender, amount)) }spender:被授权的合约地址,实际使用时需要填写具体地址,例如可以是Uniswap V3 router v1地址。
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 交易类库」模板javascriptfunction 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) }ABI_Route:Uniswap V3的router v2合约的ABI,需要根据实际情况填写。
contractV3SwapRouterV2:Uniswap V3的router v2地址,实际使用时需要填写具体地址。
value:转账的ETH数量,如果兑换操作的tokenIn代币不是ETH则设置为0,需要根据实际情况填写。
deadline:可以设置为(new Date().getTime() / 1000) + 3600,表示一小时内有效。
data:需要执行的打包操作数据,需要根据实际情况填写。也可以指定方法调用的
gasLimit/gasPrice/nonce设置:javascriptexchange.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参数。