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

按下单逻辑(选路、询价、价格保护)构造兑换交易,只在链上模拟执行(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 / 空值

返回{route, exactIn, amountIn, amountOut, quoted, executed, value, calls},主要看下单时的报价quoted与模拟执行得到的数量executed,字段说明见备注。不能成交时返回空值并报错。

参数

名称类型必填描述

k

string

是

固定为simulate,用于模拟下单。

symbol

string

是

交易对,例如ETH_USDC。

side

string

是

方向,buy或sell。

qty

number

是

数量,含义与exchange.CreateOrder()相同(市价买入时为要花费的计价币数量)。

price

number

否

限价,不传或传null表示市价单。

stateOverride

object

否

节点eth_call的状态覆盖(geth的state override set),用于模拟时给钱包临时补充余额或授权,例如{"0x钱包地址": {"balance": "0x56bc75e2d63100000"}}。只在本次模拟中生效。

route

string

否

限定路径类型:v2、v3、v4、hop(两跳)或direct(直连);PancakeSwap的v4为Infinity CL池子,Aerodrome、Velodrome的v2为基础池子、v3为Slipstream池子(没有v4)。不传表示在所有路径中选最优。

参考

备注

模拟用的是最新区块状态,与真实下单相比,只差在交易实际上链前价格可能变化。

用代币支付的兑换(如用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同理)。