exchange.IO("lp.increase", ...)
给已有的仓位加仓:按仓位的区间与现价把预算拆成两种代币,缺的那种先换。
exchange.IO(k, positionId, budget)
exchange.IO(k, positionId, budget, options)示例
给第一个SOL/USDC仓位加仓50 USDC。
javascript
function main() {
var list = exchange.IO("lp.positions", "SOL_USDC")
if (!list || list.length == 0) {
Log("没有SOL/USDC仓位")
return
}
var r = exchange.IO("lp.increase", list[0].id, 50, {symbol: "SOL_USDC"})
if (!r) {
Log("加仓失败:", GetLastError())
return
}
Log(r.id, "加入", r.amountBase, "SOL", r.amountQuote, "USDC", "交易", r.txHash)
}返回值
| 类型 | 描述 |
object / 空值 |
|
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
positionId | string | 是 | 仓位ID( |
budget | number | 是 | 加仓金额,按计价币计。 |
options | object | 否 |
|
参考
Jupiter exchange.IO exchange.IO("lp.add") exchange.IO("lp.positions") exchange.IO("lp.decrease") exchange.IO("lp.plan")
备注
加仓的规划、换币与执行同lp.add:先按仓位的区间与最新池价规划,余额不足时报错,需要时先用Jupiter市价单换币并等确认,再重新规划、发送一笔交易。
各协议的差别
- Meteora DLMM:按
shape在仓位的bin上分配,只支持不超过70个bin的仓位(更宽的仓位一笔交易放不下,报错)。 - Raydium CLMM:用
increase_liquidity_v2。两种代币都要时以一种定量(SOL那一侧优先),另一种的上限为价格在slippage内浮动时的最大用量(不少于计划量 × (1 +slippage));只要一种(区间整个在现价一侧)时按流动性加,另一种的上限为价格浮进区间时要补的量。 - Orca Whirlpools:不限宽度,两种代币的数量作为上限交给链上,链上按执行时的价格算出能加的最大流动性。
交易的执行
每笔交易发送前都用节点模拟一遍,模拟失败不发送并报出原因(DLMM、Raydium CLMM、Orca Whirlpool的错误码附名字);计算单元上限按模拟用量加余量,优先费按最近写这些账户的交易的费率取第75百分位,不超过exchange.IO("priorityFee")的上限。交易确认后才返回,实际数量按交易前后的余额计算。120秒内既没确认也证明不了过期时报outcome is unknown并附交易签名:交易可能已经上链,先用exchange.IO("receipt")核对再决定是否重试。