exchange.IO("multicall", ...)
通过Multicall3合约在一次请求中批量读取多个合约调用的结果,适用于批量查询余额、流动池状态、报价等数据,可有效减少RPC请求次数。
exchange.IO(k, calls)
exchange.IO(k, calls, options)示例
一次请求同时读取钱包余额和Uniswap流动池状态。
javascript
function main() {
var USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
var WETH = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
var POOL = "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640" // Uniswap V3 USDC/WETH 0.05% 池
var owner = exchange.IO("address")
exchange.IO("abi", POOL, JSON.stringify([
{ type: "function", name: "slot0", stateMutability: "view", inputs: [], outputs: [
{ name: "sqrtPriceX96", type: "uint160" }, { name: "tick", type: "int24" },
{ name: "observationIndex", type: "uint16" }, { name: "observationCardinality",
type: "uint16" },
{ name: "observationCardinalityNext", type: "uint16" }, { name: "feeProtocol",
type: "uint8" },
{ name: "unlocked", type: "bool" }] },
{ type: "function", name: "liquidity", stateMutability: "view", inputs: [],
outputs: [{ type: "uint128" }] }
]))
// 每项写法与 exchange.IO("call", ...) 相同:[合约地址, 方法, ...参数],一次请求读完
var ret = exchange.IO("multicall", [
[USDC, "balanceOf", owner],
[WETH, "balanceOf", owner],
[POOL, "slot0"],
[POOL, "liquidity"]
])
Log("USDC余额:", ret[0], "WETH余额:", ret[1])
Log("池子 tick:", ret[2].tick, "流动性:", ret[3])
// 默认任何一项失败就整体返回 null;allowFailure 为 true 时失败项为 null
var ret2 = exchange.IO("multicall", [[USDC, "decimals"], [USDC, "transfer", POOL, 1]],
{ allowFailure: true })
Log("decimals:", ret2[0], "transfer(调用者是Multicall3合约,不是钱包):", ret2[1])
}返回值
| 类型 | 描述 |
array | 返回与 |
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
calls | array | 是 | 调用数组,数组中每一项的格式为 |
options | object | 否 | 可选设置项: |
参考
备注
所有调用均基于同一区块状态执行,返回结果相互一致。
目前仅支持以太坊(EVM)链,暂不支持波场(TRON)。