输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
预测市场
证券与期货
链上与自定义接入

调用以太坊RPC方法(需要Web3交易所对象配置时选择eth)。
exchange.IO("api", "tron", ...)函数的调用方式,用于调用波场RPC方法(需要Web3交易所对象配置时选择tron)。

exchange.IO(k, blockChain, rpcMethod)
exchange.IO(k, blockChain, rpcMethod, ...args)

示例

  • 查询钱包中ETH的余额。

    javascript
    // 链上整数数量 -> 可读数量。decimals为代币精度,ETH是18,USDT/USDC是6。 // 十进制串、0x串都收:eth_getBalance等RPC方法返回的就是0x串。 function toAmount(raw, decimals) { var t = String(raw).trim() if (t.slice(0, 2).toLowerCase() == "0x") t = BigInt(t).toString() var d = Number(decimals) || 0 if (d == 0) return Number(t) var s = t.length > d ? t : new Array(d - t.length + 2).join("0") + t var frac = s.slice(s.length - d).replace(/0+$/, "") return Number(s.slice(0, s.length - d) + (frac ? "." + frac : "")) } function main() { // "owner" 需要替换为具体钱包地址 // "latest"字符串位置的参数标签:'latest'、'earliest'或'pending', // 参考https://eth.wiki/json-rpc/API#the-default-block-parameter // 返回值 ethBalance 为十六进制字符串:0x9b19ce56113070 var ethBalance = exchange.IO("api", "eth", "eth_getBalance", "owner", "latest") // ETH的精度单位为1e18 var ethDecimal = 18 // 链上数量都是整数,换算成可读数量要按精度移小数点。小数点按字符串移动,只有最后 Number() 转成数字时 // 可能有末位舍入:0x9b19ce56113070(43656995388076144)打印为0.043656995388076145,精确值是0.043656995388076144。 // 需要精确结果时用 exchange.IO("fromUnits", ethBalance, 18),返回十进制字符串 Log(toAmount(ethBalance, ethDecimal)) }
  • ETH转账,可以根据具体需求设置{gasPrice: 11, gasLimit: 111, nonce: 111}参数,该参数设置在exchange.IO()函数的最后一个参数上。不需要的选项可以省略。注意普通转账不设置gasPrice时按固定的100 Gwei出价、gasLimit默认为21000,建议先用eth_gasPrice查询gas价格后传入。

    该参数还支持data和dryRun:data为任意调用数据(0x开头的十六进制字符串),用于直接发送聚合器、Pendle等API返回的交易{to, data, value},设置data时gas价格和gasLimit按合约调用的方式由节点估算;dryRun设置为true时只签名不广播,返回包含hash、raw(签名后的交易)、nonce、gasLimit等字段的对象,可用于检查交易内容或交给其它渠道发送。例如:exchange.IO("api", "eth", "send", router, value, {data: calldata, dryRun: true})。发送前可以先用exchange.IO("call", router, calldata, {value: value})预演。不设置nonce时自动分配并与链上同步,连续发送不会重复使用nonce,参看exchange.IO("nonce", ...);交易长时间未上链可以用exchange.IO("speedUp", ...)加价重发或用exchange.IO("cancelTx", ...)取消。

    javascript
    // 可读数量 -> 链上整数数量(字符串)。全程按字符串移小数点,不经过浮点数, // 超过2^53的数量也不会丢位。要表示17位以上有效数字时,amount请传字符串。 function toInnerAmount(amount, decimals) { var t = String(amount), d = Number(decimals) || 0 var m = /^([0-9]*)(?:\.([0-9]*))?[eE]([+-]?[0-9]+)$/.exec(t) if (m) { // 摊平科学计数法:0.0000001 会被JavaScript写成 1e-7 var digits = (m[1] || "") + (m[2] || ""), point = (m[1] || "").length + parseInt(m[3], 10) t = point <= 0 ? "0." + new Array(1 - point).join("0") + digits : point >= digits.length ? digits + new Array(point - digits.length + 1).join("0") : digits.slice(0, point) + "." + digits.slice(point) } var dot = t.indexOf("."), int = dot < 0 ? t : t.slice(0, dot) var frac = dot < 0 ? "" : t.slice(dot + 1) frac = frac.slice(0, d) // 超出精度的小数位直接截掉 while (frac.length < d) frac += "0" return (int + frac).replace(/^0+(?=[0-9])/, "") } function main() { // ETH的精度单位为1e18 var ethDecimal = 18 // 转账数量,可读的数量例如:0.01个ETH var sendAmount = 0.01 // 转换为链上处理的数据:0.01 -> "10000000000000000" var amount = toInnerAmount(sendAmount, ethDecimal) // "toAddress"为转账时接收方的ETH钱包地址,需要具体填写,amount为转账数量 exchange.IO("api", "eth", "send", "toAddress", amount) }
  • 查询gasPrice。

    javascript
    // toAmount函数可以把hex编码的数值转换为十进制数值,decimals传0表示不移小数点 function toAmount(raw, decimals) { var t = String(raw).trim() if (t.slice(0, 2).toLowerCase() == "0x") t = BigInt(t).toString() var d = Number(decimals) || 0 if (d == 0) return Number(t) var s = t.length > d ? t : new Array(d - t.length + 2).join("0") + t var frac = s.slice(s.length - d).replace(/0+$/, "") return Number(s.slice(0, s.length - d) + (frac ? "." + frac : "")) } function main() { var gasPrice = exchange.IO("api", "eth", "eth_gasPrice") Log("gasPrice:", toAmount(gasPrice, 0)) // 输出:gasPrice: 5000000000(单位wei,即5 gwei) Log("gasPrice:", toAmount(gasPrice, 9), "gwei") // gwei的精度单位为1e9 }
  • 查询eth_estimateGas。

    javascript
    // toAmount函数可以把hex编码的数值转换为十进制数值 function toAmount(raw, decimals) { var t = String(raw).trim() if (t.slice(0, 2).toLowerCase() == "0x") t = BigInt(t).toString() var d = Number(decimals) || 0 if (d == 0) return Number(t) var s = t.length > d ? t : new Array(d - t.length + 2).join("0") + t var frac = s.slice(s.length - d).replace(/0+$/, "") return Number(s.slice(0, s.length - d) + (frac ? "." + frac : "")) } function main() { // 编码approve(授权)方法的调用 var data = exchange.IO("encode", "0x111111111117dC0aa78b770fA6A738034120C302", "approve", "0xe592427a0aece92de3edee1f18e0157c05861564", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") Log("data:", data) var gasPrice = exchange.IO("api", "eth", "eth_gasPrice") Log("gasPrice:", toAmount(gasPrice, 0)) var obj = { "from" : "0x0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // walletAddress "to" : "0x111111111117dC0aa78b770fA6A738034120C302", "gasPrice" : gasPrice, "value" : "0x0", "data" : "0x" + data, } var gasLimit = exchange.IO("api", "eth", "eth_estimateGas", obj) Log("gasLimit:", toAmount(gasLimit, 0)) // 手续费 = gasLimit * gasPrice,两个都是wei单位的大整数,用BigInt相乘避免丢精度, // 再按1e18换算成可读的ETH数量 Log("gas fee", toAmount((BigInt(gasLimit) * BigInt(gasPrice)).toString(), 18)) }

