@nradko/metric-omm-sdk-v1 0.0.16

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 (137) hide show
  1. package/README.md +111 -0
  2. package/dist/abis/MetricOmmPool.d.ts +784 -0
  3. package/dist/abis/MetricOmmPool.d.ts.map +1 -0
  4. package/dist/abis/MetricOmmPool.js +1008 -0
  5. package/dist/abis/MetricOmmPool.js.map +1 -0
  6. package/dist/abis/MetricOmmPoolFactory.d.ts +1365 -0
  7. package/dist/abis/MetricOmmPoolFactory.d.ts.map +1 -0
  8. package/dist/abis/MetricOmmPoolFactory.js +1754 -0
  9. package/dist/abis/MetricOmmPoolFactory.js.map +1 -0
  10. package/dist/abis/MetricOmmPoolLiquidityAdder.d.ts +308 -0
  11. package/dist/abis/MetricOmmPoolLiquidityAdder.d.ts.map +1 -0
  12. package/dist/abis/MetricOmmPoolLiquidityAdder.js +401 -0
  13. package/dist/abis/MetricOmmPoolLiquidityAdder.js.map +1 -0
  14. package/dist/abis/MetricOmmPoolStateView.d.ts +538 -0
  15. package/dist/abis/MetricOmmPoolStateView.d.ts.map +1 -0
  16. package/dist/abis/MetricOmmPoolStateView.js +717 -0
  17. package/dist/abis/MetricOmmPoolStateView.js.map +1 -0
  18. package/dist/abis/MetricOmmPoolSwapper.d.ts +557 -0
  19. package/dist/abis/MetricOmmPoolSwapper.d.ts.map +1 -0
  20. package/dist/abis/MetricOmmPoolSwapper.js +723 -0
  21. package/dist/abis/MetricOmmPoolSwapper.js.map +1 -0
  22. package/dist/abis/Multicall3.d.ts +333 -0
  23. package/dist/abis/Multicall3.d.ts.map +1 -0
  24. package/dist/abis/Multicall3.js +441 -0
  25. package/dist/abis/Multicall3.js.map +1 -0
  26. package/dist/abis/PriceProvider.d.ts +142 -0
  27. package/dist/abis/PriceProvider.d.ts.map +1 -0
  28. package/dist/abis/PriceProvider.js +184 -0
  29. package/dist/abis/PriceProvider.js.map +1 -0
  30. package/dist/abis/PriceProviderUi.d.ts +433 -0
  31. package/dist/abis/PriceProviderUi.d.ts.map +1 -0
  32. package/dist/abis/PriceProviderUi.js +318 -0
  33. package/dist/abis/PriceProviderUi.js.map +1 -0
  34. package/dist/abis/index.d.ts +11 -0
  35. package/dist/abis/index.d.ts.map +1 -0
  36. package/dist/abis/index.js +11 -0
  37. package/dist/abis/index.js.map +1 -0
  38. package/dist/addresses.d.ts +52 -0
  39. package/dist/addresses.d.ts.map +1 -0
  40. package/dist/addresses.js +58 -0
  41. package/dist/addresses.js.map +1 -0
  42. package/dist/constants.d.ts +20 -0
  43. package/dist/constants.d.ts.map +1 -0
  44. package/dist/constants.js +26 -0
  45. package/dist/constants.js.map +1 -0
  46. package/dist/factory/collectFees.d.ts +41 -0
  47. package/dist/factory/collectFees.d.ts.map +1 -0
  48. package/dist/factory/collectFees.js +120 -0
  49. package/dist/factory/collectFees.js.map +1 -0
  50. package/dist/factory/index.d.ts +5 -0
  51. package/dist/factory/index.d.ts.map +1 -0
  52. package/dist/factory/index.js +5 -0
  53. package/dist/factory/index.js.map +1 -0
  54. package/dist/index.d.ts +16 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +24 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/pool/create.d.ts +80 -0
  59. package/dist/pool/create.d.ts.map +1 -0
  60. package/dist/pool/create.js +80 -0
  61. package/dist/pool/create.js.map +1 -0
  62. package/dist/pool/index.d.ts +7 -0
  63. package/dist/pool/index.d.ts.map +1 -0
  64. package/dist/pool/index.js +10 -0
  65. package/dist/pool/index.js.map +1 -0
  66. package/dist/pool/liquidity.d.ts +165 -0
  67. package/dist/pool/liquidity.d.ts.map +1 -0
  68. package/dist/pool/liquidity.js +508 -0
  69. package/dist/pool/liquidity.js.map +1 -0
  70. package/dist/pool/read.d.ts +22 -0
  71. package/dist/pool/read.d.ts.map +1 -0
  72. package/dist/pool/read.js +88 -0
  73. package/dist/pool/read.js.map +1 -0
  74. package/dist/router/index.d.ts +5 -0
  75. package/dist/router/index.d.ts.map +1 -0
  76. package/dist/router/index.js +5 -0
  77. package/dist/router/index.js.map +1 -0
  78. package/dist/router/swap.d.ts +117 -0
  79. package/dist/router/swap.d.ts.map +1 -0
  80. package/dist/router/swap.js +298 -0
  81. package/dist/router/swap.js.map +1 -0
  82. package/dist/stateView/index.d.ts +5 -0
  83. package/dist/stateView/index.d.ts.map +1 -0
  84. package/dist/stateView/index.js +5 -0
  85. package/dist/stateView/index.js.map +1 -0
  86. package/dist/stateView/read.d.ts +80 -0
  87. package/dist/stateView/read.d.ts.map +1 -0
  88. package/dist/stateView/read.js +249 -0
  89. package/dist/stateView/read.js.map +1 -0
  90. package/dist/types.d.ts +134 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +6 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/utils/binData.d.ts +65 -0
  95. package/dist/utils/binData.d.ts.map +1 -0
  96. package/dist/utils/binData.js +109 -0
  97. package/dist/utils/binData.js.map +1 -0
  98. package/dist/utils/index.d.ts +7 -0
  99. package/dist/utils/index.d.ts.map +1 -0
  100. package/dist/utils/index.js +10 -0
  101. package/dist/utils/index.js.map +1 -0
  102. package/dist/utils/liquidityMath.d.ts +10 -0
  103. package/dist/utils/liquidityMath.d.ts.map +1 -0
  104. package/dist/utils/liquidityMath.js +31 -0
  105. package/dist/utils/liquidityMath.js.map +1 -0
  106. package/dist/utils/price.d.ts +13 -0
  107. package/dist/utils/price.d.ts.map +1 -0
  108. package/dist/utils/price.js +21 -0
  109. package/dist/utils/price.js.map +1 -0
  110. package/package.json +74 -0
  111. package/src/abis/MetricOmmPool.ts +1007 -0
  112. package/src/abis/MetricOmmPoolFactory.ts +1753 -0
  113. package/src/abis/MetricOmmPoolLiquidityAdder.ts +400 -0
  114. package/src/abis/MetricOmmPoolStateView.ts +716 -0
  115. package/src/abis/MetricOmmPoolSwapper.ts +722 -0
  116. package/src/abis/Multicall3.ts +440 -0
  117. package/src/abis/PriceProvider.ts +183 -0
  118. package/src/abis/PriceProviderUi.ts +317 -0
  119. package/src/abis/index.ts +11 -0
  120. package/src/addresses.ts +100 -0
  121. package/src/constants.ts +35 -0
  122. package/src/factory/collectFees.ts +197 -0
  123. package/src/factory/index.ts +12 -0
  124. package/src/index.ts +157 -0
  125. package/src/pool/create.ts +158 -0
  126. package/src/pool/index.ts +47 -0
  127. package/src/pool/liquidity.ts +839 -0
  128. package/src/pool/read.ts +131 -0
  129. package/src/router/index.ts +27 -0
  130. package/src/router/swap.ts +507 -0
  131. package/src/stateView/index.ts +18 -0
  132. package/src/stateView/read.ts +355 -0
  133. package/src/types.ts +162 -0
  134. package/src/utils/binData.ts +127 -0
  135. package/src/utils/index.ts +26 -0
  136. package/src/utils/liquidityMath.ts +47 -0
  137. package/src/utils/price.ts +23 -0
