exchange.IO("simulate", ...)
按下单逻辑(选路、询价、价格保护)构造兑换交易,只在链上模拟执行(eth_call),不签名、不广播、不花费gas。
exchange.IO(k, symbol, side, qty)
exchange.IO(k, symbol, side, qty, price)
exchange.IO(k, symbol, side, qty, price, stateOverride)
exchange.IO(k, symbol, side, qty, price, stateOverride, route)示例
给钱包临时补100个ETH,模拟卖出1个ETH。
javascript
function main() {
var ov = {}
ov[exchange.IO("address")] = { balance: "0x56bc75e2d63100000" }
var r = exchange.IO("simulate", "ETH_USDC", "sell", 1, null, ov)
Log("路径:", r.route, "报价:", r.quoted, "模拟执行:", r.executed)
}返回值
| 类型 | 描述 |
object / 空值 | 返回 |
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
symbol | string | 是 | 交易对,例如 |
side | string | 是 | 方向, |
qty | number | 是 | 数量,含义与 |
price | number | 否 | 限价,不传或传 |
stateOverride | object | 否 | 节点 |
route | string | 否 | 限定路径类型: |
参考
Uniswap / PancakeSwap Aerodrome / Velodrome KyberSwap 1inch exchange.IO exchange.IO("route") exchange.IO("slippage") exchange.IO("gasMultiplier") exchange.CreateOrder
备注
模拟用的是最新区块状态,与真实下单相比,只差在交易实际上链前价格可能变化。
用代币支付的兑换(如用USDC买入),钱包授权不够时自动用state override补上授权再模拟(默认approve为exact,真实下单前才授权),结果里allowanceOverride列出补了哪些;传入的stateOverride与它合并,已写的存储槽位不覆盖。余额不会自动补:用原生币支付时在stateOverride里给钱包补balance即可,用代币支付时需要自己覆盖代币合约的余额存储槽。
返回对象的字段:quoted为下单时的报价,executed为模拟执行得到的实际数量(精确输入时为得到的数量,精确输出时为花费的数量),两者均为最小单位的十进制字符串。Uniswap的V4路径与PancakeSwap的Infinity路径经Universal Router执行,路由不返回成交数量,executed为null:模拟不报错即说明按这组参数(含最少得到/最多花费)能够成交。限价达不到、余额或授权不足(未覆盖时)等情况返回空值并报错。
KyberSwap、1inch交易所对象(聚合器)按聚合器生成的交易模拟,route形如kyberswap:ETH-USDC via flux-prop,via后面是这笔兑换经过的流动性来源;第7个参数route对聚合器不适用,传入时报错route is not applicable to the KyberSwap aggregator(1inch同理)。