返回值

类型描述

string / number / bool / object / array / any

调用的RPC方法的返回值。

参数

名称类型必填描述

k

string

是

固定为api,用于扩展调用请求。

blockChain

string

是

区块链网络:eth表示调用以太坊网络的RPC方法;tron表示调用波场的RPC方法。

rpcMethod

string

是

exchange.IO()函数调用的RPC方法。

arg

string / number / bool / object / array / any

否

要调用的RPC方法的参数。
arg参数可能有多个,arg参数的类型与个数根据rpcMethod参数指定的RPC方法而定。

参考

备注

exchange.IO()函数的第二个参数为eth时,可以直接调用以太坊节点服务器可用的RPC方法。

调用节点方法时原样返回节点给出的result。节点返回null时(例如交易还未上链时的eth_getTransactionReceipt)返回空值,不报错;节点返回错误时返回空值,GetLastError()中有错误信息,合约revert的原因会解码为可读文本。

exchange.IO("api", "eth", "send", toAddress, value[, options])从当前钱包转出原生币,value为链上整数(wei),返回交易哈希。不带data的普通转账发送传统(legacy)交易:不设置gasPrice时固定按100 Gwei(附加一个很小的随机值)出价,不设置gasLimit时为21000,在以太坊主网上通常偏高,建议先用eth_gasPrice查询后传入。设置data时按合约调用处理:gas上限由节点估算,gas价格与合约写方法相同(支持EIP-1559的链发送EIP-1559交易,参看exchange.IO("api", ...))。

波场(TRON)上第二个参数写tron,方法名不区分大小写,例如GetNowBlock、GetAccount、GetTransactionInfoByID、TRC20ContractBalance。send的参数为收款地址和TRX数量(单位sun,1 TRX = 1000000 sun),返回不带0x的交易ID。需要签名的方法(转账、触发合约等)会自动签名并广播。未内置的全节点接口可以直接传路径和请求体:exchange.IO("api", "tron", "/wallet/接口名", {请求体})。