@@ -0,0 +1,508 @@
1
+ /**
2
+ * MetricAMM SDK - Liquidity
3
+ * Unified liquidity calculations and position operations.
4
+ */
5
+ import { encodeFunctionData } from "viem";
6
+ import { Q64, MAX_UINT104, MAX_INT104, MAX_INT128, LIQUIDITY_ADDER_ABI } from "../constants.js";
7
+ import { MetricOmmPoolAbi } from "../abis/MetricOmmPool.js";
8
+ import { getPoolImmutables } from "./read.js";
9
+ import { getSlot0, getBinStatesScaled, getPositionBinSharesRange, getPositionBinSharesForBins, } from "../stateView/read.js";
10
+ import { ONE_E18, ceilDiv, toPriceE18, convertToken0ToToken1, convertToken1ToToken0, scaledPositiveDeltaToExternal, } from "../utils/liquidityMath.js";
11
+ export { convertToken0ToToken1, convertToken1ToToken0 };
12
+ export const getPositionShares = getPositionBinSharesRange;
13
+ export const getPositionSharesForBins = getPositionBinSharesForBins;
14
+ export const NO_SLIPPAGE_LIMIT = MAX_INT128;
15
+ /**
16
+ * Prepare uniform liquidity distribution across a bin range.
17
+ */
18
+ export async function buildModifyLiquidityArgsForUniformAddition({ publicClient, factoryAddress, stateViewAddress, poolAddress, amountInTokensPerBin, amountIsInToken0, currentPrice, lowerBin, upperBin, salt = 0n, specAmountBufferPercent = 0, }) {
19
+ if (lowerBin > upperBin) {
20
+ throw new Error("lowerBin must be <= upperBin");
21
+ }
22
+ const bins = [];
23
+ for (let bin = lowerBin; bin <= upperBin; bin++) {
24
+ bins.push({
25
+ bin,
26
+ targetValueInToken: amountInTokensPerBin,
27
+ targetValueInToken0: amountIsInToken0,
28
+ });
29
+ }
30
+ return buildModifyLiquidityArgsForAddition({
31
+ publicClient,
32
+ factoryAddress,
33
+ stateViewAddress,
34
+ poolAddress,
35
+ bins,
36
+ currentPrice,
37
+ salt,
38
+ specAmountBufferPercent,
39
+ });
40
+ }
41
+ /**
42
+ * Prepare uniform liquidity across arbitrary bins from a TOTAL value budget.
43
+ *
44
+ * Algorithm:
45
+ * 1. Calibrate by assigning weighted 1e18 targets per bin with zero buffer.
46
+ * 2. Compute linear scale so selected specAmount token matches totalValueToAddInToken.
47
+ * 3. Rebuild with scaled per-bin value and caller-provided specAmountBufferPercent.
48
+ */
49
+ export async function buildModifyLiquidityArgsForUniformAdditionWithTotalTokenAmount({ publicClient, factoryAddress, stateViewAddress, poolAddress, bins, weights, totalValueToAddInToken, totalValueInToken0, currentPriceX64, salt = 0n, specAmountBufferPercent = 0, }) {
50
+ validateSpecAmountBufferPercent(specAmountBufferPercent);
51
+ if (!Array.isArray(bins) || bins.length === 0) {
52
+ throw new Error("bins must be a non-empty array");
53
+ }
54
+ if (weights != null) {
55
+ if (!Array.isArray(weights) || weights.length !== bins.length) {
56
+ throw new Error("weights must be an array with the same length as bins");
57
+ }
58
+ }
59
+ const uniqueBins = new Set(bins);
60
+ if (uniqueBins.size !== bins.length) {
61
+ throw new Error("bins must not contain duplicates");
62
+ }
63
+ if (totalValueToAddInToken <= 0n) {
64
+ throw new Error("totalValueToAddInToken must be > 0");
65
+ }
66
+ if (currentPriceX64 <= 0n) {
67
+ throw new Error("currentPriceX64 must be > 0");
68
+ }
69
+ const currentPrice = Number(currentPriceX64.toString()) / Number(Q64.toString());
70
+ if (!Number.isFinite(currentPrice) || currentPrice <= 0) {
71
+ throw new Error("currentPriceX64 is out of supported numeric range");
72
+ }
73
+ const calibrationValue = totalValueToAddInToken / BigInt(bins.length) + 1n;
74
+ const calibrationTargets = weights
75
+ ? weights.map((w) => (calibrationValue * BigInt(Math.ceil(w * 1e6) + 1)) / 1000000n)
76
+ : Array(bins.length).fill(calibrationValue);
77
+ const calibrationBins = bins.map((bin, i) => ({
78
+ bin,
79
+ targetValueInToken: calibrationTargets[i],
80
+ targetValueInToken0: totalValueInToken0,
81
+ }));
82
+ const [, , calibrationSpecAmount0, calibrationSpecAmount1] = await buildModifyLiquidityArgsForAddition({
83
+ publicClient,
84
+ factoryAddress,
85
+ stateViewAddress,
86
+ poolAddress,
87
+ bins: calibrationBins,
88
+ currentPrice,
89
+ salt,
90
+ specAmountBufferPercent: 0,
91
+ });
92
+ const calibrationSpecAmount = totalValueInToken0
93
+ ? calibrationSpecAmount0
94
+ : calibrationSpecAmount1;
95
+ if (calibrationSpecAmount <= 0n) {
96
+ throw new Error("failed to calibrate uniform total amount scaling: specAmount is zero");
97
+ }
98
+ const scaledBins = bins.map((bin, i) => ({
99
+ bin,
100
+ targetValueInToken: (calibrationTargets[i] * totalValueToAddInToken) / calibrationSpecAmount,
101
+ targetValueInToken0: totalValueInToken0,
102
+ }));
103
+ return buildModifyLiquidityArgsForAddition({
104
+ publicClient,
105
+ factoryAddress,
106
+ stateViewAddress,
107
+ poolAddress,
108
+ bins: scaledBins,
109
+ currentPrice,
110
+ salt,
111
+ specAmountBufferPercent,
112
+ });
113
+ }
114
+ /**
115
+ * Prepare per-bin liquidity distribution from arbitrary per-bin amounts.
116
+ *
117
+ * Each input entry defines a single bin and a value expressed in token0 or token1.
118
+ * The function computes `deltaShares` for every bin and totals `specAmount0/specAmount1`
119
+ * needed to execute `modifyLiquidity` safely.
120
+ *
121
+ * ## Algorithm Overview
122
+ *
123
+ * This is the core distribution engine used by both:
124
+ * - direct per-bin plans (computeModifyLiquidityForAddition)
125
+ * - uniform plans via adapter (computeModifyLiquidityForUniformAddition)
126
+ *
127
+ * ## Steps
128
+ *
129
+ * 1. Validate inputs, price, bin range, and reject duplicate bins.
130
+ * 2. Convert each bin target into both token0/token1 amounts using current price.
131
+ * 3. Fetch slot0 and bin states, then classify each bin as below/current/above.
132
+ * 4. Compute shares to add using ceiling division to avoid under-provisioning:
133
+ * - Existing bins: proportional to current scaled balances and total shares.
134
+ * - Empty bins: derived from initial scaled per-share constants.
135
+ * 5. Convert scaled amounts back to external token amounts and accumulate
136
+ * `specAmount0/specAmount1` with overflow checks.
137
+ */
138
+ export async function buildModifyLiquidityArgsForAddition({ publicClient, factoryAddress, stateViewAddress, poolAddress, bins, currentPrice, salt = 0n, specAmountBufferPercent = 0, }) {
139
+ validateSpecAmountBufferPercent(specAmountBufferPercent);
140
+ if (!Array.isArray(bins)) {
141
+ throw new Error("bins must be an array");
142
+ }
143
+ if (bins.length === 0) {
144
+ return [salt, [], 0n, 0n];
145
+ }
146
+ const immutables = await getPoolImmutables(publicClient, factoryAddress, poolAddress);
147
+ const priceE18 = toPriceE18(currentPrice);
148
+ const targetsByBin = new Map();
149
+ for (const entry of bins) {
150
+ if (!Number.isInteger(entry.bin)) {
151
+ throw new Error(`bin must be an integer, got ${entry.bin}`);
152
+ }
153
+ if (entry.bin < immutables.lowestBin || entry.bin > immutables.highestBin) {
154
+ throw new Error(`bin ${entry.bin} is out of range [${immutables.lowestBin}, ${immutables.highestBin}]`);
155
+ }
156
+ if (entry.targetValueInToken <= 0n) {
157
+ throw new Error(`amountInToken for bin ${entry.bin} must be > 0`);
158
+ }
159
+ const amount0 = entry.targetValueInToken0
160
+ ? entry.targetValueInToken
161
+ : convertToken1ToToken0(entry.targetValueInToken, immutables.token0ScaleMultiplier, immutables.token1ScaleMultiplier, priceE18);
162
+ const amount1 = entry.targetValueInToken0
163
+ ? convertToken0ToToken1(entry.targetValueInToken, immutables.token0ScaleMultiplier, immutables.token1ScaleMultiplier, priceE18)
164
+ : entry.targetValueInToken;
165
+ const targetValueInToken1 = entry.targetValueInToken0
166
+ ? convertToken0ToToken1(entry.targetValueInToken, immutables.token0ScaleMultiplier, immutables.token1ScaleMultiplier, priceE18)
167
+ : entry.targetValueInToken;
168
+ if (targetsByBin.has(entry.bin)) {
169
+ throw new Error(`duplicate bin ${entry.bin} is not supported`);
170
+ }
171
+ targetsByBin.set(entry.bin, {
172
+ targetAmount0: amount0,
173
+ targetAmount1: amount1,
174
+ targetValueInToken1,
175
+ });
176
+ }
177
+ const binIndices = Array.from(targetsByBin.keys()).sort((a, b) => a - b);
178
+ const [slot0, binStates] = await Promise.all([
179
+ getSlot0(publicClient, stateViewAddress, poolAddress),
180
+ getBinStatesScaled(publicClient, stateViewAddress, poolAddress, binIndices),
181
+ ]);
182
+ const deltas = [];
183
+ let specAmount0 = 0n;
184
+ let specAmount1 = 0n;
185
+ const curBinIdx = slot0.curBinIdx;
186
+ const curPosInBin = slot0.curPosInBin;
187
+ for (let i = 0; i < binIndices.length; i++) {
188
+ const binIdx = binIndices[i];
189
+ const target = targetsByBin.get(binIdx);
190
+ if (!target) {
191
+ throw new Error(`internal error: missing target for bin ${binIdx}`);
192
+ }
193
+ const targetAmount0Scaled = target.targetAmount0 * immutables.token0ScaleMultiplier;
194
+ const targetAmount1Scaled = target.targetAmount1 * immutables.token1ScaleMultiplier;
195
+ const targetValueInToken1Scaled = target.targetValueInToken1 * immutables.token1ScaleMultiplier;
196
+ const token0BalanceScaled = binStates.token0BalancesScaled[i];
197
+ const token1BalanceScaled = binStates.token1BalancesScaled[i];
198
+ const totalShares = binStates.totalShares[i];
199
+ const isBelowBin = binIdx < curBinIdx || (binIdx === curBinIdx && curPosInBin === MAX_UINT104);
200
+ const isAboveBin = binIdx > curBinIdx || (binIdx === curBinIdx && curPosInBin === 0n);
201
+ let sharesToAdd;
202
+ if (isBelowBin) {
203
+ if (targetAmount1Scaled <= 0n) {
204
+ throw new Error(`amount for bin ${binIdx} is too small after conversion and results in 0 token1 target`);
205
+ }
206
+ if (totalShares > 0n) {
207
+ if (token1BalanceScaled <= 0n) {
208
+ throw new Error(`bin ${binIdx} has zero token1 balance with non-zero shares`);
209
+ }
210
+ sharesToAdd = ceilDiv(targetAmount1Scaled * totalShares, token1BalanceScaled);
211
+ }
212
+ else {
213
+ sharesToAdd = ceilDiv(targetAmount1Scaled * ONE_E18, immutables.initialScaledToken1PerShareE18);
214
+ }
215
+ }
216
+ else if (isAboveBin) {
217
+ if (targetAmount0Scaled <= 0n) {
218
+ throw new Error(`amount for bin ${binIdx} is too small after conversion and results in 0 token0 target`);
219
+ }
220
+ if (totalShares > 0n) {
221
+ if (token0BalanceScaled <= 0n) {
222
+ throw new Error(`bin ${binIdx} has zero token0 balance with non-zero shares`);
223
+ }
224
+ sharesToAdd = ceilDiv(targetAmount0Scaled * totalShares, token0BalanceScaled);
225
+ }
226
+ else {
227
+ sharesToAdd = ceilDiv(targetAmount0Scaled * ONE_E18, immutables.initialScaledToken0PerShareE18);
228
+ }
229
+ }
230
+ else {
231
+ if (totalShares > 0n) {
232
+ const totalValueInToken1Scaled = token1BalanceScaled + convertToken0ToToken1(token0BalanceScaled, 1n, 1n, priceE18);
233
+ sharesToAdd = (targetValueInToken1Scaled * totalShares) / totalValueInToken1Scaled;
234
+ }
235
+ else {
236
+ const token0Portion = MAX_UINT104 - curPosInBin;
237
+ const token1Portion = curPosInBin;
238
+ sharesToAdd =
239
+ (targetValueInToken1Scaled * ONE_E18) /
240
+ ((immutables.initialScaledToken1PerShareE18 * token1Portion +
241
+ (immutables.initialScaledToken0PerShareE18 * token0Portion * priceE18) / ONE_E18) /
242
+ MAX_UINT104);
243
+ }
244
+ }
245
+ if (sharesToAdd === 0n) {
246
+ sharesToAdd = 1n;
247
+ }
248
+ if (sharesToAdd > MAX_INT104) {
249
+ throw new Error(`sharesToAdd (${sharesToAdd}) for bin ${binIdx} exceeds int104 max`);
250
+ }
251
+ const [amount0ScaledToAdd, amount1ScaledToAdd] = totalShares > 0n
252
+ ? [
253
+ ceilDiv(sharesToAdd * token0BalanceScaled, totalShares),
254
+ ceilDiv(sharesToAdd * token1BalanceScaled, totalShares),
255
+ ]
256
+ : isBelowBin
257
+ ? [0n, ceilDiv(sharesToAdd * immutables.initialScaledToken1PerShareE18, ONE_E18)]
258
+ : isAboveBin
259
+ ? [ceilDiv(sharesToAdd * immutables.initialScaledToken0PerShareE18, ONE_E18), 0n]
260
+ : (() => {
261
+ const token0Portion = MAX_UINT104 - curPosInBin;
262
+ const token1Portion = curPosInBin;
263
+ return [
264
+ ceilDiv(sharesToAdd * immutables.initialScaledToken0PerShareE18 * token0Portion, ONE_E18 * MAX_UINT104),
265
+ ceilDiv(sharesToAdd * immutables.initialScaledToken1PerShareE18 * token1Portion, ONE_E18 * MAX_UINT104),
266
+ ];
267
+ })();
268
+ const amount0External = scaledPositiveDeltaToExternal(amount0ScaledToAdd, immutables.token0ScaleMultiplier);
269
+ const amount1External = scaledPositiveDeltaToExternal(amount1ScaledToAdd, immutables.token1ScaleMultiplier);
270
+ specAmount0 += amount0External;
271
+ specAmount1 += amount1External;
272
+ if (specAmount0 > MAX_INT128 || specAmount1 > MAX_INT128) {
273
+ throw new Error("specAmount exceeds int128 max");
274
+ }
275
+ deltas.push({
276
+ bin: binIdx,
277
+ deltaShares: sharesToAdd,
278
+ });
279
+ }
280
+ const computed = {
281
+ salt,
282
+ deltas,
283
+ specAmount0: applySpecAmountBuffer(specAmount0, specAmountBufferPercent),
284
+ specAmount1: applySpecAmountBuffer(specAmount1, specAmountBufferPercent),
285
+ };
286
+ return toModifyLiquidityArgs(computed);
287
+ }
288
+ export async function buildModifyLiquidityArgsForRemoval(params) {
289
+ const { publicClient, stateViewAddress, poolAddress, owner, salt, specs, specAmountBufferPercent = 0, } = params;
290
+ validateSpecAmountBufferPercent(specAmountBufferPercent);
291
+ if (specs.length === 0) {
292
+ return [salt, [], NO_SLIPPAGE_LIMIT, NO_SLIPPAGE_LIMIT];
293
+ }
294
+ for (const spec of specs) {
295
+ if (spec.percentageToRemove != null && spec.sharesToRemove != null) {
296
+ throw new Error(`Bin ${spec.bin}: specify either percentageToRemove or sharesToRemove, not both`);
297
+ }
298
+ if (spec.percentageToRemove == null && spec.sharesToRemove == null) {
299
+ throw new Error(`Bin ${spec.bin}: must specify either percentageToRemove or sharesToRemove`);
300
+ }
301
+ if (spec.percentageToRemove != null &&
302
+ (spec.percentageToRemove <= 0 || spec.percentageToRemove > 100)) {
303
+ throw new Error(`Bin ${spec.bin}: percentageToRemove must be between 0 and 100`);
304
+ }
305
+ }
306
+ const binIndices = specs.map((s) => s.bin);
307
+ const positionShares = await getPositionBinSharesForBins(publicClient, stateViewAddress, poolAddress, owner, salt, binIndices);
308
+ const sharesMap = new Map(positionShares.map((p) => [p.binIdx, p.shares]));
309
+ const deltas = [];
310
+ for (const spec of specs) {
311
+ const currentShares = sharesMap.get(spec.bin) ?? 0n;
312
+ if (currentShares === 0n)
313
+ continue;
314
+ let sharesToRemove;
315
+ if (spec.sharesToRemove != null) {
316
+ sharesToRemove = spec.sharesToRemove > currentShares ? currentShares : spec.sharesToRemove;
317
+ }
318
+ else {
319
+ sharesToRemove =
320
+ spec.percentageToRemove === 100
321
+ ? currentShares
322
+ : (currentShares * BigInt(Math.floor(spec.percentageToRemove * 100))) / 10000n;
323
+ }
324
+ if (sharesToRemove > 0n) {
325
+ deltas.push({
326
+ bin: spec.bin,
327
+ deltaShares: -sharesToRemove,
328
+ });
329
+ }
330
+ }
331
+ const computed = {
332
+ salt,
333
+ deltas,
334
+ specAmount0: applySpecAmountBuffer(NO_SLIPPAGE_LIMIT, specAmountBufferPercent),
335
+ specAmount1: applySpecAmountBuffer(NO_SLIPPAGE_LIMIT, specAmountBufferPercent),
336
+ };
337
+ return toModifyLiquidityArgs(computed);
338
+ }
339
+ export async function buildModifyLiquidityArgsForPercentageRemoval({ publicClient, factoryAddress, stateViewAddress, poolAddress, owner, salt, percentageToRemove, bins, lowerBin = -10, upperBin = 10, specAmountBufferPercent = 0, }) {
340
+ validateSpecAmountBufferPercent(specAmountBufferPercent);
341
+ if (percentageToRemove <= 0 || percentageToRemove > 100) {
342
+ throw new Error("percentageToRemove must be between 0 and 100");
343
+ }
344
+ const binsWithShares = bins
345
+ ? bins
346
+ : (await getPositionBinSharesRange(publicClient, stateViewAddress, poolAddress, owner, salt, lowerBin, upperBin)).map((p) => p.binIdx);
347
+ if (binsWithShares.length === 0) {
348
+ return [salt, [], NO_SLIPPAGE_LIMIT, NO_SLIPPAGE_LIMIT];
349
+ }
350
+ const specs = binsWithShares.map((bin) => ({
351
+ bin,
352
+ percentageToRemove,
353
+ }));
354
+ return buildModifyLiquidityArgsForRemoval({
355
+ publicClient,
356
+ factoryAddress,
357
+ stateViewAddress,
358
+ poolAddress,
359
+ owner,
360
+ salt,
361
+ specs,
362
+ specAmountBufferPercent,
363
+ });
364
+ }
365
+ export function additionPlanToPoolLiquidityDelta(deltas) {
366
+ const pos = deltas.filter((d) => d.deltaShares > 0n).sort((a, b) => a.bin - b.bin);
367
+ return {
368
+ binIdxs: pos.map((d) => BigInt(d.bin)),
369
+ shares: pos.map((d) => d.deltaShares),
370
+ };
371
+ }
372
+ export function removalPlanToPoolLiquidityDelta(deltas) {
373
+ const burn = deltas.filter((d) => d.deltaShares < 0n).sort((a, b) => a.bin - b.bin);
374
+ return {
375
+ binIdxs: burn.map((d) => BigInt(d.bin)),
376
+ shares: burn.map((d) => -d.deltaShares),
377
+ };
378
+ }
379
+ const WAD = 10n ** 18n;
380
+ /**
381
+ * Matches `MetricOmmPoolLiquidityAdder._scaleWeightsToShares`: given probe token needs from a weighted
382
+ * probe with the same weight vector, scale integer shares so neither token exceeds the caller caps.
383
+ */
384
+ export function scaleWeightedPoolDeltasToFitCaps(params) {
385
+ const { weights, probeNeed0, probeNeed1, maxAmountToken0, maxAmountToken1 } = params;
386
+ const maxU = 2n ** 256n - 2n;
387
+ const scaleWad0 = probeNeed0 === 0n ? maxU : (maxAmountToken0 * WAD) / probeNeed0;
388
+ const scaleWad1 = probeNeed1 === 0n ? maxU : (maxAmountToken1 * WAD) / probeNeed1;
389
+ const scaleWad = scaleWad0 < scaleWad1 ? scaleWad0 : scaleWad1;
390
+ const shares = weights.shares.map((w, i) => {
391
+ const scaled = (w * scaleWad) / WAD;
392
+ if (w !== 0n && scaled === 0n) {
393
+ throw new Error(`shares rounded to zero at weight index ${i}`);
394
+ }
395
+ return scaled;
396
+ });
397
+ return { binIdxs: weights.binIdxs, shares };
398
+ }
399
+ export async function buildAddLiquidityExactSharesParamsFromBinTargets(params) {
400
+ const [salt, deltas, max0, max1] = await buildModifyLiquidityArgsForAddition(params);
401
+ return {
402
+ salt,
403
+ poolLiquidityDelta: additionPlanToPoolLiquidityDelta(deltas),
404
+ maxAmountToken0: max0,
405
+ maxAmountToken1: max1,
406
+ };
407
+ }
408
+ export function encodeAddLiquidityExactSharesSelfCalldata(params) {
409
+ return encodeFunctionData({
410
+ abi: LIQUIDITY_ADDER_ABI,
411
+ functionName: "addLiquidityExactShares",
412
+ args: [
413
+ params.pool,
414
+ params.salt,
415
+ { binIdxs: [...params.deltas.binIdxs], shares: [...params.deltas.shares] },
416
+ params.maxAmountToken0,
417
+ params.maxAmountToken1,
418
+ ],
419
+ });
420
+ }
421
+ export function encodeAddLiquidityExactSharesWithOwnerCalldata(params) {
422
+ return encodeFunctionData({
423
+ abi: LIQUIDITY_ADDER_ABI,
424
+ functionName: "addLiquidityExactShares",
425
+ args: [
426
+ params.pool,
427
+ params.owner,
428
+ params.salt,
429
+ { binIdxs: [...params.deltas.binIdxs], shares: [...params.deltas.shares] },
430
+ params.maxAmountToken0,
431
+ params.maxAmountToken1,
432
+ ],
433
+ });
434
+ }
435
+ export function encodeAddLiquidityWeightedSelfCalldata(params) {
436
+ return encodeFunctionData({
437
+ abi: LIQUIDITY_ADDER_ABI,
438
+ functionName: "addLiquidityWeighted",
439
+ args: [
440
+ params.pool,
441
+ params.salt,
442
+ { binIdxs: [...params.weightDeltas.binIdxs], shares: [...params.weightDeltas.shares] },
443
+ params.maxAmountToken0,
444
+ params.maxAmountToken1,
445
+ ],
446
+ });
447
+ }
448
+ export function encodeAddLiquidityWeightedWithOwnerCalldata(params) {
449
+ return encodeFunctionData({
450
+ abi: LIQUIDITY_ADDER_ABI,
451
+ functionName: "addLiquidityWeighted",
452
+ args: [
453
+ params.pool,
454
+ params.owner,
455
+ params.salt,
456
+ { binIdxs: [...params.weightDeltas.binIdxs], shares: [...params.weightDeltas.shares] },
457
+ params.maxAmountToken0,
458
+ params.maxAmountToken1,
459
+ ],
460
+ });
461
+ }
462
+ export function encodeRemoveLiquidityCalldata(params) {
463
+ return encodeFunctionData({
464
+ abi: MetricOmmPoolAbi,
465
+ functionName: "removeLiquidity",
466
+ args: [
467
+ params.owner,
468
+ params.salt,
469
+ { binIdxs: [...params.deltas.binIdxs], shares: [...params.deltas.shares] },
470
+ ],
471
+ });
472
+ }
473
+ export async function buildRemoveLiquidityPoolDelta(params) {
474
+ const [salt, deltas] = await buildModifyLiquidityArgsForRemoval(params);
475
+ return { salt, poolLiquidityDelta: removalPlanToPoolLiquidityDelta(deltas) };
476
+ }
477
+ function validateSpecAmountBufferPercent(specAmountBufferPercent) {
478
+ if (!Number.isFinite(specAmountBufferPercent) || specAmountBufferPercent < 0) {
479
+ throw new Error("specAmountBufferPercent must be a non-negative percent number");
480
+ }
481
+ }
482
+ function applySpecAmountBuffer(specAmount, specAmountBufferPercent) {
483
+ if (specAmountBufferPercent === 0 || specAmount === NO_SLIPPAGE_LIMIT) {
484
+ return specAmount;
485
+ }
486
+ const bufferRatio = specAmountBufferPercent / 100;
487
+ if (specAmount > 0n) {
488
+ const multiplier = BigInt(Math.floor((1 + bufferRatio) * 1e18));
489
+ return (specAmount * multiplier) / BigInt(1e18);
490
+ }
491
+ if (specAmount < 0n) {
492
+ const multiplier = BigInt(Math.floor((1 - bufferRatio) * 1e18));
493
+ if (multiplier <= 0n) {
494
+ return 0n;
495
+ }
496
+ return (specAmount * multiplier) / BigInt(1e18);
497
+ }
498
+ return specAmount;
499
+ }
500
+ function toModifyLiquidityArgs(preparedModifyLiquidity) {
501
+ return [
502
+ preparedModifyLiquidity.salt,
503
+ preparedModifyLiquidity.deltas,
504
+ preparedModifyLiquidity.specAmount0,
505
+ preparedModifyLiquidity.specAmount1,
506
+ ];
507
+ }
508
+ //# sourceMappingURL=liquidity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquidity.js","sourceRoot":"","sources":["../../src/pool/liquidity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * MetricAMM SDK - Pool read helpers (v1 pools + factory-backed immutables).
3
+ */
4
+ import type { Address, PublicClient } from "viem";
5
+ import type { PoolImmutables, PoolState, BinState } from "../types.js";
6
+ /**
7
+ * Read pool immutables via the factory (v1 pools do not expose a pool-side immutables getter).
8
+ */
9
+ export declare function getPoolImmutables(publicClient: PublicClient, factoryAddress: Address, poolAddress: Address): Promise<PoolImmutables>;
10
+ /**
11
+ * Read pool state via StateView (slot0 + slot1).
12
+ */
13
+ export declare function getPoolState(publicClient: PublicClient, stateViewAddress: Address, poolAddress: Address): Promise<PoolState>;
14
+ /**
15
+ * Read bin state (scaled balances) via StateView.
16
+ */
17
+ export declare function getBinState(publicClient: PublicClient, stateViewAddress: Address, poolAddress: Address, binIdx: number): Promise<BinState>;
18
+ /**
19
+ * Get user position shares in a specific bin (StateView).
20
+ */
21
+ export declare function getPositionBinShares(publicClient: PublicClient, stateViewAddress: Address, poolAddress: Address, owner: Address, salt: bigint, binIdx: number): Promise<bigint>;
22
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/pool/read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvE;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,OAAO,EACvB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,cAAc,CAAC,CAoCzB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,OAAO,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,SAAS,CAAC,CA0BpB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,OAAO,EACzB,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAenB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,OAAO,EACzB,WAAW,EAAE,OAAO,EACpB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * MetricAMM SDK - Pool read helpers (v1 pools + factory-backed immutables).
3
+ */
4
+ import { POOL_FACTORY_ABI, STATE_VIEW_ABI } from "../constants.js";
5
+ /**
6
+ * Read pool immutables via the factory (v1 pools do not expose a pool-side immutables getter).
7
+ */
8
+ export async function getPoolImmutables(publicClient, factoryAddress, poolAddress) {
9
+ const imm = (await publicClient.readContract({
10
+ address: factoryAddress,
11
+ abi: POOL_FACTORY_ABI,
12
+ functionName: "poolImmutables",
13
+ args: [poolAddress],
14
+ }));
15
+ return {
16
+ factory: factoryAddress,
17
+ token0: imm.token0,
18
+ token1: imm.token1,
19
+ token0ScaleMultiplier: imm.token0ScaleMultiplier,
20
+ token1ScaleMultiplier: imm.token1ScaleMultiplier,
21
+ initialScaledToken0PerShareE18: imm.initialScaledAmount0PerShareE18,
22
+ initialScaledToken1PerShareE18: imm.initialScaledAmount1PerShareE18,
23
+ minimalMintableLiquidity: imm.minimalMintableLiquidity,
24
+ maxDriftE8: 0n,
25
+ maxDriftDecayPerSecondE8: 0n,
26
+ lowestBin: imm.lowestBin,
27
+ highestBin: imm.highestBin,
28
+ };
29
+ }
30
+ /**
31
+ * Read pool state via StateView (slot0 + slot1).
32
+ */
33
+ export async function getPoolState(publicClient, stateViewAddress, poolAddress) {
34
+ const [slot0, slot1] = await Promise.all([
35
+ publicClient.readContract({
36
+ address: stateViewAddress,
37
+ abi: STATE_VIEW_ABI,
38
+ functionName: "slot0",
39
+ args: [poolAddress],
40
+ }),
41
+ publicClient.readContract({
42
+ address: stateViewAddress,
43
+ abi: STATE_VIEW_ABI,
44
+ functionName: "slot1",
45
+ args: [poolAddress],
46
+ }),
47
+ ]);
48
+ return {
49
+ pauseLevel: slot0[0],
50
+ curBinIdx: slot0[1],
51
+ curPosInBin: slot0[2],
52
+ curBinDistFromProvidedPrice: slot0[3],
53
+ spreadFeeE6: slot0[4],
54
+ notionalFeeE8: slot0[5],
55
+ totalScaledToken0InBins: slot1[0],
56
+ totalScaledToken1InBins: slot1[1],
57
+ };
58
+ }
59
+ /**
60
+ * Read bin state (scaled balances) via StateView.
61
+ */
62
+ export async function getBinState(publicClient, stateViewAddress, poolAddress, binIdx) {
63
+ const result = (await publicClient.readContract({
64
+ address: stateViewAddress,
65
+ abi: STATE_VIEW_ABI,
66
+ functionName: "binStateScaled",
67
+ args: [poolAddress, binIdx],
68
+ }));
69
+ return {
70
+ token0BalanceScaled: result[0],
71
+ token1BalanceScaled: result[1],
72
+ lengthE6: result[2],
73
+ addFeeBuyE6: result[3],
74
+ addFeeSellE6: result[4],
75
+ };
76
+ }
77
+ /**
78
+ * Get user position shares in a specific bin (StateView).
79
+ */
80
+ export async function getPositionBinShares(publicClient, stateViewAddress, poolAddress, owner, salt, binIdx) {
81
+ return (await publicClient.readContract({
82
+ address: stateViewAddress,
83
+ abi: STATE_VIEW_ABI,
84
+ functionName: "positionBinShares",
85
+ args: [poolAddress, owner, salt, binIdx],
86
+ }));
87
+ }
88
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/pool/read.ts"],"names":[],"mappings":"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"}