@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.
Files changed (155) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +2 -2
  3. package/dist/adapters/sender.d.ts +88 -0
  4. package/dist/adapters/sender.d.ts.map +1 -0
  5. package/dist/adapters/sender.js +62 -0
  6. package/dist/adapters/sender.js.map +1 -0
  7. package/dist/adapters/tonclient.d.ts +13 -0
  8. package/dist/adapters/tonclient.d.ts.map +1 -0
  9. package/dist/adapters/tonclient.js +17 -0
  10. package/dist/adapters/tonclient.js.map +1 -0
  11. package/dist/api/index.d.ts +210 -0
  12. package/dist/api/index.d.ts.map +1 -0
  13. package/dist/api/index.js +364 -0
  14. package/dist/api/index.js.map +1 -0
  15. package/dist/codec/bins.d.ts +26 -0
  16. package/dist/codec/bins.d.ts.map +1 -0
  17. package/dist/codec/bins.js +67 -0
  18. package/dist/codec/bins.js.map +1 -0
  19. package/dist/codec/clmm.d.ts +87 -0
  20. package/dist/codec/clmm.d.ts.map +1 -0
  21. package/dist/codec/clmm.js +119 -0
  22. package/dist/codec/clmm.js.map +1 -0
  23. package/dist/codec/cpmm.d.ts +112 -0
  24. package/dist/codec/cpmm.d.ts.map +1 -0
  25. package/dist/codec/cpmm.js +146 -0
  26. package/dist/codec/cpmm.js.map +1 -0
  27. package/dist/codec/jetton.d.ts +30 -0
  28. package/dist/codec/jetton.d.ts.map +1 -0
  29. package/dist/codec/jetton.js +37 -0
  30. package/dist/codec/jetton.js.map +1 -0
  31. package/dist/codec/mempad.d.ts +109 -0
  32. package/dist/codec/mempad.d.ts.map +1 -0
  33. package/dist/codec/mempad.js +162 -0
  34. package/dist/codec/mempad.js.map +1 -0
  35. package/dist/core/amount.d.ts +33 -0
  36. package/dist/core/amount.d.ts.map +1 -0
  37. package/dist/core/amount.js +81 -0
  38. package/dist/core/amount.js.map +1 -0
  39. package/dist/core/asset.d.ts +82 -0
  40. package/dist/core/asset.d.ts.map +1 -0
  41. package/dist/core/asset.js +143 -0
  42. package/dist/core/asset.js.map +1 -0
  43. package/dist/core/errors.d.ts +70 -0
  44. package/dist/core/errors.d.ts.map +1 -0
  45. package/dist/core/errors.js +114 -0
  46. package/dist/core/errors.js.map +1 -0
  47. package/dist/core/fee.d.ts +36 -0
  48. package/dist/core/fee.d.ts.map +1 -0
  49. package/dist/core/fee.js +40 -0
  50. package/dist/core/fee.js.map +1 -0
  51. package/dist/core/gas.d.ts +112 -0
  52. package/dist/core/gas.d.ts.map +1 -0
  53. package/dist/core/gas.js +265 -0
  54. package/dist/core/gas.js.map +1 -0
  55. package/dist/core/percent.d.ts +27 -0
  56. package/dist/core/percent.d.ts.map +1 -0
  57. package/dist/core/percent.js +71 -0
  58. package/dist/core/percent.js.map +1 -0
  59. package/dist/core/tx.d.ts +36 -0
  60. package/dist/core/tx.d.ts.map +1 -0
  61. package/dist/core/tx.js +17 -0
  62. package/dist/core/tx.js.map +1 -0
  63. package/dist/index.d.ts +63 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +41 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/jetton/index.d.ts +53 -0
  68. package/dist/jetton/index.d.ts.map +1 -0
  69. package/dist/jetton/index.js +90 -0
  70. package/dist/jetton/index.js.map +1 -0
  71. package/dist/math/clmm-swap.d.ts +80 -0
  72. package/dist/math/clmm-swap.d.ts.map +1 -0
  73. package/dist/math/clmm-swap.js +277 -0
  74. package/dist/math/clmm-swap.js.map +1 -0
  75. package/dist/math/clmm.d.ts +234 -0
  76. package/dist/math/clmm.d.ts.map +1 -0
  77. package/dist/math/clmm.js +270 -0
  78. package/dist/math/clmm.js.map +1 -0
  79. package/dist/math/cpmm.d.ts +170 -0
  80. package/dist/math/cpmm.d.ts.map +1 -0
  81. package/dist/math/cpmm.js +175 -0
  82. package/dist/math/cpmm.js.map +1 -0
  83. package/dist/math/integer.d.ts +10 -0
  84. package/dist/math/integer.d.ts.map +1 -0
  85. package/dist/math/integer.js +44 -0
  86. package/dist/math/integer.js.map +1 -0
  87. package/dist/math/q128.d.ts +45 -0
  88. package/dist/math/q128.d.ts.map +1 -0
  89. package/dist/math/q128.js +108 -0
  90. package/dist/math/q128.js.map +1 -0
  91. package/dist/moon.d.ts +245 -0
  92. package/dist/moon.d.ts.map +1 -0
  93. package/dist/moon.js +332 -0
  94. package/dist/moon.js.map +1 -0
  95. package/dist/ops/jetton-input.d.ts +3 -0
  96. package/dist/ops/jetton-input.d.ts.map +1 -0
  97. package/dist/ops/jetton-input.js +8 -0
  98. package/dist/ops/jetton-input.js.map +1 -0
  99. package/dist/ops/liquidity.d.ts +157 -0
  100. package/dist/ops/liquidity.d.ts.map +1 -0
  101. package/dist/ops/liquidity.js +413 -0
  102. package/dist/ops/liquidity.js.map +1 -0
  103. package/dist/ops/mempad.d.ts +143 -0
  104. package/dist/ops/mempad.d.ts.map +1 -0
  105. package/dist/ops/mempad.js +248 -0
  106. package/dist/ops/mempad.js.map +1 -0
  107. package/dist/ops/pool.d.ts +75 -0
  108. package/dist/ops/pool.d.ts.map +1 -0
  109. package/dist/ops/pool.js +129 -0
  110. package/dist/ops/pool.js.map +1 -0
  111. package/dist/ops/position.d.ts +47 -0
  112. package/dist/ops/position.d.ts.map +1 -0
  113. package/dist/ops/position.js +73 -0
  114. package/dist/ops/position.js.map +1 -0
  115. package/dist/ops/swap.d.ts +104 -0
  116. package/dist/ops/swap.d.ts.map +1 -0
  117. package/dist/ops/swap.js +248 -0
  118. package/dist/ops/swap.js.map +1 -0
  119. package/dist/pool/amounts.d.ts +36 -0
  120. package/dist/pool/amounts.d.ts.map +1 -0
  121. package/dist/pool/amounts.js +68 -0
  122. package/dist/pool/amounts.js.map +1 -0
  123. package/dist/pool/assets.d.ts +45 -0
  124. package/dist/pool/assets.d.ts.map +1 -0
  125. package/dist/pool/assets.js +57 -0
  126. package/dist/pool/assets.js.map +1 -0
  127. package/dist/pool/clmm.d.ts +309 -0
  128. package/dist/pool/clmm.d.ts.map +1 -0
  129. package/dist/pool/clmm.js +561 -0
  130. package/dist/pool/clmm.js.map +1 -0
  131. package/dist/pool/cpmm.d.ts +228 -0
  132. package/dist/pool/cpmm.d.ts.map +1 -0
  133. package/dist/pool/cpmm.js +332 -0
  134. package/dist/pool/cpmm.js.map +1 -0
  135. package/dist/protocol/generated.d.ts +2752 -0
  136. package/dist/protocol/generated.d.ts.map +1 -0
  137. package/dist/protocol/generated.js +3564 -0
  138. package/dist/protocol/generated.js.map +1 -0
  139. package/dist/protocol/index.d.ts +19 -0
  140. package/dist/protocol/index.d.ts.map +1 -0
  141. package/dist/protocol/index.js +49 -0
  142. package/dist/protocol/index.js.map +1 -0
  143. package/dist/state/address.d.ts +121 -0
  144. package/dist/state/address.d.ts.map +1 -0
  145. package/dist/state/address.js +143 -0
  146. package/dist/state/address.js.map +1 -0
  147. package/dist/state/source.d.ts +26 -0
  148. package/dist/state/source.d.ts.map +1 -0
  149. package/dist/state/source.js +32 -0
  150. package/dist/state/source.js.map +1 -0
  151. package/dist/state/storage.d.ts +218 -0
  152. package/dist/state/storage.d.ts.map +1 -0
  153. package/dist/state/storage.js +273 -0
  154. package/dist/state/storage.js.map +1 -0
  155. package/package.json +74 -4
