exchange.IO("lp.positions", ...)
列出钱包的LP仓位:区间、是否在区间内、流动性、当前数量与价值、未领手续费。
exchange.IO(k)
exchange.IO(k, filter)
exchange.IO(k, filter, wallet)示例
只读查看任意钱包的ETH/USDC仓位:在不在区间内、价值和未领手续费。
javascript
function main() {
// 不传第三个参数时查本交易所对象的钱包
var wallet = "0xc1906cb9b3e7ab44dec8b0ab6894f8ccbbe40a72"
var ps = exchange.IO("lp.positions", "ETH_USDC", wallet)
if (!ps) {
Log("查询失败:", GetLastError())
return
}
ps.filter(function (p) { return !p.closed }).forEach(function (p) {
Log(p.id, p.protocol, "区间", p.priceLower, "~", p.priceUpper,
p.inRange ? "区间内" : "区间外", "价值:", p.value, "未领手续费:", p.feesValue)
})
}返回值
| 类型 | 描述 |
array / 空值 | 仓位数组 |
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 固定为 |
filter | string | 否 | 交易对(如 |
wallet | string | 否 | 其它钱包地址:只读查看那个钱包的仓位;不传为本交易所对象的钱包。 |
参考
Uniswap / PancakeSwap Aerodrome / Velodrome exchange.IO exchange.IO("lp.add") exchange.IO("lp.collect") exchange.IO("lp.remove") exchange.IO("lp.track") exchange.IO("lp.history")
备注
每个仓位的字段:
| 字段 | 说明 |
|---|---|
id、pool、protocol、symbol、fee | 仓位ID、池子ID、池子类型、交易对、费率(百万分之一) |
tickLower、tickUpper、priceLower、priceUpper | 仓位区间(tick与价格,价格为计价币/基础币) |
price、tick、inRange | 池子现价、当前tick、现价是否在区间内(在区间外时不赚手续费) |
liquidity | 仓位流动性(十进制字符串) |
amountBase、amountQuote、value | 仓位现在的两种代币数量与按计价币折算的价值 |
feesBase、feesQuote、feesValue | 未领的手续费与按计价币折算的价值 |
closed | 流动性与未领手续费都为0(已撤空、NFT还在)的仓位为true |
交易对的朝向:filter写交易对时按它;否则默认稳定币为计价币,所以没写交易对时V3仓位显示为WETH_USDC这样的包装币写法。
查找方式:V3仓位由PositionManager按钱包列出(钱包里仓位NFT很多时只查最新的2000个)。V4/Infinity CL的PositionManager不能按钱包列出,靠转入钱包的NFT日志查找:节点支持查询全部历史日志时能找全,公共节点通常只能查最近一段区块,更早的仓位要用exchange.IO("lp.track", ids)登记(本进程lp.add建的会自动记住);仓位ID形如v4:123456、inf:123456。
Aerodrome、Velodrome:钱包里的Slipstream仓位直接列出;质押在gauge里的仓位NFT归gauge所有,去本进程质押过的、日志里找到的、lp.track登记过的和filter对应池子的gauge里查;基础池子查本进程建过的、lp.track登记的、filter对应的,以及代币表里常用交易对上的池子。每行另有staked(是否质押)、gauge、rewardToken(奖励币)、rewards(可领的奖励币数量)、rewardsValue(按计价币折算);基础池子另有fullRange、lpTokens、stakedLpTokens,没有tick。