@moon-cx/sdk 0.0.0-stage → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +2 -2
- package/dist/adapters/sender.d.ts +88 -0
- package/dist/adapters/sender.d.ts.map +1 -0
- package/dist/adapters/sender.js +62 -0
- package/dist/adapters/sender.js.map +1 -0
- package/dist/adapters/tonclient.d.ts +13 -0
- package/dist/adapters/tonclient.d.ts.map +1 -0
- package/dist/adapters/tonclient.js +17 -0
- package/dist/adapters/tonclient.js.map +1 -0
- package/dist/api/index.d.ts +210 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +364 -0
- package/dist/api/index.js.map +1 -0
- package/dist/codec/bins.d.ts +26 -0
- package/dist/codec/bins.d.ts.map +1 -0
- package/dist/codec/bins.js +67 -0
- package/dist/codec/bins.js.map +1 -0
- package/dist/codec/clmm.d.ts +87 -0
- package/dist/codec/clmm.d.ts.map +1 -0
- package/dist/codec/clmm.js +119 -0
- package/dist/codec/clmm.js.map +1 -0
- package/dist/codec/cpmm.d.ts +112 -0
- package/dist/codec/cpmm.d.ts.map +1 -0
- package/dist/codec/cpmm.js +146 -0
- package/dist/codec/cpmm.js.map +1 -0
- package/dist/codec/jetton.d.ts +30 -0
- package/dist/codec/jetton.d.ts.map +1 -0
- package/dist/codec/jetton.js +37 -0
- package/dist/codec/jetton.js.map +1 -0
- package/dist/codec/mempad.d.ts +109 -0
- package/dist/codec/mempad.d.ts.map +1 -0
- package/dist/codec/mempad.js +162 -0
- package/dist/codec/mempad.js.map +1 -0
- package/dist/core/amount.d.ts +33 -0
- package/dist/core/amount.d.ts.map +1 -0
- package/dist/core/amount.js +81 -0
- package/dist/core/amount.js.map +1 -0
- package/dist/core/asset.d.ts +82 -0
- package/dist/core/asset.d.ts.map +1 -0
- package/dist/core/asset.js +143 -0
- package/dist/core/asset.js.map +1 -0
- package/dist/core/errors.d.ts +70 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +114 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fee.d.ts +36 -0
- package/dist/core/fee.d.ts.map +1 -0
- package/dist/core/fee.js +40 -0
- package/dist/core/fee.js.map +1 -0
- package/dist/core/gas.d.ts +112 -0
- package/dist/core/gas.d.ts.map +1 -0
- package/dist/core/gas.js +265 -0
- package/dist/core/gas.js.map +1 -0
- package/dist/core/percent.d.ts +27 -0
- package/dist/core/percent.d.ts.map +1 -0
- package/dist/core/percent.js +71 -0
- package/dist/core/percent.js.map +1 -0
- package/dist/core/tx.d.ts +36 -0
- package/dist/core/tx.d.ts.map +1 -0
- package/dist/core/tx.js +17 -0
- package/dist/core/tx.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/jetton/index.d.ts +53 -0
- package/dist/jetton/index.d.ts.map +1 -0
- package/dist/jetton/index.js +90 -0
- package/dist/jetton/index.js.map +1 -0
- package/dist/math/clmm-swap.d.ts +80 -0
- package/dist/math/clmm-swap.d.ts.map +1 -0
- package/dist/math/clmm-swap.js +277 -0
- package/dist/math/clmm-swap.js.map +1 -0
- package/dist/math/clmm.d.ts +234 -0
- package/dist/math/clmm.d.ts.map +1 -0
- package/dist/math/clmm.js +270 -0
- package/dist/math/clmm.js.map +1 -0
- package/dist/math/cpmm.d.ts +170 -0
- package/dist/math/cpmm.d.ts.map +1 -0
- package/dist/math/cpmm.js +175 -0
- package/dist/math/cpmm.js.map +1 -0
- package/dist/math/integer.d.ts +10 -0
- package/dist/math/integer.d.ts.map +1 -0
- package/dist/math/integer.js +44 -0
- package/dist/math/integer.js.map +1 -0
- package/dist/math/q128.d.ts +45 -0
- package/dist/math/q128.d.ts.map +1 -0
- package/dist/math/q128.js +108 -0
- package/dist/math/q128.js.map +1 -0
- package/dist/moon.d.ts +245 -0
- package/dist/moon.d.ts.map +1 -0
- package/dist/moon.js +332 -0
- package/dist/moon.js.map +1 -0
- package/dist/ops/jetton-input.d.ts +3 -0
- package/dist/ops/jetton-input.d.ts.map +1 -0
- package/dist/ops/jetton-input.js +8 -0
- package/dist/ops/jetton-input.js.map +1 -0
- package/dist/ops/liquidity.d.ts +157 -0
- package/dist/ops/liquidity.d.ts.map +1 -0
- package/dist/ops/liquidity.js +413 -0
- package/dist/ops/liquidity.js.map +1 -0
- package/dist/ops/mempad.d.ts +143 -0
- package/dist/ops/mempad.d.ts.map +1 -0
- package/dist/ops/mempad.js +248 -0
- package/dist/ops/mempad.js.map +1 -0
- package/dist/ops/pool.d.ts +75 -0
- package/dist/ops/pool.d.ts.map +1 -0
- package/dist/ops/pool.js +129 -0
- package/dist/ops/pool.js.map +1 -0
- package/dist/ops/position.d.ts +47 -0
- package/dist/ops/position.d.ts.map +1 -0
- package/dist/ops/position.js +73 -0
- package/dist/ops/position.js.map +1 -0
- package/dist/ops/swap.d.ts +104 -0
- package/dist/ops/swap.d.ts.map +1 -0
- package/dist/ops/swap.js +248 -0
- package/dist/ops/swap.js.map +1 -0
- package/dist/pool/amounts.d.ts +36 -0
- package/dist/pool/amounts.d.ts.map +1 -0
- package/dist/pool/amounts.js +68 -0
- package/dist/pool/amounts.js.map +1 -0
- package/dist/pool/assets.d.ts +45 -0
- package/dist/pool/assets.d.ts.map +1 -0
- package/dist/pool/assets.js +57 -0
- package/dist/pool/assets.js.map +1 -0
- package/dist/pool/clmm.d.ts +309 -0
- package/dist/pool/clmm.d.ts.map +1 -0
- package/dist/pool/clmm.js +561 -0
- package/dist/pool/clmm.js.map +1 -0
- package/dist/pool/cpmm.d.ts +228 -0
- package/dist/pool/cpmm.d.ts.map +1 -0
- package/dist/pool/cpmm.js +332 -0
- package/dist/pool/cpmm.js.map +1 -0
- package/dist/protocol/generated.d.ts +2752 -0
- package/dist/protocol/generated.d.ts.map +1 -0
- package/dist/protocol/generated.js +3564 -0
- package/dist/protocol/generated.js.map +1 -0
- package/dist/protocol/index.d.ts +19 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +49 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/state/address.d.ts +121 -0
- package/dist/state/address.d.ts.map +1 -0
- package/dist/state/address.js +143 -0
- package/dist/state/address.js.map +1 -0
- package/dist/state/source.d.ts +26 -0
- package/dist/state/source.d.ts.map +1 -0
- package/dist/state/source.js +32 -0
- package/dist/state/source.js.map +1 -0
- package/dist/state/storage.d.ts +218 -0
- package/dist/state/storage.d.ts.map +1 -0
- package/dist/state/storage.js +273 -0
- package/dist/state/storage.js.map +1 -0
- package/package.json +74 -4
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
import { Amount } from "../core/amount.js";
|
|
2
|
+
import { BuildError, StateError } from "../core/errors.js";
|
|
3
|
+
import { Percent } from "../core/percent.js";
|
|
4
|
+
import { readContract } from "../state/source.js";
|
|
5
|
+
import { parseClmmPool, parseClmmPosition, parseClmmRange, } from "../state/storage.js";
|
|
6
|
+
import { clmmLpPositionAddress, clmmRangeAddress } from "../state/address.js";
|
|
7
|
+
import { buildSwap, quoteClmmSwap } from "../ops/swap.js";
|
|
8
|
+
import { buildClmmDeposit, buildClmmWithdraw, shapeBins, } from "../ops/liquidity.js";
|
|
9
|
+
import { buildCollectFees, buildLockForever } from "../ops/position.js";
|
|
10
|
+
import { binAtHumanPrice, binFees, binValue, priceAtBin, rangeOfBin, sqrtPriceToPrice, } from "../math/clmm.js";
|
|
11
|
+
import { whoSends } from "./cpmm.js";
|
|
12
|
+
import { canonicalAsset, poolAmount } from "./amounts.js";
|
|
13
|
+
import { resolvePoolAssets } from "./assets.js";
|
|
14
|
+
import { prepared } from "../adapters/sender.js";
|
|
15
|
+
/**
|
|
16
|
+
* A CLMM pool. It holds no liquidity itself: it is a directory of ranges,
|
|
17
|
+
* each covering 2048 bins. Trading and deposits happen on a {@link ClmmPool.range}.
|
|
18
|
+
*/
|
|
19
|
+
export class ClmmPool {
|
|
20
|
+
address;
|
|
21
|
+
assets;
|
|
22
|
+
/** Where each side's decimals came from; see `DecimalsSource`. */
|
|
23
|
+
decimalsSource;
|
|
24
|
+
state;
|
|
25
|
+
#source;
|
|
26
|
+
jettons;
|
|
27
|
+
constructor(source, address, state, resolved, jettons) {
|
|
28
|
+
this.#source = source;
|
|
29
|
+
this.address = address;
|
|
30
|
+
this.state = state;
|
|
31
|
+
this.assets = resolved.assets;
|
|
32
|
+
this.decimalsSource = resolved.decimalsSource;
|
|
33
|
+
this.jettons = jettons;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reads a pool. Same rules as `CpmmPool.open`: x and y are the pool's own,
|
|
37
|
+
* `assets` must match them side for side, and decimals come from the jetton
|
|
38
|
+
* masters whenever `jettons` can read them.
|
|
39
|
+
*
|
|
40
|
+
* @throws BuildError when `assets` names a token the pool does not hold, or
|
|
41
|
+
* names the pool's tokens in the other order
|
|
42
|
+
* @throws JettonLookupError when a master's metadata cannot be read
|
|
43
|
+
*/
|
|
44
|
+
static async open(source, address, options) {
|
|
45
|
+
const state = await readContract(source, address, 'CLMM pool', parseClmmPool);
|
|
46
|
+
const jettons = options?.jettons ?? null;
|
|
47
|
+
const resolved = await resolvePoolAssets({
|
|
48
|
+
pool: address,
|
|
49
|
+
masters: state.masters,
|
|
50
|
+
given: options?.assets,
|
|
51
|
+
jettons,
|
|
52
|
+
});
|
|
53
|
+
return new ClmmPool(source, address, state, resolved, jettons);
|
|
54
|
+
}
|
|
55
|
+
/** Bin step in basis points: 25, 50, 100 or 200. */
|
|
56
|
+
get binStep() {
|
|
57
|
+
return this.state.binStep;
|
|
58
|
+
}
|
|
59
|
+
get feeBps() {
|
|
60
|
+
return this.state.lpFeeBps + this.state.protocolFeeBps;
|
|
61
|
+
}
|
|
62
|
+
/** Address of one range, derived offline from the pool's stored range code. */
|
|
63
|
+
rangeAddress(rangeNum) {
|
|
64
|
+
return clmmRangeAddress({
|
|
65
|
+
pool: this.address,
|
|
66
|
+
rangeNum,
|
|
67
|
+
rangeCode: this.state.rangeCode,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Opens a range by its number. Range 0 covers bins -1024..1023. There is no
|
|
72
|
+
* default: the market is often not in range 0, so prefer {@link ClmmPool.rangeForPrice}.
|
|
73
|
+
*/
|
|
74
|
+
async range(rangeNum) {
|
|
75
|
+
const address = this.rangeAddress(rangeNum);
|
|
76
|
+
const state = await readContract(this.#source, address, 'CLMM range', parseClmmRange);
|
|
77
|
+
return new ClmmRange(this.#source, this, address, state);
|
|
78
|
+
}
|
|
79
|
+
/** Opens the range that holds a given bin. */
|
|
80
|
+
async rangeForBin(bin) {
|
|
81
|
+
return this.range(rangeOfBin(bin));
|
|
82
|
+
}
|
|
83
|
+
/** Opens the range that holds a given price. */
|
|
84
|
+
async rangeForPrice(price) {
|
|
85
|
+
return this.rangeForBin(this.binAtPrice(price));
|
|
86
|
+
}
|
|
87
|
+
/** The bin a human-readable price falls into, decimals accounted for. */
|
|
88
|
+
binAtPrice(price) {
|
|
89
|
+
return binAtHumanPrice({
|
|
90
|
+
price,
|
|
91
|
+
binStep: this.state.binStep,
|
|
92
|
+
decimalsX: this.assets.x.decimals,
|
|
93
|
+
decimalsY: this.assets.y.decimals,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** The price at the lower edge of a bin. */
|
|
97
|
+
priceAtBin(bin) {
|
|
98
|
+
return priceAtBin(bin, this.state.binStep, this.assets.x.decimals, this.assets.y.decimals);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** One range of a CLMM pool: where its liquidity and trading actually live. */
|
|
102
|
+
export class ClmmRange {
|
|
103
|
+
address;
|
|
104
|
+
pool;
|
|
105
|
+
#state;
|
|
106
|
+
#source;
|
|
107
|
+
constructor(source, pool, address, state) {
|
|
108
|
+
this.#source = source;
|
|
109
|
+
this.pool = pool;
|
|
110
|
+
this.address = address;
|
|
111
|
+
this.#state = state;
|
|
112
|
+
}
|
|
113
|
+
get state() {
|
|
114
|
+
return this.#state;
|
|
115
|
+
}
|
|
116
|
+
get assets() {
|
|
117
|
+
return this.pool.assets;
|
|
118
|
+
}
|
|
119
|
+
/** Bin the price currently sits in. Signed. */
|
|
120
|
+
get currentBin() {
|
|
121
|
+
return this.#state.currentBin;
|
|
122
|
+
}
|
|
123
|
+
/** Current price of X in units of Y. */
|
|
124
|
+
get price() {
|
|
125
|
+
return sqrtPriceToPrice(this.#state.currentSqrtPrice, this.assets.x.decimals, this.assets.y.decimals);
|
|
126
|
+
}
|
|
127
|
+
/** Bins that hold liquidity right now. */
|
|
128
|
+
get activeBins() {
|
|
129
|
+
return [...this.#state.bins.keys()].map(Number).sort((a, b) => a - b);
|
|
130
|
+
}
|
|
131
|
+
async refresh() {
|
|
132
|
+
this.#state = await readContract(this.#source, this.address, 'CLMM range', parseClmmRange);
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/** Quotes a swap against this range's bins; `minAmountOut` is derived from `sqrtPriceLimit`. */
|
|
136
|
+
async #quote(args) {
|
|
137
|
+
if (args.refresh !== false)
|
|
138
|
+
await this.refresh();
|
|
139
|
+
const assetIn = canonicalAsset(this.assets, args.assetIn, this.pool.decimalsSource);
|
|
140
|
+
const side = assetIn.equals(this.assets.x) ? 'x' : 'y';
|
|
141
|
+
const assetOut = side === 'x' ? this.assets.y : this.assets.x;
|
|
142
|
+
return quoteClmmSwap({
|
|
143
|
+
range: this.address,
|
|
144
|
+
state: this.#state,
|
|
145
|
+
pool: { masters: this.pool.state.masters },
|
|
146
|
+
assetIn,
|
|
147
|
+
assetOut,
|
|
148
|
+
amountIn: poolAmount(args.amountIn, assetIn, this.pool.decimalsSource[side]),
|
|
149
|
+
slippage: args.slippage,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
buildSwap(args) {
|
|
153
|
+
return buildSwap(args);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Spreads a deposit across the named bins. More than `MAX_BINS_PER_POSITION` bins,
|
|
157
|
+
* or a span crossing into another range, is refused here rather than on chain.
|
|
158
|
+
*/
|
|
159
|
+
planDeposit(args) {
|
|
160
|
+
return shapeBins({
|
|
161
|
+
fromBin: args.fromBin,
|
|
162
|
+
toBin: args.toBin,
|
|
163
|
+
shape: args.shape,
|
|
164
|
+
// x and y are the pool's own sides: `assets` was checked against storage on open.
|
|
165
|
+
x: poolAmount(args.x, this.assets.x, this.pool.decimalsSource.x).raw,
|
|
166
|
+
y: poolAmount(args.y, this.assets.y, this.pool.decimalsSource.y).raw,
|
|
167
|
+
currentSqrtPrice: this.#state.currentSqrtPrice,
|
|
168
|
+
binStep: this.#state.binStep,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
buildDeposit(args) {
|
|
172
|
+
if (args.plan.rangeNum !== this.#state.rangeNum) {
|
|
173
|
+
throw new BuildError(`this plan covers range ${args.plan.rangeNum}, but you are on range ${this.#state.rangeNum}`);
|
|
174
|
+
}
|
|
175
|
+
return buildClmmDeposit({
|
|
176
|
+
range: this.address,
|
|
177
|
+
state: this.#state,
|
|
178
|
+
xIsNative: this.pool.state.masters.x === null,
|
|
179
|
+
...args,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Prepares a deposit against freshly read state. Sends nothing.
|
|
184
|
+
* `details` carries the bin layout, the placed totals and what cannot be placed.
|
|
185
|
+
*/
|
|
186
|
+
async deposit(args) {
|
|
187
|
+
// The layout depends on the current price, which decides which bins take X or Y.
|
|
188
|
+
if (args.refresh !== false)
|
|
189
|
+
await this.refresh();
|
|
190
|
+
const sender = whoSends('deposit', args);
|
|
191
|
+
const plan = this.planDeposit(args);
|
|
192
|
+
return prepared(this.buildDeposit({
|
|
193
|
+
plan,
|
|
194
|
+
sender,
|
|
195
|
+
senderJettonWallets: await this.walletsOf(sender),
|
|
196
|
+
...(args.queryId !== undefined ? { queryId: args.queryId } : {}),
|
|
197
|
+
}), args.wallet);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Prepares a swap against freshly read state. Sends nothing. `details` carries
|
|
201
|
+
* the quote: output, minimum, bins crossed and the Q128 price bound.
|
|
202
|
+
*/
|
|
203
|
+
async swap(args) {
|
|
204
|
+
const quote = await this.#quote(args);
|
|
205
|
+
const sender = whoSends('swap', args);
|
|
206
|
+
const wallets = quote.assetIn.isNative() ? {} : await this.walletsOf(sender);
|
|
207
|
+
// Wallet by the quote's side (from storage masters), not by `assets` order.
|
|
208
|
+
const senderJettonWallet = quote.xIn ? wallets.x : wallets.y;
|
|
209
|
+
return prepared(buildSwap({
|
|
210
|
+
quote,
|
|
211
|
+
sender,
|
|
212
|
+
...(senderJettonWallet !== undefined ? { senderJettonWallet } : {}),
|
|
213
|
+
...(args.queryId !== undefined ? { queryId: args.queryId } : {}),
|
|
214
|
+
}), args.wallet);
|
|
215
|
+
}
|
|
216
|
+
/** The sender's own jetton wallets for this pool's sides. */
|
|
217
|
+
async walletsOf(owner) {
|
|
218
|
+
if (this.pool.jettons === null) {
|
|
219
|
+
throw new BuildError('this pool was opened without jetton lookups — pass senderJettonWallets to ' +
|
|
220
|
+
'buildDeposit, or create Moon with a client that can open jetton masters');
|
|
221
|
+
}
|
|
222
|
+
return this.pool.jettons.walletsFor(this.pool.state.masters, owner);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Bins spanning a width either side of the current price, as of the last read;
|
|
226
|
+
* call `refresh()` first for a fresh price.
|
|
227
|
+
*/
|
|
228
|
+
binsAround(width) {
|
|
229
|
+
const share = width.bps / 10_000;
|
|
230
|
+
return this.binsBetween(this.price * (1 - share), this.price * (1 + share));
|
|
231
|
+
}
|
|
232
|
+
/** Bins spanning two human-readable prices, decimals accounted for. */
|
|
233
|
+
binsBetween(fromPrice, toPrice) {
|
|
234
|
+
const a = this.pool.binAtPrice(fromPrice);
|
|
235
|
+
const b = this.pool.binAtPrice(toPrice);
|
|
236
|
+
return { fromBin: Math.min(a, b), toBin: Math.max(a, b) };
|
|
237
|
+
}
|
|
238
|
+
/** How many bins a width would span, before committing to it. */
|
|
239
|
+
binsInWidth(width) {
|
|
240
|
+
const { fromBin, toBin } = this.binsAround(width);
|
|
241
|
+
return toBin - fromBin + 1;
|
|
242
|
+
}
|
|
243
|
+
/** Address of a position by its index within this range. */
|
|
244
|
+
positionAddress(nftIndex) {
|
|
245
|
+
return clmmLpPositionAddress({
|
|
246
|
+
range: this.address,
|
|
247
|
+
nftIndex,
|
|
248
|
+
lpPositionCode: this.#state.lpPositionCode,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Opens a position by index, or returns null if none is deployed. Positions are
|
|
253
|
+
* keyed by index, not owner: one wallet can hold several in the same range.
|
|
254
|
+
*/
|
|
255
|
+
async position(nftIndex) {
|
|
256
|
+
const address = this.positionAddress(nftIndex);
|
|
257
|
+
const account = await this.#source.getAccountState(address);
|
|
258
|
+
if (account === null)
|
|
259
|
+
return null;
|
|
260
|
+
return new ClmmPosition(this, address, parseClmmPosition(account.data), this.#source);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Finds this wallet's positions by walking the range's index backwards, newest
|
|
264
|
+
* first; `limit` bounds how many accounts are read. For many wallets, use
|
|
265
|
+
* {@link ClmmRange.scanPositions} once.
|
|
266
|
+
*/
|
|
267
|
+
async positionsOf(owner, options) {
|
|
268
|
+
const newest = Number(this.#state.positionIndex);
|
|
269
|
+
const limit = options?.limit ?? 50;
|
|
270
|
+
const found = [];
|
|
271
|
+
for (let index = newest - 1; index >= 0 && newest - index <= limit; index--) {
|
|
272
|
+
const position = await this.position(BigInt(index));
|
|
273
|
+
if (position !== null && position.owner.equals(owner))
|
|
274
|
+
found.push(position);
|
|
275
|
+
}
|
|
276
|
+
return found;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Reads every position in the range once and returns them indexed by owner.
|
|
280
|
+
* Indices with no deployed account are skipped.
|
|
281
|
+
*/
|
|
282
|
+
async scanPositions(options) {
|
|
283
|
+
const from = options?.from ?? 0;
|
|
284
|
+
const to = options?.to ?? Number(this.#state.positionIndex);
|
|
285
|
+
const batch = Math.max(1, options?.batch ?? 16);
|
|
286
|
+
const found = [];
|
|
287
|
+
for (let start = from; start < to; start += batch) {
|
|
288
|
+
const indices = [];
|
|
289
|
+
for (let i = start; i < Math.min(start + batch, to); i++)
|
|
290
|
+
indices.push(i);
|
|
291
|
+
const read = await Promise.all(indices.map((i) => this.position(BigInt(i))));
|
|
292
|
+
for (const position of read)
|
|
293
|
+
if (position !== null)
|
|
294
|
+
found.push(position);
|
|
295
|
+
options?.onProgress?.(Math.min(start + batch, to) - from, to - from);
|
|
296
|
+
}
|
|
297
|
+
return new ClmmPositionIndex(this, found, { from, to });
|
|
298
|
+
}
|
|
299
|
+
/** Opens a position at an address you already have. */
|
|
300
|
+
async positionAt(address) {
|
|
301
|
+
const account = await this.#source.getAccountState(address);
|
|
302
|
+
if (account === null)
|
|
303
|
+
throw new StateError(address, 'no position is deployed here');
|
|
304
|
+
return new ClmmPosition(this, address, parseClmmPosition(account.data), this.#source);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Every position in a range, read once and queried in memory.
|
|
309
|
+
*
|
|
310
|
+
* Built by {@link ClmmRange.scanPositions}. Nothing here touches the network.
|
|
311
|
+
*/
|
|
312
|
+
export class ClmmPositionIndex {
|
|
313
|
+
range;
|
|
314
|
+
/** Positions found, in index order. */
|
|
315
|
+
positions;
|
|
316
|
+
/** The index window that was read. */
|
|
317
|
+
scanned;
|
|
318
|
+
#byOwner = new Map();
|
|
319
|
+
#byIndex = new Map();
|
|
320
|
+
constructor(range, positions, scanned) {
|
|
321
|
+
this.range = range;
|
|
322
|
+
this.positions = positions;
|
|
323
|
+
this.scanned = scanned;
|
|
324
|
+
for (const position of positions) {
|
|
325
|
+
this.#byIndex.set(position.nftIndex, position);
|
|
326
|
+
const key = position.owner.toRawString();
|
|
327
|
+
const bucket = this.#byOwner.get(key);
|
|
328
|
+
if (bucket)
|
|
329
|
+
bucket.push(position);
|
|
330
|
+
else
|
|
331
|
+
this.#byOwner.set(key, [position]);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
get size() {
|
|
335
|
+
return this.positions.length;
|
|
336
|
+
}
|
|
337
|
+
/** How many indices were read, including ones that held nothing. */
|
|
338
|
+
get scannedCount() {
|
|
339
|
+
return this.scanned.to - this.scanned.from;
|
|
340
|
+
}
|
|
341
|
+
/** This wallet's positions. Pure lookup. */
|
|
342
|
+
of(owner) {
|
|
343
|
+
return [...(this.#byOwner.get(owner.toRawString()) ?? [])];
|
|
344
|
+
}
|
|
345
|
+
byIndex(nftIndex) {
|
|
346
|
+
return this.#byIndex.get(nftIndex) ?? null;
|
|
347
|
+
}
|
|
348
|
+
/** Every wallet holding liquidity in this range. */
|
|
349
|
+
owners() {
|
|
350
|
+
return this.positions
|
|
351
|
+
.filter((position, i, all) => all.findIndex((p) => p.owner.equals(position.owner)) === i)
|
|
352
|
+
.map((position) => position.owner);
|
|
353
|
+
}
|
|
354
|
+
/** Positions holding liquidity in the bin the price sits in right now. */
|
|
355
|
+
inRange() {
|
|
356
|
+
const current = this.range.currentBin;
|
|
357
|
+
return this.positions.filter((position) => position.bins.includes(current));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/** A liquidity position in one CLMM range. */
|
|
361
|
+
export class ClmmPosition {
|
|
362
|
+
address;
|
|
363
|
+
range;
|
|
364
|
+
#state;
|
|
365
|
+
#source;
|
|
366
|
+
constructor(range, address, state, source) {
|
|
367
|
+
this.range = range;
|
|
368
|
+
this.address = address;
|
|
369
|
+
this.#state = state;
|
|
370
|
+
this.#source = source;
|
|
371
|
+
}
|
|
372
|
+
get state() {
|
|
373
|
+
return this.#state;
|
|
374
|
+
}
|
|
375
|
+
/** Re-reads the position and its range. */
|
|
376
|
+
async refresh() {
|
|
377
|
+
const [account] = await Promise.all([
|
|
378
|
+
this.#source.getAccountState(this.address),
|
|
379
|
+
this.range.refresh(),
|
|
380
|
+
]);
|
|
381
|
+
if (account === null)
|
|
382
|
+
throw new StateError(this.address, 'the position is no longer deployed');
|
|
383
|
+
this.#state = parseClmmPosition(account.data);
|
|
384
|
+
return this;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Withdraws liquidity from the named bins, against freshly read state. Bins are
|
|
388
|
+
* emptied whole, with their accrued fees. A bin the position does not hold would
|
|
389
|
+
* revert the whole message, so the list is checked first.
|
|
390
|
+
*/
|
|
391
|
+
async withdraw(args) {
|
|
392
|
+
if (args?.refresh !== false)
|
|
393
|
+
await this.refresh();
|
|
394
|
+
const bins = args?.bins ?? this.bins;
|
|
395
|
+
this.#assertOwnBins(bins);
|
|
396
|
+
const built = buildClmmWithdraw({
|
|
397
|
+
position: this.address,
|
|
398
|
+
bins,
|
|
399
|
+
locked: this.#state.locked,
|
|
400
|
+
pending: this.#state.pending,
|
|
401
|
+
...(args?.queryId !== undefined ? { queryId: args.queryId } : {}),
|
|
402
|
+
});
|
|
403
|
+
return prepared({ ...built, details: this.expectedFrom(bins) }, args?.wallet);
|
|
404
|
+
}
|
|
405
|
+
/** Refuses bins this position does not hold, naming them. */
|
|
406
|
+
#assertOwnBins(bins) {
|
|
407
|
+
const held = new Set(this.bins);
|
|
408
|
+
const missing = bins.filter((bin) => !held.has(bin));
|
|
409
|
+
if (missing.length > 0) {
|
|
410
|
+
throw new BuildError(`this position does not hold bin${missing.length > 1 ? 's' : ''} ` +
|
|
411
|
+
`${missing.join(', ')} — the LP position rejects the whole message for one wrong bin. ` +
|
|
412
|
+
`It holds ${this.bins.join(', ')}.`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* What withdrawing these bins returns: principal at the current price, plus
|
|
417
|
+
* the fees those bins have accrued.
|
|
418
|
+
*/
|
|
419
|
+
expectedFrom(bins) {
|
|
420
|
+
const range = this.range.state;
|
|
421
|
+
let principalX = 0n;
|
|
422
|
+
let principalY = 0n;
|
|
423
|
+
let feesX = 0n;
|
|
424
|
+
let feesY = 0n;
|
|
425
|
+
for (const bin of bins) {
|
|
426
|
+
const held = this.#state.bins.get(BigInt(bin));
|
|
427
|
+
if (held === undefined)
|
|
428
|
+
continue;
|
|
429
|
+
const value = binValue({
|
|
430
|
+
bin,
|
|
431
|
+
liquidity: held.l,
|
|
432
|
+
currentSqrtPrice: range.currentSqrtPrice,
|
|
433
|
+
binStep: range.binStep,
|
|
434
|
+
});
|
|
435
|
+
principalX += value.x;
|
|
436
|
+
principalY += value.y;
|
|
437
|
+
const current = range.bins.get(BigInt(bin));
|
|
438
|
+
if (current === undefined)
|
|
439
|
+
continue;
|
|
440
|
+
const earned = binFees({
|
|
441
|
+
liquidity: held.l,
|
|
442
|
+
binFees: { x: current.xFee, y: current.yFee },
|
|
443
|
+
checkpoint: { x: held.xFee, y: held.yFee },
|
|
444
|
+
});
|
|
445
|
+
feesX += earned.x;
|
|
446
|
+
feesY += earned.y;
|
|
447
|
+
}
|
|
448
|
+
const asset = this.range.assets;
|
|
449
|
+
return {
|
|
450
|
+
bins: [...bins],
|
|
451
|
+
principal: { x: new Amount(principalX, asset.x), y: new Amount(principalY, asset.y) },
|
|
452
|
+
fees: { x: new Amount(feesX, asset.x), y: new Amount(feesY, asset.y) },
|
|
453
|
+
total: {
|
|
454
|
+
x: new Amount(principalX + feesX, asset.x),
|
|
455
|
+
y: new Amount(principalY + feesY, asset.y),
|
|
456
|
+
},
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
/** Collects accrued fees, against freshly read state. */
|
|
460
|
+
async collectFees(args) {
|
|
461
|
+
if (args?.refresh !== false)
|
|
462
|
+
await this.refresh();
|
|
463
|
+
return prepared(this.buildCollectFees(args), args?.wallet);
|
|
464
|
+
}
|
|
465
|
+
get nftIndex() {
|
|
466
|
+
return this.#state.nftIndex;
|
|
467
|
+
}
|
|
468
|
+
get owner() {
|
|
469
|
+
return this.#state.user;
|
|
470
|
+
}
|
|
471
|
+
/** Liquidity this position holds, per bin. */
|
|
472
|
+
get liquidity() {
|
|
473
|
+
const result = new Map();
|
|
474
|
+
for (const [bin, held] of this.#state.bins)
|
|
475
|
+
result.set(Number(bin), held.l);
|
|
476
|
+
return result;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* What the position is worth right now, principal only. Each bin is valued at the
|
|
480
|
+
* price clamped to its own bounds, so bins the price has moved past hold one side.
|
|
481
|
+
*/
|
|
482
|
+
get value() {
|
|
483
|
+
const range = this.range.state;
|
|
484
|
+
let x = 0n;
|
|
485
|
+
let y = 0n;
|
|
486
|
+
for (const [bin, held] of this.#state.bins) {
|
|
487
|
+
const part = binValue({
|
|
488
|
+
bin: Number(bin),
|
|
489
|
+
liquidity: held.l,
|
|
490
|
+
currentSqrtPrice: range.currentSqrtPrice,
|
|
491
|
+
binStep: range.binStep,
|
|
492
|
+
});
|
|
493
|
+
x += part.x;
|
|
494
|
+
y += part.y;
|
|
495
|
+
}
|
|
496
|
+
return {
|
|
497
|
+
x: new Amount(x, this.range.assets.x),
|
|
498
|
+
y: new Amount(y, this.range.assets.y),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
/** Fees waiting to be collected, summed over the position's bins. */
|
|
502
|
+
get pendingFees() {
|
|
503
|
+
const range = this.range.state;
|
|
504
|
+
let x = 0n;
|
|
505
|
+
let y = 0n;
|
|
506
|
+
for (const [bin, held] of this.#state.bins) {
|
|
507
|
+
const current = range.bins.get(bin);
|
|
508
|
+
if (current === undefined)
|
|
509
|
+
continue;
|
|
510
|
+
const part = binFees({
|
|
511
|
+
liquidity: held.l,
|
|
512
|
+
binFees: { x: current.xFee, y: current.yFee },
|
|
513
|
+
checkpoint: { x: held.xFee, y: held.yFee },
|
|
514
|
+
});
|
|
515
|
+
x += part.x;
|
|
516
|
+
y += part.y;
|
|
517
|
+
}
|
|
518
|
+
return {
|
|
519
|
+
x: new Amount(x, this.range.assets.x),
|
|
520
|
+
y: new Amount(y, this.range.assets.y),
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
/** Once locked, liquidity can never be withdrawn. Fees still can. */
|
|
524
|
+
get isLocked() {
|
|
525
|
+
return this.#state.locked;
|
|
526
|
+
}
|
|
527
|
+
/** A deposit is still settling; withdrawals are refused until it lands. */
|
|
528
|
+
get isPending() {
|
|
529
|
+
return this.#state.pending;
|
|
530
|
+
}
|
|
531
|
+
/** Bins this position holds liquidity in. */
|
|
532
|
+
get bins() {
|
|
533
|
+
return [...this.#state.bins.keys()].map(Number).sort((a, b) => a - b);
|
|
534
|
+
}
|
|
535
|
+
buildWithdraw(args) {
|
|
536
|
+
return buildClmmWithdraw({
|
|
537
|
+
position: this.address,
|
|
538
|
+
bins: args?.bins ?? this.bins,
|
|
539
|
+
locked: this.#state.locked,
|
|
540
|
+
pending: this.#state.pending,
|
|
541
|
+
...(args?.queryId !== undefined ? { queryId: args.queryId } : {}),
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
buildCollectFees(args) {
|
|
545
|
+
return buildCollectFees({
|
|
546
|
+
protocol: 'clmm',
|
|
547
|
+
position: this.address,
|
|
548
|
+
pending: this.#state.pending,
|
|
549
|
+
...args,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
buildLockForever(args) {
|
|
553
|
+
return buildLockForever({
|
|
554
|
+
protocol: 'clmm',
|
|
555
|
+
position: this.address,
|
|
556
|
+
alreadyLocked: this.#state.locked,
|
|
557
|
+
...args,
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
//# sourceMappingURL=clmm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clmm.js","sourceRoot":"","sources":["../../src/pool/clmm.ts"],"names":[],"mappings":"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"}
|