@@ -0,0 +1,277 @@
1
+ import { LimitExceededError } from "../core/errors.js";
2
+ import { MAX_BINS_PER_SWAP, binBounds, sqrtPriceAtBin, sqrtPriceEnteringBin } from "./clmm.js";
3
+ import { SCALE, q128DivCeil, q128DivFloor, q128Mul, q128MulCeil, q128MulFloor, q128Sqrt, mulDivCeil, mulDivFloor, } from "./q128.js";
4
+ /**
5
+ * Simulating a CLMM swap locally, bin by bin.
6
+ *
7
+ * Mirrors the range's own swap arithmetic step for step. This is what makes a
8
+ * quote possible without asking any backend: given the range's bins and
9
+ * current price — both readable from raw account state — the result is the
10
+ * same arithmetic the range will perform on chain.
11
+ */
12
+ /** Fee shares are stored as basis points and converted to Q128 fractions. */
13
+ function feeFraction(bps) {
14
+ return mulDivFloor(BigInt(bps), SCALE, 10000n);
15
+ }
16
+ /** How much gross X this bin can absorb before the price reaches its lower bound. */
17
+ function maxXInThisBin(args) {
18
+ if (args.sqrtP <= args.sqrtPa)
19
+ return 0n;
20
+ const invChange = q128DivCeil(SCALE, args.sqrtPa) - q128DivFloor(SCALE, args.sqrtP);
21
+ const needed = q128MulCeil(invChange > 0n ? invChange : 0n, args.liquidity);
22
+ const gross = q128DivCeil(needed, SCALE - args.lpFee);
23
+ return args.remaining < gross ? args.remaining : gross;
24
+ }
25
+ /** How much gross Y this bin can absorb before the price reaches its upper bound. */
26
+ function maxYInThisBin(args) {
27
+ if (args.sqrtP >= args.sqrtPb)
28
+ return 0n;
29
+ const needed = q128MulCeil(args.sqrtPb - args.sqrtP, args.liquidity);
30
+ const gross = q128DivCeil(needed, SCALE - args.lpFee);
31
+ return args.remaining < gross ? args.remaining : gross;
32
+ }
33
+ function stepXToY(args) {
34
+ const { sqrtPa } = binBounds(args.bin, args.binStep);
35
+ const gross = maxXInThisBin({
36
+ remaining: args.remaining,
37
+ sqrtPa,
38
+ liquidity: args.liquidity,
39
+ sqrtP: args.sqrtP,
40
+ lpFee: args.lpFee,
41
+ });
42
+ if (gross === 0n) {
43
+ return {
44
+ bin: args.bin,
45
+ newSqrtPrice: args.sqrtP,
46
+ out: 0n,
47
+ remaining: args.remaining,
48
+ lpFee: 0n,
49
+ protocolFee: 0n,
50
+ };
51
+ }
52
+ const fee = q128Mul(args.lpFee, gross);
53
+ const afterFee = gross - fee;
54
+ const invChange = q128DivFloor(afterFee, args.liquidity);
55
+ const newInv = q128DivFloor(SCALE, args.sqrtP) + invChange;
56
+ const unclamped = q128DivCeil(SCALE, newInv);
57
+ const capped = unclamped < args.sqrtP ? unclamped : args.sqrtP;
58
+ const newSqrtPrice = capped > sqrtPa ? capped : sqrtPa;
59
+ const outGross = q128MulFloor(args.liquidity, args.sqrtP - newSqrtPrice);
60
+ const protocolFee = q128Mul(outGross, args.protocolFee);
61
+ return {
62
+ bin: args.bin,
63
+ newSqrtPrice,
64
+ out: outGross - protocolFee,
65
+ remaining: args.remaining - gross,
66
+ lpFee: fee,
67
+ protocolFee,
68
+ };
69
+ }
70
+ function stepYToX(args) {
71
+ const { sqrtPa, sqrtPb } = binBounds(args.bin, args.binStep);
72
+ const gross = maxYInThisBin({
73
+ remaining: args.remaining,
74
+ sqrtPb,
75
+ liquidity: args.liquidity,
76
+ sqrtP: args.sqrtP,
77
+ lpFee: args.lpFee,
78
+ });
79
+ if (gross === 0n) {
80
+ return {
81
+ bin: args.bin,
82
+ newSqrtPrice: args.sqrtP,
83
+ out: 0n,
84
+ remaining: args.remaining,
85
+ lpFee: 0n,
86
+ protocolFee: 0n,
87
+ };
88
+ }
89
+ const fee = q128Mul(args.lpFee, gross);
90
+ const afterFee = gross - fee;
91
+ const change = q128DivFloor(afterFee, args.liquidity);
92
+ const unclamped = args.sqrtP + change;
93
+ const capped = unclamped < sqrtPb ? unclamped : sqrtPb;
94
+ const newSqrtPrice = capped > sqrtPa ? capped : sqrtPa;
95
+ const invOld = q128DivFloor(SCALE, args.sqrtP);
96
+ const invNew = q128DivCeil(SCALE, newSqrtPrice);
97
+ const invDelta = invOld > invNew ? invOld - invNew : 0n;
98
+ const outGross = q128MulFloor(invDelta, args.liquidity);
99
+ const protocolFee = q128Mul(outGross, args.protocolFee);
100
+ return {
101
+ bin: args.bin,
102
+ newSqrtPrice,
103
+ out: outGross - protocolFee,
104
+ remaining: args.remaining - gross,
105
+ lpFee: fee,
106
+ protocolFee,
107
+ };
108
+ }
109
+ /**
110
+ * Runs a swap against a range's bins.
111
+ *
112
+ * `xIn` decides direction: X in walks the price down through lower bins, Y in
113
+ * walks it up. The range stops after forty bins, so a swap large enough to
114
+ * cross more is refused here too, before it is signed.
115
+ */
116
+ export function simulateClmmSwap(args) {
117
+ if (args.amountIn <= 0n)
118
+ throw new RangeError('amountIn must be positive');
119
+ const lpFee = feeFraction(args.lpFeeBps);
120
+ const protocolFee = feeFraction(args.protocolFeeBps);
121
+ const keys = [...args.bins.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
122
+ const liquidityOf = (bin) => args.bins.get(bin)?.l ?? 0n;
123
+ /** Next bin in the direction of travel, as the range picks it. */
124
+ const nextBin = (from) => {
125
+ if (args.xIn) {
126
+ let found = null;
127
+ for (const key of keys)
128
+ if (key < from)
129
+ found = key;
130
+ return found;
131
+ }
132
+ for (const key of keys)
133
+ if (key > from)
134
+ return key;
135
+ return null;
136
+ };
137
+ let bin = BigInt(args.currentBin);
138
+ let sqrtP = args.currentSqrtPrice;
139
+ // As on chain: a missing current bin is
140
+ // skipped to the nearest one in the direction of travel.
141
+ if (!args.bins.has(bin)) {
142
+ const moved = nextBin(bin);
143
+ if (moved === null) {
144
+ return {
145
+ amountOut: 0n,
146
+ newSqrtPrice: sqrtP,
147
+ binsCrossed: [],
148
+ lpFees: 0n,
149
+ protocolFees: 0n,
150
+ unfilled: args.amountIn,
151
+ };
152
+ }
153
+ bin = moved;
154
+ sqrtP = args.xIn
155
+ ? sqrtPriceEnteringBin(Number(bin), args.binStep)
156
+ : sqrtPriceAtBin(Number(bin), args.binStep);
157
+ }
158
+ let remaining = args.amountIn;
159
+ let amountOut = 0n;
160
+ let lpFees = 0n;
161
+ let protocolFees = 0n;
162
+ const binsCrossed = [];
163
+ for (let iteration = 0;; iteration++) {
164
+ if (iteration >= MAX_BINS_PER_SWAP) {
165
+ throw new LimitExceededError('this swap would cross more bins than one transaction can', MAX_BINS_PER_SWAP, iteration + 1, 'Split it into smaller swaps.');
166
+ }
167
+ const liquidity = liquidityOf(bin);
168
+ const step = (args.xIn ? stepXToY : stepYToX)({
169
+ remaining,
170
+ bin: Number(bin),
171
+ liquidity,
172
+ sqrtP,
173
+ lpFee,
174
+ protocolFee,
175
+ binStep: args.binStep,
176
+ });
177
+ sqrtP = step.newSqrtPrice;
178
+ remaining = step.remaining;
179
+ amountOut += step.out;
180
+ lpFees += step.lpFee;
181
+ protocolFees += step.protocolFee;
182
+ if (!binsCrossed.includes(Number(bin)))
183
+ binsCrossed.push(Number(bin));
184
+ if (remaining <= 0n)
185
+ break;
186
+ const moved = nextBin(bin);
187
+ if (moved === null) {
188
+ // The range throws 5 here; report the rest as unfilled instead.
189
+ return {
190
+ amountOut,
191
+ newSqrtPrice: sqrtP,
192
+ binsCrossed,
193
+ lpFees,
194
+ protocolFees,
195
+ unfilled: remaining,
196
+ };
197
+ }
198
+ bin = moved;
199
+ sqrtP = args.xIn
200
+ ? sqrtPriceEnteringBin(Number(bin), args.binStep)
201
+ : sqrtPriceAtBin(Number(bin), args.binStep);
202
+ }
203
+ return { amountOut, newSqrtPrice: sqrtP, binsCrossed, lpFees, protocolFees, unfilled: 0n };
204
+ }
205
+ /**
206
+ * Turns a slippage tolerance into the Q128 price bound the range expects.
207
+ *
208
+ * CLMM bounds a swap by price, not by output: X in must keep the price above
209
+ * the bound, Y in must keep it below. Zero means unbounded, which on a live
210
+ * pool means accepting any price at all.
211
+ */
212
+ export function sqrtPriceLimitFor(args) {
213
+ if (args.slippageBps <= 0)
214
+ return 0n;
215
+ // Tolerance is on price, the limit is on sqrt price: take the root of the factor.
216
+ const bound = args.xIn ? 10_000 - args.slippageBps : 10_000 + args.slippageBps;
217
+ const factor = mulDivFloor(BigInt(bound), SCALE, 10000n);
218
+ return q128Mul(args.currentSqrtPrice, q128Sqrt(factor));
219
+ }
220
+ /**
221
+ * Allowance for the range's integer rounding, which the real-number bound
222
+ * in {@link guaranteedOutAtLimit} ignores. Per crossed bin (at most forty)
223
+ * the range can lose up to:
224
+ *
225
+ * input — LP fee `q128Mul`, to nearest: ½ unit
226
+ * input — `q128DivCeil` of the bin's gross need:
227
+ * ~2 units, on every bin the swap exhausts (all but the last)
228
+ * output — `q128MulFloor`: 1 unit
229
+ * output — protocol fee `q128Mul`, to nearest: ½ unit
230
+ */
231
+ const DUST_IN = 4n * BigInt(MAX_BINS_PER_SWAP);
232
+ const DUST_OUT = 2n * BigInt(MAX_BINS_PER_SWAP);
233
+ /**
234
+ * Output guaranteed by the price limit, the only on-chain guard a CLMM swap has.
235
+ *
236
+ * A CLMM swap message carries no `minOut`: the range checks the price after
237
+ * every bin and refunds the whole input if the limit is crossed. The minimum
238
+ * received is therefore what follows from the limit, and this computes it.
239
+ *
240
+ * Price moves monotonically during a swap, so every chunk of input converts
241
+ * at a price no worse than the limit. The LP fee comes off the input and the
242
+ * protocol fee off the output:
243
+ *
244
+ * xIn: out ≥ (Δin − LP) · p_lim · (1 − f_pr)
245
+ * yIn: out ≥ (Δin − LP) / p_lim · (1 − f_pr), p = (sqrtP/2¹²⁸)²
246
+ *
247
+ * The bound is deliberately loose. The quote places the limit one slippage
248
+ * tolerance beyond the post-trade price, so actual output usually exceeds
249
+ * the guarantee by about that tolerance; equality needs the whole swap to
250
+ * fill at the limit price.
251
+ *
252
+ * Rounding always goes against the caller: both fees round up and both
253
+ * price conversions round down.
254
+ */
255
+ export function guaranteedOutAtLimit(args) {
256
+ // Zero disables the guard on chain, so nothing is guaranteed.
257
+ if (args.sqrtPriceLimit === 0n)
258
+ return 0n;
259
+ if (args.amountIn <= 0n)
260
+ return 0n;
261
+ const limit = args.sqrtPriceLimit;
262
+ // The range's fee fraction is mulDivFloor(bps, SCALE, 10000), never above
263
+ // bps/10000, so a ceiling is safe.
264
+ const netIn = args.amountIn - mulDivCeil(args.amountIn, BigInt(args.lpFeeBps), 10000n) - DUST_IN;
265
+ if (netIn <= 0n)
266
+ return 0n;
267
+ // Two floored Q128 steps instead of squaring the limit: same answer without
268
+ // a 512-bit intermediate, and each step rounds in the safe direction.
269
+ const grossOut = args.xIn
270
+ ? q128MulFloor(q128MulFloor(netIn, limit), limit)
271
+ : q128DivFloor(q128DivFloor(netIn, limit), limit);
272
+ if (grossOut <= 0n)
273
+ return 0n;
274
+ const netOut = grossOut - mulDivCeil(grossOut, BigInt(args.protocolFeeBps), 10000n) - DUST_OUT;
275
+ return netOut > 0n ? netOut : 0n;
276
+ }
277
+ //# sourceMappingURL=clmm-swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clmm-swap.js","sourceRoot":"","sources":["../../src/math/clmm-swap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * CLMM bin and price arithmetic, as the ranges compute it on chain.
3
+ *
4
+ * Liquidity is held in discrete bins whose price bounds form a geometric
5
+ * series with ratio `1 + binStep/10000`.
6
+ *
7
+ * Every upper bound is exactly the next bin's lower bound, including odd and
8
+ * negative bins; multiplying the lower bound by sqrt(1+beta) again would
9
+ * round differently from the range.
10
+ */
11
+ /** Bins per range. A pool is split across several ranges. */
12
+ export declare const BINS_PER_RANGE: number;
13
+ /** Offset that centres range 0 on bin 0. */
14
+ export declare const RANGE_OFFSET: number;
15
+ /** Bin steps the factory accepts, in basis points. */
16
+ export declare const BIN_STEPS: readonly [25, 50, 100, 200];
17
+ /**
18
+ * A bin step the factory will accept.
19
+ *
20
+ * A union rather than an enum, because the package compiles under
21
+ * `erasableSyntaxOnly`; it still rejects `binStep: 30` at compile time.
22
+ */
23
+ export type BinStep = (typeof BIN_STEPS)[number];
24
+ /**
25
+ * The four bin steps. The digits are the value: `Bps25` is `25`.
26
+ *
27
+ * A narrower step concentrates liquidity harder — better fills, but the market
28
+ * leaves the position sooner.
29
+ */
30
+ export declare const BinStep: {
31
+ /** 0.25% per bin — "micro bins", stable pairs. */
32
+ readonly Bps25: 25;
33
+ /** 0.50% per bin — "tight bins", stable pairs. */
34
+ readonly Bps50: 50;
35
+ /** 1.00% per bin — "wide bins", volatile pairs. */
36
+ readonly Bps100: 100;
37
+ /** 2.00% per bin — "broad bins", exotic pairs. */
38
+ readonly Bps200: 200;
39
+ };
40
+ /** Whether a number is one of the four the factory accepts. */
41
+ export declare function isBinStep(value: number): value is BinStep;
42
+ /** Range indices the protocol currently deploys. */
43
+ export declare const RANGE_MIN: number;
44
+ export declare const RANGE_MAX: number;
45
+ /**
46
+ * Bins a single position may span.
47
+ *
48
+ * The deposit also aborts once it has burned 940 000 gas, so a wide deposit
49
+ * into an already-crowded range can fail below this cap; there is no way to
50
+ * know that before sending.
51
+ */
52
+ export declare const MAX_BINS_PER_POSITION = 50;
53
+ /** Bins one swap may cross before the range gives up. */
54
+ export declare const MAX_BINS_PER_SWAP = 40;
55
+ /** First bin belonging to a range. */
56
+ export declare function firstBinOfRange(range: number): number;
57
+ /** Last bin belonging to a range. */
58
+ export declare function lastBinOfRange(range: number): number;
59
+ /**
60
+ * Which range holds a bin.
61
+ *
62
+ * Rounds down, not toward zero. TVM divides toward negative infinity, and the
63
+ * difference is not academic: bin −1025 belongs to range −1, but truncation
64
+ * would put it in range 0 and send the message to a range that does not
65
+ * own that bin.
66
+ */
67
+ export declare function rangeOfBin(bin: number): number;
68
+ /** Lowest and highest bins any deployed range covers. */
69
+ export declare function binCoverage(): {
70
+ min: number;
71
+ max: number;
72
+ };
73
+ /** `1 + binStep/10000` in Q128, as the range computes it. */
74
+ export declare function onePlusBeta(binStep: number): bigint;
75
+ /** Square root of {@link onePlusBeta}, in Q128. */
76
+ export declare function sqrtOnePlusBeta(binStep: number): bigint;
77
+ /**
78
+ * Lower price bound of a bin, as a Q128 square root.
79
+ *
80
+ * Odd bins are computed as `(1+β)^(n>>1) · sqrt(1+β)` rather than by raising to
81
+ * a half power — matching the range's own shortcut, rounding included.
82
+ */
83
+ export declare function sqrtPriceAtBin(bin: number, binStep: number): bigint;
84
+ /**
85
+ * Upper bound of a bin, where a swap moving the price down enters it. The
86
+ * range uses this same boundary for liquidity and swap arithmetic.
87
+ */
88
+ export declare function sqrtPriceEnteringBin(bin: number, binStep: number): bigint;
89
+ /** Both price bounds of a bin, as Q128 square roots. */
90
+ export declare function binBounds(bin: number, binStep: number): {
91
+ sqrtPa: bigint;
92
+ sqrtPb: bigint;
93
+ };
94
+ /**
95
+ * Price from a Q128 square root, as a JavaScript number.
96
+ *
97
+ * For display only. The value is squared and scaled down, so it loses
98
+ * precision — never feed it back into anything that builds a transaction.
99
+ */
100
+ export declare function sqrtPriceToPrice(sqrtPrice: bigint, decimalsX?: number, decimalsY?: number): number;
101
+ /**
102
+ * The bin containing a price expressed in **raw** units — token Y per token X
103
+ * before decimals are applied.
104
+ *
105
+ * Containment, not proximity. A bin owns the half-open interval
106
+ * `[Pa(n), Pa(n+1))`, so a price anywhere in the upper part of a bin still
107
+ * belongs to that bin and not to the next one. When you want the closest
108
+ * boundary instead, ask for it by name: {@link nearestBinToRawPrice}.
109
+ *
110
+ * Named apart from `pool.binAtPrice`, which takes the price as a person would
111
+ * write it. Feeding a human price here puts the bin thousands of steps away
112
+ * whenever the two assets have different decimals.
113
+ */
114
+ export declare function binAtRawPrice(rawPrice: number, binStep: number): number;
115
+ /**
116
+ * The bin whose lower bound lies **closest** to a raw price — the nearest
117
+ * boundary, not the bin the price falls into.
118
+ *
119
+ * Only pool creation wants this: the factory accepts any `initBin`, and
120
+ * rounding to the nearest boundary opens the pool at the price the creator
121
+ * actually asked for rather than up to a whole bin below it. Everything that
122
+ * asks "where does this price live?" wants {@link binAtRawPrice}.
123
+ */
124
+ export declare function nearestBinToRawPrice(rawPrice: number, binStep: number): number;
125
+ /** Human-readable price of a bin, decimals applied. */
126
+ export declare function priceAtBin(bin: number, binStep: number, decimalsX?: number, decimalsY?: number): number;
127
+ /**
128
+ * Converts a human price into a bin, accounting for the two tokens' decimals.
129
+ *
130
+ * A pool of TON (9 decimals) against a 6-decimal jetton prices very differently
131
+ * in raw units than it does on screen; getting this wrong puts a position
132
+ * thousands of bins away from the market.
133
+ */
134
+ export declare function binAtHumanPrice(args: {
135
+ price: number;
136
+ binStep: number;
137
+ decimalsX: number;
138
+ decimalsY: number;
139
+ }): number;
140
+ /**
141
+ * {@link nearestBinToRawPrice} for a human price, decimals accounted for.
142
+ *
143
+ * The counterpart of {@link binAtHumanPrice}: nearest boundary rather than
144
+ * containment. Pool creation is the one caller that means it.
145
+ */
146
+ export declare function nearestBinToHumanPrice(args: {
147
+ price: number;
148
+ binStep: number;
149
+ decimalsX: number;
150
+ decimalsY: number;
151
+ }): number;
152
+ export type Contribution = {
153
+ /** Liquidity credited to the position for this bin. */
154
+ liquidity: bigint;
155
+ /** Amounts actually consumed. */
156
+ used: {
157
+ x: bigint;
158
+ y: bigint;
159
+ };
160
+ /** Amounts handed back because the bin could not absorb them. */
161
+ refund: {
162
+ x: bigint;
163
+ y: bigint;
164
+ };
165
+ };
166
+ /**
167
+ * What one bin does with the amounts offered to it.
168
+ *
169
+ * A bin below the current price takes only Y; one above takes only X; the bin
170
+ * holding the current price takes both, in the ratio its bounds dictate. The
171
+ * side that runs out first caps the liquidity, and the excess is refunded —
172
+ * which is why an unbalanced deposit silently returns part of itself.
173
+ */
174
+ export declare function contributeLiquidity(args: {
175
+ bin: number;
176
+ currentSqrtPrice: bigint;
177
+ x: bigint;
178
+ y: bigint;
179
+ binStep: number;
180
+ }): Contribution;
181
+ /**
182
+ * What one bin of a position is worth right now.
183
+ *
184
+ * Mirrors a withdrawal from the range: liquidity is converted
185
+ * back into both sides at the price clamped to the bin's own bounds, so a bin
186
+ * the price has moved past holds only one of them.
187
+ */
188
+ export declare function binValue(args: {
189
+ bin: number;
190
+ liquidity: bigint;
191
+ currentSqrtPrice: bigint;
192
+ binStep: number;
193
+ }): {
194
+ x: bigint;
195
+ y: bigint;
196
+ };
197
+ /**
198
+ * Fees one bin owes a position.
199
+ *
200
+ * Mirrors the on-chain fee payout: the range keeps a per-unit-of-liquidity
201
+ * accumulator per bin, the position keeps the value it last settled at, and
202
+ * what is owed is the growth times the position's liquidity in that bin.
203
+ */
204
+ export declare function binFees(args: {
205
+ liquidity: bigint;
206
+ /** The range's current accumulators for this bin. */
207
+ binFees: {
208
+ x: bigint;
209
+ y: bigint;
210
+ };
211
+ /** The position's checkpoint of those accumulators. */
212
+ checkpoint: {
213
+ x: bigint;
214
+ y: bigint;
215
+ };
216
+ }): {
217
+ x: bigint;
218
+ y: bigint;
219
+ };
220
+ /**
221
+ * Which side or sides a bin can take, given where the price sits.
222
+ *
223
+ * Useful before building a deposit: offering X to a bin that only takes Y
224
+ * gets it refunded, minus the gas spent finding out.
225
+ */
226
+ export declare function binSides(args: {
227
+ bin: number;
228
+ currentSqrtPrice: bigint;
229
+ binStep: number;
230
+ }): {
231
+ takesX: boolean;
232
+ takesY: boolean;
233
+ };
234
+ //# sourceMappingURL=clmm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clmm.d.ts","sourceRoot":"","sources":["../../src/math/clmm.ts"],"names":[],"mappings":"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"}