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

通过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

返回与calls顺序一致的结果数组,每一项的解码方式与exchange.IO("call", ...)相同。注意每个子调用的调用者(msg.sender)是Multicall3合约,而exchange.IO("call", ...)默认以钱包地址调用,依赖调用者的方法(如transfer、按调用者检查余额或授权的写方法)结果会不同,exchange.IO("multicall", ...)只适合与调用者无关的读取。

参数

名称类型必填描述

k

string

是

固定为multicall,用于批量读取合约调用结果。

calls

array

是

调用数组,数组中每一项的格式为[合约地址, 方法, ...参数],写法与exchange.IO("call", ...)相同,其中方法也可以是完整的调用数据(calldata)。不支持附带原生代币的payable调用。

options

object

否

可选设置项:allowFailure设置为true时,调用失败的项返回空值;否则(默认)任意一项调用失败时整体返回空值,并可通过GetLastError()获取失败项的序号和原因。block用于指定读取的区块(默认为latest,负数表示相对于最新区块的偏移)。multicall用于指定Multicall3合约地址(默认为0xcA11bde05977b3631167028862bE2a173976CA11,主流EVM链均在该地址部署了此合约)。

参考

备注

所有调用均基于同一区块状态执行,返回结果相互一致。

目前仅支持以太坊(EVM)链,暂不支持波场(TRON)。