@exponent-labs/market-three-math 0.1.8 → 0.9.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/build/addLiquidity.d.ts +65 -4
- package/build/addLiquidity.js +762 -36
- package/build/addLiquidity.js.map +1 -1
- package/build/bisect.d.ts +11 -0
- package/build/bisect.js +22 -12
- package/build/bisect.js.map +1 -1
- package/build/index.d.ts +5 -4
- package/build/index.js +14 -7
- package/build/index.js.map +1 -1
- package/build/liquidityHistogram.d.ts +6 -1
- package/build/liquidityHistogram.js +57 -12
- package/build/liquidityHistogram.js.map +1 -1
- package/build/quote.d.ts +1 -1
- package/build/quote.js +70 -84
- package/build/quote.js.map +1 -1
- package/build/swap.js +36 -18
- package/build/swap.js.map +1 -1
- package/build/swapV2.d.ts +6 -1
- package/build/swapV2.js +394 -52
- package/build/swapV2.js.map +1 -1
- package/build/types.d.ts +51 -0
- package/build/utils.d.ts +8 -2
- package/build/utils.js +37 -19
- package/build/utils.js.map +1 -1
- package/build/utilsV2.d.ts +9 -0
- package/build/utilsV2.js +131 -9
- package/build/utilsV2.js.map +1 -1
- package/build/withdrawLiquidity.js +12 -7
- package/build/withdrawLiquidity.js.map +1 -1
- package/build/ytTrades.d.ts +7 -0
- package/build/ytTrades.js +166 -146
- package/build/ytTrades.js.map +1 -1
- package/build/ytTradesLegacy.js +3 -4
- package/build/ytTradesLegacy.js.map +1 -1
- package/package.json +2 -2
- package/src/addLiquidity.ts +1012 -38
- package/src/bisect.ts +22 -11
- package/src/index.ts +11 -5
- package/src/liquidityHistogram.ts +54 -9
- package/src/quote.ts +73 -95
- package/src/swap.ts +35 -19
- package/src/swapV2.ts +999 -0
- package/src/types.ts +55 -0
- package/src/utils.ts +24 -3
- package/src/utilsV2.ts +337 -0
- package/src/withdrawLiquidity.ts +12 -6
- package/src/ytTrades.ts +191 -172
- package/src/ytTradesLegacy.ts +419 -0
- package/build/swap-v2.d.ts +0 -20
- package/build/swap-v2.js +0 -261
- package/build/swap-v2.js.map +0 -1
- package/build/swapLegacy.d.ts +0 -16
- package/build/swapLegacy.js +0 -229
- package/build/swapLegacy.js.map +0 -1
- package/src/swapLegacy.ts +0 -272
package/build/types.d.ts
CHANGED
|
@@ -25,6 +25,20 @@ export interface SwapArgs {
|
|
|
25
25
|
/** Is this a flash swap? */
|
|
26
26
|
isCurrentFlashSwap: boolean;
|
|
27
27
|
}
|
|
28
|
+
export interface SwapExactOutArgs {
|
|
29
|
+
/** Direction of the swap (only SyToPt is supported) */
|
|
30
|
+
direction: SwapDirection;
|
|
31
|
+
/** Exact amount out target (net, after fees) */
|
|
32
|
+
amountOut: number;
|
|
33
|
+
/** Optional spot price limit (anti-sandwich) */
|
|
34
|
+
priceSpotLimit?: number;
|
|
35
|
+
/** SY exchange rate */
|
|
36
|
+
syExchangeRate: number;
|
|
37
|
+
/** Is this a flash swap? */
|
|
38
|
+
isCurrentFlashSwap: boolean;
|
|
39
|
+
/** Optional max input budget constraint */
|
|
40
|
+
amountInConstraint?: number;
|
|
41
|
+
}
|
|
28
42
|
export interface SwapOutcome {
|
|
29
43
|
/** Amount of input consumed */
|
|
30
44
|
amountInConsumed: number;
|
|
@@ -39,6 +53,22 @@ export interface SwapOutcome {
|
|
|
39
53
|
/** Final tick index after swap */
|
|
40
54
|
finalTickIndex: number;
|
|
41
55
|
}
|
|
56
|
+
export interface SwapOutcomeV2 {
|
|
57
|
+
/** Amount of input consumed */
|
|
58
|
+
amountInConsumed: number;
|
|
59
|
+
/** Amount out (after fees) */
|
|
60
|
+
amountOut: number;
|
|
61
|
+
/** LP fee charged in out token */
|
|
62
|
+
lpFeeChargedOutToken: number;
|
|
63
|
+
/** Protocol fee charged in out token */
|
|
64
|
+
protocolFeeChargedOutToken: number;
|
|
65
|
+
/** Final spot price after swap */
|
|
66
|
+
finalSpotPrice: number;
|
|
67
|
+
/** Final tick key after swap */
|
|
68
|
+
finalTickKey: number;
|
|
69
|
+
/** Post-trade market state after applying in-swap state updates */
|
|
70
|
+
postMarketState?: MarketThreeState;
|
|
71
|
+
}
|
|
42
72
|
export interface AddLiquidityArgs {
|
|
43
73
|
/** Lower tick key (ln implied rate in bps) */
|
|
44
74
|
lowerTick: number;
|
|
@@ -70,4 +100,25 @@ export interface LiquidityNeeds {
|
|
|
70
100
|
priceSplitForNeed: number;
|
|
71
101
|
/** Tick index of the split point */
|
|
72
102
|
priceSplitTickIdx: number;
|
|
103
|
+
/** Original max SY before CLMM trimming (for crossing tick scaling) */
|
|
104
|
+
originalMaxSy: number;
|
|
105
|
+
/** Original max PT before CLMM trimming (for crossing tick scaling) */
|
|
106
|
+
originalMaxPt: number;
|
|
107
|
+
/** PT distribution extent: current_spot - lower_price */
|
|
108
|
+
duLeftTotal: number;
|
|
109
|
+
/** SY distribution extent: eff_price_current - eff_price_upper */
|
|
110
|
+
deltaCRightTotal: number;
|
|
111
|
+
}
|
|
112
|
+
/** State of the crossing (current) tick for proportional distribution */
|
|
113
|
+
export interface CrossingTickState {
|
|
114
|
+
principalPt: number;
|
|
115
|
+
principalSy: number;
|
|
116
|
+
principalShareSupply: number;
|
|
117
|
+
}
|
|
118
|
+
/** Parameters for scaling crossing tick inputs from original max values */
|
|
119
|
+
export interface CrossingScaleParams {
|
|
120
|
+
originalMaxSy: number;
|
|
121
|
+
originalMaxPt: number;
|
|
122
|
+
duLeftTotal: number;
|
|
123
|
+
deltaCRightTotal: number;
|
|
73
124
|
}
|
package/build/utils.d.ts
CHANGED
|
@@ -70,7 +70,12 @@ export declare function getSuccessorTickKey(ticks: Ticks, currentTickKey: number
|
|
|
70
70
|
* Find the successor tick by index in the tick tree
|
|
71
71
|
* This is almost equivalent to the Rust successor_idx method
|
|
72
72
|
*/
|
|
73
|
-
export declare function
|
|
73
|
+
export declare function getSuccessorTickIdxByIdx(ticks: Ticks, tickIdx: number): number | null;
|
|
74
|
+
/**
|
|
75
|
+
* Find the predecessor tick by index in the tick tree
|
|
76
|
+
* This is the inverse of getSuccessorTickIdxByIdx - finds the tick with the largest apyBasePoints that is still less than the current tick
|
|
77
|
+
*/
|
|
78
|
+
export declare function getPredecessorTickIdxByIdx(ticks: Ticks, tickIdx: number): number | null;
|
|
74
79
|
/**
|
|
75
80
|
* Find the predecessor tick (next tick to the left)
|
|
76
81
|
* In Rust: ticks.predecessor_idx(current_left_boundary_index)
|
|
@@ -90,7 +95,8 @@ export declare function getPredecessorTickKey(ticks: Ticks, currentTickKey: numb
|
|
|
90
95
|
*/
|
|
91
96
|
export declare function getImpliedRate(tickKey: number): number;
|
|
92
97
|
/**
|
|
93
|
-
* Find a tick by its key
|
|
98
|
+
* Find a tick by its key (apyBasePoints)
|
|
99
|
+
* @returns tick and its 1-based index, or null if not found
|
|
94
100
|
*/
|
|
95
101
|
export declare function findTickByKey(ticks: Ticks, tickKey: number): {
|
|
96
102
|
tick: Tick;
|
package/build/utils.js
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.EffSnap = void 0;
|
|
4
|
+
exports.normalizedTimeRemaining = normalizedTimeRemaining;
|
|
5
|
+
exports.calculateFeeRate = calculateFeeRate;
|
|
6
|
+
exports.getFeeFromAmount = getFeeFromAmount;
|
|
7
|
+
exports.getActiveLiquidity = getActiveLiquidity;
|
|
8
|
+
exports.getSuccessorTickKey = getSuccessorTickKey;
|
|
9
|
+
exports.getSuccessorTickIdxByIdx = getSuccessorTickIdxByIdx;
|
|
10
|
+
exports.getPredecessorTickIdxByIdx = getPredecessorTickIdxByIdx;
|
|
11
|
+
exports.getPredecessorTickKey = getPredecessorTickKey;
|
|
12
|
+
exports.getImpliedRate = getImpliedRate;
|
|
13
|
+
exports.findTickByKey = findTickByKey;
|
|
14
|
+
exports.findTickByIndex = findTickByIndex;
|
|
15
|
+
exports.convertApyToApyBp = convertApyToApyBp;
|
|
16
|
+
exports.convertApyBpToApy = convertApyBpToApy;
|
|
17
|
+
exports.bigIntMax = bigIntMax;
|
|
18
|
+
exports.bigIntMin = bigIntMin;
|
|
19
|
+
exports.calcPtPriceInAsset = calcPtPriceInAsset;
|
|
4
20
|
const SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
|
|
5
21
|
// const BASE_POINTS = 10000
|
|
6
22
|
/**
|
|
@@ -60,7 +76,6 @@ exports.EffSnap = EffSnap;
|
|
|
60
76
|
function normalizedTimeRemaining(secondsRemaining) {
|
|
61
77
|
return secondsRemaining / SECONDS_PER_YEAR;
|
|
62
78
|
}
|
|
63
|
-
exports.normalizedTimeRemaining = normalizedTimeRemaining;
|
|
64
79
|
/**
|
|
65
80
|
* Calculate current fee rate from fee rate root and time remaining
|
|
66
81
|
* fee_rate = e^(ln_fee_rate_root * time_factor)
|
|
@@ -69,7 +84,6 @@ function calculateFeeRate(lnFeeRateRoot, secondsRemaining) {
|
|
|
69
84
|
const timeFactor = normalizedTimeRemaining(secondsRemaining);
|
|
70
85
|
return Math.exp(lnFeeRateRoot * timeFactor);
|
|
71
86
|
}
|
|
72
|
-
exports.calculateFeeRate = calculateFeeRate;
|
|
73
87
|
/**
|
|
74
88
|
* Calculate fee from amount
|
|
75
89
|
* Returns the fee to charge given an amount and fee rate
|
|
@@ -78,7 +92,6 @@ exports.calculateFeeRate = calculateFeeRate;
|
|
|
78
92
|
function getFeeFromAmount(amount, feeRate) {
|
|
79
93
|
return Math.ceil(amount * (feeRate - 1.0));
|
|
80
94
|
}
|
|
81
|
-
exports.getFeeFromAmount = getFeeFromAmount;
|
|
82
95
|
/**
|
|
83
96
|
* Find the active liquidity at a given tick index
|
|
84
97
|
* This is computed by summing liquidity_net up to the current tick
|
|
@@ -93,7 +106,6 @@ function getActiveLiquidity(ticks, tickIndex) {
|
|
|
93
106
|
}
|
|
94
107
|
return activeLiquidity;
|
|
95
108
|
}
|
|
96
|
-
exports.getActiveLiquidity = getActiveLiquidity;
|
|
97
109
|
/**
|
|
98
110
|
* Find the successor tick (next tick to the right)
|
|
99
111
|
* In Rust: ticks.successor_idx(current_left_boundary_index)
|
|
@@ -112,12 +124,11 @@ function getSuccessorTickKey(ticks, currentTickKey) {
|
|
|
112
124
|
}
|
|
113
125
|
return minKey;
|
|
114
126
|
}
|
|
115
|
-
exports.getSuccessorTickKey = getSuccessorTickKey;
|
|
116
127
|
/**
|
|
117
128
|
* Find the successor tick by index in the tick tree
|
|
118
129
|
* This is almost equivalent to the Rust successor_idx method
|
|
119
130
|
*/
|
|
120
|
-
function
|
|
131
|
+
function getSuccessorTickIdxByIdx(ticks, tickIdx) {
|
|
121
132
|
//TODO Refactor to make it more CPU efficient
|
|
122
133
|
const tick = ticks.ticksTree.at(tickIdx - 1) ?? null;
|
|
123
134
|
if (!tick)
|
|
@@ -129,7 +140,22 @@ function getSuccessorTickByIdx(ticks, tickIdx) {
|
|
|
129
140
|
const successorTick = successorTicks.at(0) ?? null;
|
|
130
141
|
return !!successorTick ? ticks.ticksTree.indexOf(successorTick) + 1 : null;
|
|
131
142
|
}
|
|
132
|
-
|
|
143
|
+
/**
|
|
144
|
+
* Find the predecessor tick by index in the tick tree
|
|
145
|
+
* This is the inverse of getSuccessorTickIdxByIdx - finds the tick with the largest apyBasePoints that is still less than the current tick
|
|
146
|
+
*/
|
|
147
|
+
function getPredecessorTickIdxByIdx(ticks, tickIdx) {
|
|
148
|
+
//TODO Refactor to make it more CPU efficient
|
|
149
|
+
const tick = ticks.ticksTree.at(tickIdx - 1) ?? null;
|
|
150
|
+
if (!tick)
|
|
151
|
+
return null;
|
|
152
|
+
// Find ticks with apyBasePoints less than current tick
|
|
153
|
+
const predecessorTicks = ticks.ticksTree
|
|
154
|
+
.filter((t) => t.apyBasePoints < tick.apyBasePoints)
|
|
155
|
+
.sort((a, b) => b.apyBasePoints - a.apyBasePoints); // Sort descending to get the largest that's still less
|
|
156
|
+
const predecessorTick = predecessorTicks.at(0) ?? null;
|
|
157
|
+
return !!predecessorTick ? ticks.ticksTree.indexOf(predecessorTick) + 1 : null;
|
|
158
|
+
}
|
|
133
159
|
/**
|
|
134
160
|
* Find the predecessor tick (next tick to the left)
|
|
135
161
|
* In Rust: ticks.predecessor_idx(current_left_boundary_index)
|
|
@@ -148,7 +174,6 @@ function getPredecessorTickKey(ticks, currentTickKey) {
|
|
|
148
174
|
}
|
|
149
175
|
return maxKey;
|
|
150
176
|
}
|
|
151
|
-
exports.getPredecessorTickKey = getPredecessorTickKey;
|
|
152
177
|
/**
|
|
153
178
|
* Get the spot price (implied rate) for a tick key
|
|
154
179
|
* Tick key represents APY in parts per million (1e6)
|
|
@@ -162,46 +187,40 @@ function getImpliedRate(tickKey) {
|
|
|
162
187
|
const TICK_KEY_BASE_POINTS = 1_000_000;
|
|
163
188
|
return 1.0 + tickKey / TICK_KEY_BASE_POINTS;
|
|
164
189
|
}
|
|
165
|
-
exports.getImpliedRate = getImpliedRate;
|
|
166
190
|
/**
|
|
167
|
-
* Find a tick by its key
|
|
191
|
+
* Find a tick by its key (apyBasePoints)
|
|
192
|
+
* @returns tick and its 1-based index, or null if not found
|
|
168
193
|
*/
|
|
169
194
|
function findTickByKey(ticks, tickKey) {
|
|
170
195
|
const index = ticks.ticksTree.findIndex((t) => t.apyBasePoints === tickKey);
|
|
171
196
|
if (index === -1)
|
|
172
197
|
return null;
|
|
173
|
-
return { tick: ticks.ticksTree[index
|
|
198
|
+
return { tick: ticks.ticksTree[index], index: index + 1 }; // Return 1-based index to match Rust
|
|
174
199
|
}
|
|
175
|
-
exports.findTickByKey = findTickByKey;
|
|
176
200
|
/**
|
|
177
201
|
* Find a tick by its index
|
|
178
202
|
*/
|
|
179
203
|
function findTickByIndex(ticks, index) {
|
|
180
204
|
return ticks.ticksTree.at(index - 1) ?? null;
|
|
181
205
|
}
|
|
182
|
-
exports.findTickByIndex = findTickByIndex;
|
|
183
206
|
/**
|
|
184
207
|
* Convert APY percentage to basis points
|
|
185
208
|
*/
|
|
186
209
|
function convertApyToApyBp(apyPercent) {
|
|
187
210
|
return Math.round(apyPercent * 100);
|
|
188
211
|
}
|
|
189
|
-
exports.convertApyToApyBp = convertApyToApyBp;
|
|
190
212
|
/**
|
|
191
213
|
* Convert basis points to APY percentage
|
|
192
214
|
*/
|
|
193
215
|
function convertApyBpToApy(apyBp) {
|
|
194
216
|
return apyBp / 100;
|
|
195
217
|
}
|
|
196
|
-
exports.convertApyBpToApy = convertApyBpToApy;
|
|
197
218
|
function bigIntMax(...args) {
|
|
198
219
|
return args.reduce((m, e) => (e > m ? e : m));
|
|
199
220
|
}
|
|
200
|
-
exports.bigIntMax = bigIntMax;
|
|
201
221
|
function bigIntMin(...args) {
|
|
202
222
|
return args.reduce((m, e) => (e < m ? e : m));
|
|
203
223
|
}
|
|
204
|
-
exports.bigIntMin = bigIntMin;
|
|
205
224
|
/**
|
|
206
225
|
* Calculate PT price in asset from current spot price and expiration timestamp
|
|
207
226
|
* @param currentSpotPrice - Current spot price in format of 1 + percentage / 100
|
|
@@ -215,5 +234,4 @@ function calcPtPriceInAsset(currentSpotPrice, expirationTs) {
|
|
|
215
234
|
const ptPriceInAsset = Math.exp(Math.log(1 + impliedApy) * (-secondsRemaining / SECONDS_PER_YEAR));
|
|
216
235
|
return ptPriceInAsset;
|
|
217
236
|
}
|
|
218
|
-
exports.calcPtPriceInAsset = calcPtPriceInAsset;
|
|
219
237
|
//# sourceMappingURL=utils.js.map
|
package/build/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/build/utilsV2.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export declare class EffSnap {
|
|
|
30
30
|
export declare class TicksWrapper {
|
|
31
31
|
private ticksByKey;
|
|
32
32
|
private sortedKeys;
|
|
33
|
+
private baseTicksTree;
|
|
34
|
+
private market;
|
|
33
35
|
currentSpotPrice: number;
|
|
34
36
|
currentTickKey: number;
|
|
35
37
|
currentPrefixSum: bigint;
|
|
@@ -72,6 +74,13 @@ export declare class TicksWrapper {
|
|
|
72
74
|
* Get liquidity net for a tick
|
|
73
75
|
*/
|
|
74
76
|
getLiquidityNet(key: number): bigint;
|
|
77
|
+
private clamp01;
|
|
78
|
+
private ratioToPrecise;
|
|
79
|
+
private scaleByRatioFloor;
|
|
80
|
+
private splitPrincipalsAfterInsert;
|
|
81
|
+
upsertBoundaryTick(key: number, snap: EffSnap): void;
|
|
82
|
+
setPrincipals(key: number, principalPt: bigint, principalSy: bigint): void;
|
|
83
|
+
toTicks(currentTickKey: number, currentSpotPrice: number, currentPrefixSum: bigint): Ticks;
|
|
75
84
|
}
|
|
76
85
|
/**
|
|
77
86
|
* Calculate normalized time remaining
|
package/build/utilsV2.js
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.TicksWrapper = exports.EffSnap = void 0;
|
|
4
|
+
exports.normalizedTimeRemaining = normalizedTimeRemaining;
|
|
5
|
+
exports.calculateFeeRate = calculateFeeRate;
|
|
6
|
+
exports.getFeeFromAmount = getFeeFromAmount;
|
|
4
7
|
const SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
|
|
5
8
|
const TICK_KEY_BASE_POINTS = 1_000_000;
|
|
9
|
+
const PRECISE_NUMBER_DENOM = 1000000000000000000n;
|
|
10
|
+
function cloneTick(tick) {
|
|
11
|
+
return {
|
|
12
|
+
...tick,
|
|
13
|
+
farms: tick.farms.map((farm) => ({ ...farm })),
|
|
14
|
+
emissions: tick.emissions.map((emission) => ({ ...emission })),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
6
17
|
/**
|
|
7
18
|
* Effective price snapshot
|
|
8
19
|
* Matches the Rust EffSnap struct
|
|
@@ -41,6 +52,8 @@ exports.EffSnap = EffSnap;
|
|
|
41
52
|
class TicksWrapper {
|
|
42
53
|
ticksByKey; // key (apyBasePoints) -> Tick
|
|
43
54
|
sortedKeys; // sorted list of keys for successor/predecessor
|
|
55
|
+
baseTicksTree;
|
|
56
|
+
market;
|
|
44
57
|
currentSpotPrice;
|
|
45
58
|
currentTickKey; // Store key instead of array index
|
|
46
59
|
currentPrefixSum;
|
|
@@ -48,8 +61,10 @@ class TicksWrapper {
|
|
|
48
61
|
feeGrowthIndexGlobalSy;
|
|
49
62
|
constructor(ticks) {
|
|
50
63
|
this.ticksByKey = new Map();
|
|
64
|
+
this.baseTicksTree = ticks.ticksTree.map(cloneTick);
|
|
65
|
+
this.market = ticks.market;
|
|
51
66
|
// Build map from apyBasePoints -> Tick
|
|
52
|
-
for (const tick of
|
|
67
|
+
for (const tick of this.baseTicksTree) {
|
|
53
68
|
if (tick.apyBasePoints > 0) {
|
|
54
69
|
this.ticksByKey.set(tick.apyBasePoints, tick);
|
|
55
70
|
}
|
|
@@ -63,7 +78,7 @@ class TicksWrapper {
|
|
|
63
78
|
// Convert currentTick (1-based index) to key
|
|
64
79
|
// In Rust, currentTick is stored as 1-based index into the ticks tree
|
|
65
80
|
// We need to find the corresponding key (apyBasePoints)
|
|
66
|
-
const currentTickFromArray =
|
|
81
|
+
const currentTickFromArray = this.baseTicksTree[ticks.currentTick - 1];
|
|
67
82
|
if (currentTickFromArray && currentTickFromArray.apyBasePoints > 0) {
|
|
68
83
|
this.currentTickKey = currentTickFromArray.apyBasePoints;
|
|
69
84
|
}
|
|
@@ -77,7 +92,6 @@ class TicksWrapper {
|
|
|
77
92
|
*/
|
|
78
93
|
findTickKeyBySpotPrice(spotPrice) {
|
|
79
94
|
let closestKey = this.sortedKeys[0] || 0;
|
|
80
|
-
// let prevKey: number | null = null
|
|
81
95
|
// Iterate through sorted keys to ensure order
|
|
82
96
|
for (const key of this.sortedKeys) {
|
|
83
97
|
const tick = this.ticksByKey.get(key);
|
|
@@ -88,8 +102,6 @@ class TicksWrapper {
|
|
|
88
102
|
// If diff is negative, return the previous key (the one we just passed)
|
|
89
103
|
return closestKey;
|
|
90
104
|
}
|
|
91
|
-
// Update closest key and remember previous
|
|
92
|
-
// prevKey = closestKey
|
|
93
105
|
closestKey = key;
|
|
94
106
|
}
|
|
95
107
|
return closestKey;
|
|
@@ -152,6 +164,119 @@ class TicksWrapper {
|
|
|
152
164
|
const tick = this.ticksByKey.get(key);
|
|
153
165
|
return tick?.liquidityNet ?? 0n;
|
|
154
166
|
}
|
|
167
|
+
clamp01(value) {
|
|
168
|
+
if (!Number.isFinite(value))
|
|
169
|
+
return 0;
|
|
170
|
+
if (value <= 0)
|
|
171
|
+
return 0;
|
|
172
|
+
if (value >= 1)
|
|
173
|
+
return 1;
|
|
174
|
+
return value;
|
|
175
|
+
}
|
|
176
|
+
ratioToPrecise(value) {
|
|
177
|
+
const clamped = this.clamp01(value);
|
|
178
|
+
if (clamped <= 0)
|
|
179
|
+
return 0n;
|
|
180
|
+
if (clamped >= 1)
|
|
181
|
+
return PRECISE_NUMBER_DENOM;
|
|
182
|
+
return BigInt(Math.round(clamped * Number(PRECISE_NUMBER_DENOM)));
|
|
183
|
+
}
|
|
184
|
+
scaleByRatioFloor(value, ratioScaled) {
|
|
185
|
+
return (value * ratioScaled) / PRECISE_NUMBER_DENOM;
|
|
186
|
+
}
|
|
187
|
+
splitPrincipalsAfterInsert(insertedKey, snap) {
|
|
188
|
+
const leftKey = this.predecessorKey(insertedKey);
|
|
189
|
+
const rightKey = this.successorKey(insertedKey);
|
|
190
|
+
if (leftKey == null || rightKey == null) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const leftTick = this.ticksByKey.get(leftKey);
|
|
194
|
+
const insertedTick = this.ticksByKey.get(insertedKey);
|
|
195
|
+
if (!leftTick || !insertedTick) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const lowerPrice = this.getSpotPrice(leftKey);
|
|
199
|
+
const insertedPrice = this.getSpotPrice(insertedKey);
|
|
200
|
+
const upperPrice = this.getSpotPrice(rightKey);
|
|
201
|
+
const du = upperPrice - lowerPrice;
|
|
202
|
+
const rLen = du <= 0 ? 0 : this.clamp01((insertedPrice - lowerPrice) / du);
|
|
203
|
+
const rLenScaled = this.ratioToPrecise(rLen);
|
|
204
|
+
const uPtR = Math.min(upperPrice, this.currentSpotPrice);
|
|
205
|
+
const duPtTot = uPtR - lowerPrice;
|
|
206
|
+
const duPtLeft = Math.min(insertedPrice, this.currentSpotPrice) - lowerPrice;
|
|
207
|
+
const rPt = duPtTot <= 0 ? 1 : this.clamp01(duPtLeft / duPtTot);
|
|
208
|
+
const rPtScaled = this.ratioToPrecise(rPt);
|
|
209
|
+
const uSyL = Math.max(lowerPrice, this.currentSpotPrice);
|
|
210
|
+
const cL = snap.getEffectivePrice(uSyL);
|
|
211
|
+
const cM = snap.getEffectivePrice(Math.min(Math.max(insertedPrice, this.currentSpotPrice), upperPrice));
|
|
212
|
+
const cR = snap.getEffectivePrice(upperPrice);
|
|
213
|
+
const dcTot = cL - cR;
|
|
214
|
+
const dcLeft = cL - cM;
|
|
215
|
+
const rSy = dcTot <= 0 ? 1 : this.clamp01(dcLeft / dcTot);
|
|
216
|
+
const rSyScaled = this.ratioToPrecise(rSy);
|
|
217
|
+
const ptLowerBefore = leftTick.principalPt;
|
|
218
|
+
const syLowerBefore = leftTick.principalSy;
|
|
219
|
+
const supplyLowerBefore = leftTick.principalShareSupply;
|
|
220
|
+
const ptLeft = this.scaleByRatioFloor(ptLowerBefore, rPtScaled);
|
|
221
|
+
const syLeft = this.scaleByRatioFloor(syLowerBefore, rSyScaled);
|
|
222
|
+
const supplyLeft = this.scaleByRatioFloor(supplyLowerBefore, rLenScaled);
|
|
223
|
+
leftTick.principalPt = ptLeft;
|
|
224
|
+
leftTick.principalSy = syLeft;
|
|
225
|
+
leftTick.principalShareSupply = supplyLeft;
|
|
226
|
+
insertedTick.principalPt += ptLowerBefore - ptLeft;
|
|
227
|
+
insertedTick.principalSy += syLowerBefore - syLeft;
|
|
228
|
+
insertedTick.principalShareSupply += supplyLowerBefore - supplyLeft;
|
|
229
|
+
}
|
|
230
|
+
upsertBoundaryTick(key, snap) {
|
|
231
|
+
if (this.ticksByKey.has(key)) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const templateTick = this.baseTicksTree[0];
|
|
235
|
+
const newTick = {
|
|
236
|
+
liquidityNet: 0n,
|
|
237
|
+
liquidityGross: 0n,
|
|
238
|
+
feeGrowthOutsidePt: 0n,
|
|
239
|
+
feeGrowthOutsideSy: 0n,
|
|
240
|
+
impliedRate: 1 + key / TICK_KEY_BASE_POINTS,
|
|
241
|
+
principalPt: 0n,
|
|
242
|
+
principalSy: 0n,
|
|
243
|
+
apyBasePoints: key,
|
|
244
|
+
principalShareSupply: 0n,
|
|
245
|
+
farms: templateTick ? templateTick.farms.map(() => ({ lastSeenIndex: 0 })) : [],
|
|
246
|
+
emissions: templateTick
|
|
247
|
+
? templateTick.emissions.map(() => ({ lastSeenIndex: 0, lastPositionIndex: 0 }))
|
|
248
|
+
: [],
|
|
249
|
+
lastSplitEpoch: 0n,
|
|
250
|
+
frozenLiquidity: 0n,
|
|
251
|
+
};
|
|
252
|
+
this.baseTicksTree.push(newTick);
|
|
253
|
+
this.ticksByKey.set(key, newTick);
|
|
254
|
+
this.sortedKeys.push(key);
|
|
255
|
+
this.sortedKeys.sort((a, b) => a - b);
|
|
256
|
+
this.splitPrincipalsAfterInsert(key, snap);
|
|
257
|
+
}
|
|
258
|
+
setPrincipals(key, principalPt, principalSy) {
|
|
259
|
+
const tick = this.ticksByKey.get(key);
|
|
260
|
+
if (!tick)
|
|
261
|
+
return;
|
|
262
|
+
tick.principalPt = principalPt < 0n ? 0n : principalPt;
|
|
263
|
+
tick.principalSy = principalSy < 0n ? 0n : principalSy;
|
|
264
|
+
}
|
|
265
|
+
toTicks(currentTickKey, currentSpotPrice, currentPrefixSum) {
|
|
266
|
+
const currentTickIdx = this.baseTicksTree.findIndex((tick) => tick.apyBasePoints === currentTickKey);
|
|
267
|
+
const fallbackTickKey = this.findTickKeyBySpotPrice(currentSpotPrice);
|
|
268
|
+
const fallbackTickIdx = this.baseTicksTree.findIndex((tick) => tick.apyBasePoints === fallbackTickKey);
|
|
269
|
+
const resolvedCurrentTick = currentTickIdx >= 0 ? currentTickIdx + 1 : fallbackTickIdx >= 0 ? fallbackTickIdx + 1 : 0;
|
|
270
|
+
return {
|
|
271
|
+
currentTick: resolvedCurrentTick,
|
|
272
|
+
ticksTree: this.baseTicksTree.map(cloneTick),
|
|
273
|
+
market: this.market,
|
|
274
|
+
feeGrowthIndexGlobalPt: this.feeGrowthIndexGlobalPt,
|
|
275
|
+
feeGrowthIndexGlobalSy: this.feeGrowthIndexGlobalSy,
|
|
276
|
+
currentPrefixSum,
|
|
277
|
+
currentSpotPrice,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
155
280
|
}
|
|
156
281
|
exports.TicksWrapper = TicksWrapper;
|
|
157
282
|
/**
|
|
@@ -160,7 +285,6 @@ exports.TicksWrapper = TicksWrapper;
|
|
|
160
285
|
function normalizedTimeRemaining(secondsRemaining) {
|
|
161
286
|
return secondsRemaining / SECONDS_PER_YEAR;
|
|
162
287
|
}
|
|
163
|
-
exports.normalizedTimeRemaining = normalizedTimeRemaining;
|
|
164
288
|
/**
|
|
165
289
|
* Calculate current fee rate
|
|
166
290
|
*/
|
|
@@ -168,7 +292,6 @@ function calculateFeeRate(lnFeeRateRoot, secondsRemaining) {
|
|
|
168
292
|
const timeFactor = normalizedTimeRemaining(secondsRemaining);
|
|
169
293
|
return Math.exp(lnFeeRateRoot * timeFactor);
|
|
170
294
|
}
|
|
171
|
-
exports.calculateFeeRate = calculateFeeRate;
|
|
172
295
|
/**
|
|
173
296
|
* Calculate fee from amount
|
|
174
297
|
* Mirrors Rust: ((amount as f64) * (fee_rate - 1.0)).ceil() as u64
|
|
@@ -176,5 +299,4 @@ exports.calculateFeeRate = calculateFeeRate;
|
|
|
176
299
|
function getFeeFromAmount(amount, feeRate) {
|
|
177
300
|
return Math.ceil(amount * (feeRate - 1.0));
|
|
178
301
|
}
|
|
179
|
-
exports.getFeeFromAmount = getFeeFromAmount;
|
|
180
302
|
//# sourceMappingURL=utilsV2.js.map
|
package/build/utilsV2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilsV2.js","sourceRoot":"","sources":["../src/utilsV2.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utilsV2.js","sourceRoot":"","sources":["../src/utilsV2.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getPtAndSyOnWithdrawLiquidity =
|
|
3
|
+
exports.getPtAndSyOnWithdrawLiquidity = getPtAndSyOnWithdrawLiquidity;
|
|
4
4
|
const utils_1 = require("./utils");
|
|
5
5
|
function projectAnchorSharesToCurrentTicks(ticks, rootShares) {
|
|
6
6
|
const SENTINEL = 0xffffffff; // Sentinel value for tree traversal (matches Rust implementation)
|
|
7
|
-
|
|
7
|
+
// Deep clone the trackers to avoid mutating the original objects (important for React Query caching)
|
|
8
|
+
const stack = rootShares.map((s) => ({
|
|
9
|
+
tickIdx: s.tickIdx,
|
|
10
|
+
rightTickIdx: s.rightTickIdx,
|
|
11
|
+
splitEpoch: s.splitEpoch,
|
|
12
|
+
lpShare: s.lpShare,
|
|
13
|
+
emissions: s.emissions.map((e) => ({ staged: e.staged, lastSeenIndex: e.lastSeenIndex })),
|
|
14
|
+
}));
|
|
8
15
|
const newShares = []; // This will hold the leaf shares
|
|
9
16
|
while (stack.length > 0) {
|
|
10
17
|
const principalShare = stack.pop();
|
|
@@ -20,7 +27,7 @@ function projectAnchorSharesToCurrentTicks(ticks, rootShares) {
|
|
|
20
27
|
const rightIndex = principalShare.rightTickIdx;
|
|
21
28
|
if (rightIndex !== SENTINEL) {
|
|
22
29
|
// Find the successor tick (the split point)
|
|
23
|
-
const splitedIndex = (0, utils_1.
|
|
30
|
+
const splitedIndex = (0, utils_1.getSuccessorTickIdxByIdx)(ticks, principalShare.tickIdx);
|
|
24
31
|
if (splitedIndex === null) {
|
|
25
32
|
//? No successor tick found for splitting
|
|
26
33
|
continue;
|
|
@@ -145,7 +152,6 @@ function calculatePtSyRemoval(position, ticks, liquidityToRemove) {
|
|
|
145
152
|
const myShares = share.lpShare;
|
|
146
153
|
const tickNode = ticks.ticksTree.at(share.tickIdx - 1) ?? null;
|
|
147
154
|
if (!tickNode) {
|
|
148
|
-
//? Tick node not found for provided tickIdx
|
|
149
155
|
continue;
|
|
150
156
|
}
|
|
151
157
|
const supply = tickNode.principalShareSupply;
|
|
@@ -154,10 +160,10 @@ function calculatePtSyRemoval(position, ticks, liquidityToRemove) {
|
|
|
154
160
|
const burnShares = (myShares * liquidityToRemove) / position.lpBalance;
|
|
155
161
|
// Calculate PT output for this tick
|
|
156
162
|
// pt_out = principal_pt * burn_shares / supply
|
|
157
|
-
const ptOut = (tickNode.principalPt * burnShares) / supply;
|
|
163
|
+
const ptOut = supply > 0n ? (tickNode.principalPt * burnShares) / supply : 0n;
|
|
158
164
|
// Calculate SY output for this tick
|
|
159
165
|
// sy_out = principal_sy * burn_shares / supply
|
|
160
|
-
const syOut = (tickNode.principalSy * burnShares) / supply;
|
|
166
|
+
const syOut = supply > 0n ? (tickNode.principalSy * burnShares) / supply : 0n;
|
|
161
167
|
totalPtOut += ptOut;
|
|
162
168
|
totalSyOut += syOut;
|
|
163
169
|
}
|
|
@@ -170,5 +176,4 @@ function getPtAndSyOnWithdrawLiquidity(marketEmissions, ticks, position, liquidi
|
|
|
170
176
|
const updatedPosition = updateLpPositionShares(marketEmissions, ticks, position);
|
|
171
177
|
return calculatePtSyRemoval(updatedPosition, ticks, liquidityToRemove);
|
|
172
178
|
}
|
|
173
|
-
exports.getPtAndSyOnWithdrawLiquidity = getPtAndSyOnWithdrawLiquidity;
|
|
174
179
|
//# sourceMappingURL=withdrawLiquidity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdrawLiquidity.js","sourceRoot":"","sources":["../src/withdrawLiquidity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"withdrawLiquidity.js","sourceRoot":"","sources":["../src/withdrawLiquidity.ts"],"names":[],"mappings":"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"}
|
package/build/ytTrades.d.ts
CHANGED
|
@@ -71,6 +71,13 @@ export interface SellYtSimulationArgs {
|
|
|
71
71
|
syExchangeRate: number;
|
|
72
72
|
/** Optional spot price limit (anti-sandwich) */
|
|
73
73
|
priceSpotLimit?: number;
|
|
74
|
+
/**
|
|
75
|
+
* Safety margin in basis points to apply to the expected output.
|
|
76
|
+
* This can be used as an optional conservative buffer on top of the simulated output.
|
|
77
|
+
*
|
|
78
|
+
* Default: 0 (no buffer). Set to a positive value to reduce reported output.
|
|
79
|
+
*/
|
|
80
|
+
safetyMarginBps?: number;
|
|
74
81
|
}
|
|
75
82
|
export interface SellYtSimulationResult {
|
|
76
83
|
/** Amount of YT sold */
|