@cubee_ee/sdk 0.5.3 → 0.5.5

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.
@@ -1,103 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.predictLpLoss = predictLpLoss;
4
- const config_1 = require("../config");
5
- const toWhole = (raw, decimals) => Number(raw) / 10 ** decimals;
6
- /**
7
- * Predicted total value loss of the LP position minted by a single-token
8
- * deposit, as a percent of the deposited value, measured AFTER arbitrageurs
9
- * rebalance the pool back to external prices — the slippage-proof cost the
10
- * depositor actually bears.
11
- *
12
- * Replays the quote's swap legs and join onto the pool state, then values
13
- * the position at the closed-form zero-fee-arb equilibrium: with the
14
- * invariant ∏V_i^w_i preserved, equilibrium virtuals are V'_i = λ·w_i/p_i
15
- * and actual balances move by the same deltas. Validated against a full
16
- * profit-maximizing arbitrage simulation of the contract math (±0.03 pp,
17
- * slightly conservative). Float math — ample for percent-level output.
18
- *
19
- * Returns `null` when the pool is empty or inputs cannot price.
20
- */
21
- function predictLpLoss(params) {
22
- const { weightsBps, virtualBalances, lpActualBalances, decimals, bptTotalSupply, swapFeeRate, protocolFeeRate, tokenInIndex, amountIn, allocations, expectedOuts, depositedAmounts, refundAmounts, estimatedBpt, prices: externalPrices, } = params;
23
- const n = weightsBps.length;
24
- if (virtualBalances.length !== n ||
25
- lpActualBalances.length !== n ||
26
- decimals.length !== n) {
27
- throw new Error("predictLpLoss: length mismatch");
28
- }
29
- if (tokenInIndex < 0 || tokenInIndex >= n) {
30
- throw new Error("predictLpLoss: tokenInIndex out of range");
31
- }
32
- const supply = Number(bptTotalSupply);
33
- const estBpt = Number(estimatedBpt);
34
- const amountInWhole = toWhole(amountIn, decimals[tokenInIndex]);
35
- if (supply <= 0 || estBpt <= 0 || amountInWhole <= 0)
36
- return null;
37
- const weights = [];
38
- const virtuals = [];
39
- const actuals = [];
40
- for (let i = 0; i < n; i++) {
41
- weights.push(weightsBps[i] / config_1.WEIGHT_SCALE);
42
- virtuals.push(toWhole(virtualBalances[i], decimals[i]));
43
- actuals.push(toWhole(lpActualBalances[i], decimals[i]));
44
- }
45
- const externalComplete = externalPrices !== undefined &&
46
- externalPrices.length === n &&
47
- externalPrices.every((p) => typeof p === "number" && p > 0);
48
- const prices = [];
49
- for (let i = 0; i < n; i++) {
50
- const price = externalComplete
51
- ? externalPrices[i]
52
- : weights[i] / virtuals[i];
53
- if (!Number.isFinite(price) || price <= 0)
54
- return null;
55
- prices.push(price);
56
- }
57
- const feeRate = swapFeeRate / config_1.SWAP_FEE_PRECISION;
58
- const protoRate = protocolFeeRate / config_1.PROTOCOL_FEE_PRECISION;
59
- for (let i = 0; i < n; i++) {
60
- if (i === tokenInIndex)
61
- continue;
62
- const alloc = toWhole(allocations[i] ?? 0n, decimals[tokenInIndex]);
63
- const out = toWhole(expectedOuts[i] ?? 0n, decimals[i]);
64
- if (alloc <= 0 || out <= 0)
65
- continue;
66
- const protoFee = alloc * feeRate * protoRate;
67
- virtuals[tokenInIndex] += alloc - protoFee;
68
- actuals[tokenInIndex] += alloc - protoFee;
69
- virtuals[i] -= out;
70
- actuals[i] -= out;
71
- }
72
- const mintRatio = estBpt / supply;
73
- for (let i = 0; i < n; i++) {
74
- actuals[i] += toWhole(depositedAmounts[i] ?? 0n, decimals[i]);
75
- virtuals[i] *= 1 + mintRatio;
76
- }
77
- let logInvariant = 0;
78
- let logTarget = 0;
79
- for (let i = 0; i < n; i++) {
80
- if (weights[i] <= 0 || virtuals[i] <= 0)
81
- return null;
82
- logInvariant += weights[i] * Math.log(virtuals[i]);
83
- logTarget += weights[i] * Math.log(weights[i] / prices[i]);
84
- }
85
- const lambda = Math.exp(logInvariant - logTarget);
86
- let equilibriumPoolValue = 0;
87
- for (let i = 0; i < n; i++) {
88
- const equilibriumVirtual = (lambda * weights[i]) / prices[i];
89
- const equilibriumActual = Math.max(0, actuals[i] - (virtuals[i] - equilibriumVirtual));
90
- equilibriumPoolValue += equilibriumActual * prices[i];
91
- }
92
- const lpValue = (mintRatio / (1 + mintRatio)) * equilibriumPoolValue;
93
- let refundValue = 0;
94
- for (let i = 0; i < n; i++) {
95
- refundValue += toWhole(refundAmounts[i] ?? 0n, decimals[i]) * prices[i];
96
- }
97
- const depositValue = amountInWhole * prices[tokenInIndex];
98
- if (depositValue <= 0)
99
- return null;
100
- const loss = 1 - (lpValue + refundValue) / depositValue;
101
- return Math.min(100, Math.max(0, loss * 100));
102
- }
103
- //# sourceMappingURL=lpLoss.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lpLoss.js","sourceRoot":"","sources":["../../src/math/lpLoss.ts"],"names":[],"mappings":"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"}
@@ -1,138 +0,0 @@
1
- /**
2
- * Sliding-window cumulative-sell rate limiter + variable sell-off surge fee.
3
- *
4
- * Port of the v5.1 (post-audit) contracts:
5
- * `programs/cubic-pool/src/math/max_selloff.rs` (`check_and_advance`)
6
- * `programs/cubic-pool/src/math/surge_fee.rs` (`calc_surge_fee_pct`)
7
- * `programs/cubic-pool/src/instructions/user/swap.rs` (segmented charge)
8
- *
9
- * All arithmetic is bigint, mirroring the Rust u128 intermediates INCLUDING
10
- * integer-division order — do not "simplify" a `a*b/c` into a different
11
- * association, parity with the on-chain result depends on it. BN appears
12
- * only at the SDK boundary.
13
- *
14
- * v5.1 curve model: the fee RATE is piecewise-LINEAR in the normalized
15
- * window-fill coordinate `t ∈ [0, 1]` (threshold → 100% fill):
16
- * - no kink: low → high over [0, 1]
17
- * - kinked: low → mid over [0, k], mid → high over [k, 1]
18
- * and a swap is charged the AVERAGE rate over the span it crosses
19
- * (integral / width), which makes the fee path-independent — splitting a
20
- * sell into parts cannot cheapen it (audit M-05). The old exponential
21
- * convexity curve (A^t) is gone.
22
- */
23
- import BN from "bn.js";
24
- /** Mirrors cubic-pool::constants::SURGE_FEE_SEGMENTS. */
25
- export declare const SURGE_FEE_SEGMENTS = 4;
26
- export interface SelloffWindowInputs {
27
- maxSelloffPct: number;
28
- periodLength: number;
29
- previousSelloff: BN;
30
- currentSelloff: BN;
31
- windowStartTimestamp: BN;
32
- selloffVbSnapshot: BN;
33
- /** Current pre-trade virtual balance of the token. */
34
- virtualBalance: BN;
35
- /** Unix seconds. */
36
- now: number;
37
- }
38
- export interface SelloffWindowStatus {
39
- /** True when the limiter is configured (`maxSelloffPct > 0`). */
40
- enabled: boolean;
41
- cap: BN;
42
- /** Effective decayed usage WITHOUT a hypothetical trade. */
43
- used: BN;
44
- /** `max(0, cap - used)`. */
45
- remaining: BN;
46
- /** `used/cap` in PERCENT_SCALE units (0..10_000+); 0 when disabled/cap=0. */
47
- fillPct: number;
48
- windowStartTimestamp: BN;
49
- periodLength: number;
50
- /** Whether the projection at `now` rotated the window vs stored state. */
51
- rotated: boolean;
52
- /** Snapshot the cap was resolved against (post-projection). */
53
- vbSnapshot: BN;
54
- }
55
- /** Result of the pure bigint window projection. */
56
- export interface WindowProjection {
57
- opened: boolean;
58
- windowStart: bigint;
59
- elapsedInWindow: bigint;
60
- /** Carried-over previous usage, POST v5.1 snapshot rescale. */
61
- previous: bigint;
62
- current: bigint;
63
- vbSnapshot: bigint;
64
- cap: bigint;
65
- weightedPrev: bigint;
66
- /** weightedPrev + current (decayed effective, WITHOUT a hypothetical trade). */
67
- usedWithoutTrade: bigint;
68
- }
69
- /**
70
- * Pure bigint projection of the sliding window at `now`. Mirrors v5.1
71
- * `check_and_advance`'s rotation + snapshot logic (read-only, no
72
- * `amount_in`), including the audit addition: when the projection OPENS a
73
- * window against a new vb snapshot, the carried-over `previous` usage is
74
- * rescaled by `newSnapshot / oldSnapshot` so a liquidity change between
75
- * windows doesn't distort the carried percentage.
76
- */
77
- export declare function projectSelloffWindow(params: {
78
- maxSelloffPct: number;
79
- periodLength: number;
80
- previousSelloff: bigint;
81
- currentSelloff: bigint;
82
- windowStartTimestamp: bigint;
83
- selloffVbSnapshot: bigint;
84
- virtualBalance: bigint;
85
- now: number;
86
- }): WindowProjection;
87
- /** Read-only status of a token's max-selloff window at `now`. */
88
- export declare function computeSelloffWindow(inputs: SelloffWindowInputs): SelloffWindowStatus;
89
- /**
90
- * Average surge-fee percentage (PERCENT_SCALE units, 0..=10_000) charged for
91
- * moving the window fill from `effectiveSelloffBefore` to
92
- * `effectiveSelloffAfter` against `cap`. Port of v5.1 `calc_surge_fee_pct`:
93
- * the rate is INTEGRATED over the crossed span (CEIL), so the charge is
94
- * path-independent. When the span is empty (`after <= before`) the point
95
- * rate at `after` is returned.
96
- */
97
- export declare function calcSurgeFeePct(effectiveSelloffBefore: bigint, effectiveSelloffAfter: bigint, cap: bigint, thresholdPct: number, slopeLowPct: number, slopeMidPct: number, slopeHighPct: number, kinkPct: number): number;
98
- /**
99
- * CEIL fee application of a known percentage on `amount`, clamped to
100
- * `amount`. NOTE: the contract does NOT charge the whole output at one
101
- * rate — use {@link calcSegmentedSurgeFeeAmount} to mirror an actual swap.
102
- * This helper remains for coarse display math only.
103
- */
104
- export declare function calcSurgeFeeAmount(amountOut: bigint, surgePct: number): bigint;
105
- export interface SegmentedSurgeFeeParams {
106
- /** Window fill before the trade (`usedWithoutTrade`). */
107
- effectiveSelloffBefore: bigint;
108
- /** Window fill after the trade (`before + amountInNet`). */
109
- effectiveSelloffAfter: bigint;
110
- cap: bigint;
111
- thresholdPct: number;
112
- slopeLowPct: number;
113
- slopeMidPct: number;
114
- slopeHighPct: number;
115
- kinkPct: number;
116
- /** Post-swap-fee input driving the AMM curve (`amount_in_after_fee`). */
117
- amountInAfterFee: bigint;
118
- /** Full curve output of the trade (gross, pre-surge). */
119
- amountOut: bigint;
120
- /**
121
- * Cumulative AMM output for an input slice `x ∈ [0, amountInAfterFee]`
122
- * against the PRE-TRADE balances (i.e. `calc_out_given_in` with the same
123
- * arguments that produced `amountOut`).
124
- */
125
- curveOut: (amountInSlice: bigint) => bigint;
126
- /** Defaults to the contract's SURGE_FEE_SEGMENTS (= 4). */
127
- segments?: number;
128
- }
129
- /**
130
- * Surge fee in OUTPUT-token units for one swap — the exact v5.1 on-chain
131
- * charge (swap.rs): only the output produced ABOVE the threshold is taxed,
132
- * segment by segment across the taxed span, each segment's REAL curve
133
- * output at that segment's average rate (CEIL per segment), total clamped
134
- * to `amountOut`. Charging one average rate on the whole output would
135
- * re-open the audit M-05 split dodge on asymmetric pools.
136
- */
137
- export declare function calcSegmentedSurgeFeeAmount(p: SegmentedSurgeFeeParams): bigint;
138
- //# sourceMappingURL=maxSelloff.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"maxSelloff.d.ts","sourceRoot":"","sources":["../../src/math/maxSelloff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,MAAM,OAAO,CAAC;AAMvB,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,EAAE,CAAC;IACpB,cAAc,EAAE,EAAE,CAAC;IACnB,oBAAoB,EAAE,EAAE,CAAC;IACzB,iBAAiB,EAAE,EAAE,CAAC;IACtB,sDAAsD;IACtD,cAAc,EAAE,EAAE,CAAC;IACnB,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,EAAE,CAAC;IACR,4DAA4D;IAC5D,IAAI,EAAE,EAAE,CAAC;IACT,4BAA4B;IAC5B,SAAS,EAAE,EAAE,CAAC;IACd,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,UAAU,EAAE,EAAE,CAAC;CAChB;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,gBAAgB,CAoEnB;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CA0CrF;AAgGD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,sBAAsB,EAAE,MAAM,EAC9B,qBAAqB,EAAE,MAAM,EAC7B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAqCR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK9E;AAED,MAAM,WAAW,uBAAuB;IACtC,yDAAyD;IACzD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,4DAA4D;IAC5D,qBAAqB,EAAE,MAAM,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,uBAAuB,GAAG,MAAM,CAwE9E"}
@@ -1,330 +0,0 @@
1
- "use strict";
2
- /**
3
- * Sliding-window cumulative-sell rate limiter + variable sell-off surge fee.
4
- *
5
- * Port of the v5.1 (post-audit) contracts:
6
- * `programs/cubic-pool/src/math/max_selloff.rs` (`check_and_advance`)
7
- * `programs/cubic-pool/src/math/surge_fee.rs` (`calc_surge_fee_pct`)
8
- * `programs/cubic-pool/src/instructions/user/swap.rs` (segmented charge)
9
- *
10
- * All arithmetic is bigint, mirroring the Rust u128 intermediates INCLUDING
11
- * integer-division order — do not "simplify" a `a*b/c` into a different
12
- * association, parity with the on-chain result depends on it. BN appears
13
- * only at the SDK boundary.
14
- *
15
- * v5.1 curve model: the fee RATE is piecewise-LINEAR in the normalized
16
- * window-fill coordinate `t ∈ [0, 1]` (threshold → 100% fill):
17
- * - no kink: low → high over [0, 1]
18
- * - kinked: low → mid over [0, k], mid → high over [k, 1]
19
- * and a swap is charged the AVERAGE rate over the span it crosses
20
- * (integral / width), which makes the fee path-independent — splitting a
21
- * sell into parts cannot cheapen it (audit M-05). The old exponential
22
- * convexity curve (A^t) is gone.
23
- */
24
- var __importDefault = (this && this.__importDefault) || function (mod) {
25
- return (mod && mod.__esModule) ? mod : { "default": mod };
26
- };
27
- Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.SURGE_FEE_SEGMENTS = void 0;
29
- exports.projectSelloffWindow = projectSelloffWindow;
30
- exports.computeSelloffWindow = computeSelloffWindow;
31
- exports.calcSurgeFeePct = calcSurgeFeePct;
32
- exports.calcSurgeFeeAmount = calcSurgeFeeAmount;
33
- exports.calcSegmentedSurgeFeeAmount = calcSegmentedSurgeFeeAmount;
34
- const bn_js_1 = __importDefault(require("bn.js"));
35
- const config_1 = require("../config");
36
- const fixedPoint_1 = require("./fixedPoint");
37
- const SCALE = BigInt(config_1.PERCENT_SCALE); // 10_000
38
- /** Mirrors cubic-pool::constants::SURGE_FEE_SEGMENTS. */
39
- exports.SURGE_FEE_SEGMENTS = 4;
40
- /**
41
- * Pure bigint projection of the sliding window at `now`. Mirrors v5.1
42
- * `check_and_advance`'s rotation + snapshot logic (read-only, no
43
- * `amount_in`), including the audit addition: when the projection OPENS a
44
- * window against a new vb snapshot, the carried-over `previous` usage is
45
- * rescaled by `newSnapshot / oldSnapshot` so a liquidity change between
46
- * windows doesn't distort the carried percentage.
47
- */
48
- function projectSelloffWindow(params) {
49
- const period = BigInt(params.periodLength);
50
- const storedWs = params.windowStartTimestamp;
51
- const nowBI = BigInt(Math.trunc(params.now));
52
- const rawElapsed = nowBI - storedWs;
53
- const elapsed = rawElapsed < 0n ? 0n : rawElapsed;
54
- let prev;
55
- let cur;
56
- let ws;
57
- let eiw;
58
- let opened;
59
- if (period > 0n && elapsed >= 2n * period) {
60
- prev = 0n;
61
- cur = 0n;
62
- ws = nowBI;
63
- eiw = 0n;
64
- opened = true;
65
- }
66
- else if (period > 0n && elapsed >= period) {
67
- ws = storedWs + period;
68
- const e = nowBI - ws;
69
- eiw = e < 0n ? 0n : e;
70
- prev = params.currentSelloff;
71
- cur = 0n;
72
- opened = true;
73
- }
74
- else if (period <= 0n) {
75
- // Degenerate config (rejected on-chain by `require!(period > 0)`);
76
- // treat as a fresh reset so callers never divide by zero.
77
- prev = 0n;
78
- cur = 0n;
79
- ws = nowBI;
80
- eiw = 0n;
81
- opened = true;
82
- }
83
- else {
84
- prev = params.previousSelloff;
85
- cur = params.currentSelloff;
86
- ws = storedWs;
87
- eiw = elapsed;
88
- opened = false;
89
- }
90
- const oldSnapshot = params.selloffVbSnapshot;
91
- const vbSnapshot = opened || oldSnapshot === 0n ? params.virtualBalance : oldSnapshot;
92
- // v5.1: rescale the carried previous when the window opened against a
93
- // DIFFERENT snapshot (mirrors max_selloff.rs — integer division order!).
94
- if (opened && oldSnapshot > 0n && vbSnapshot !== oldSnapshot) {
95
- prev = (prev * vbSnapshot) / oldSnapshot;
96
- }
97
- const cap = (BigInt(params.maxSelloffPct) * vbSnapshot) / SCALE;
98
- const weightedPrev = period > 0n ? (prev * (period - eiw)) / period : 0n;
99
- const usedWithoutTrade = weightedPrev + cur;
100
- return {
101
- opened,
102
- windowStart: ws,
103
- elapsedInWindow: eiw,
104
- previous: prev,
105
- current: cur,
106
- vbSnapshot,
107
- cap,
108
- weightedPrev,
109
- usedWithoutTrade,
110
- };
111
- }
112
- /** Read-only status of a token's max-selloff window at `now`. */
113
- function computeSelloffWindow(inputs) {
114
- const enabled = inputs.maxSelloffPct > 0;
115
- if (!enabled) {
116
- return {
117
- enabled: false,
118
- cap: new bn_js_1.default(0),
119
- used: new bn_js_1.default(0),
120
- remaining: new bn_js_1.default(0),
121
- fillPct: 0,
122
- windowStartTimestamp: inputs.windowStartTimestamp,
123
- periodLength: inputs.periodLength,
124
- rotated: false,
125
- vbSnapshot: new bn_js_1.default(0),
126
- };
127
- }
128
- const proj = projectSelloffWindow({
129
- maxSelloffPct: inputs.maxSelloffPct,
130
- periodLength: inputs.periodLength,
131
- previousSelloff: BigInt(inputs.previousSelloff.toString()),
132
- currentSelloff: BigInt(inputs.currentSelloff.toString()),
133
- windowStartTimestamp: BigInt(inputs.windowStartTimestamp.toString()),
134
- selloffVbSnapshot: BigInt(inputs.selloffVbSnapshot.toString()),
135
- virtualBalance: BigInt(inputs.virtualBalance.toString()),
136
- now: inputs.now,
137
- });
138
- const used = proj.usedWithoutTrade;
139
- const remaining = proj.cap > used ? proj.cap - used : 0n;
140
- const fillPct = proj.cap === 0n ? 0 : Number((used * SCALE) / proj.cap);
141
- return {
142
- enabled: true,
143
- cap: new bn_js_1.default(proj.cap.toString()),
144
- used: new bn_js_1.default(used.toString()),
145
- remaining: new bn_js_1.default(remaining.toString()),
146
- fillPct,
147
- windowStartTimestamp: new bn_js_1.default(proj.windowStart.toString()),
148
- periodLength: inputs.periodLength,
149
- rotated: proj.opened,
150
- vbSnapshot: new bn_js_1.default(proj.vbSnapshot.toString()),
151
- };
152
- }
153
- // ── v5.1 piecewise-linear surge curve ───────────────────────────────────────
154
- /**
155
- * Kink position in normalized-t space. `kinkPct` is WHOLE percent of window
156
- * fill (0..=100, u8 on-chain); 0 (or a kink at/outside the [threshold, 100%]
157
- * band) disables the kink and the curve degenerates to low → high.
158
- * Port of `surge_fee.rs::kink_t`.
159
- */
160
- function kinkT(kinkPct, thresholdPct) {
161
- const thr = BigInt(thresholdPct);
162
- if (kinkPct === 0 || thr >= SCALE)
163
- return 0n;
164
- const kinkFill = BigInt(kinkPct) * (SCALE / 100n);
165
- if (kinkFill <= thr || kinkFill >= SCALE)
166
- return 0n;
167
- return ((kinkFill - thr) * fixedPoint_1.ONE) / (SCALE - thr);
168
- }
169
- /** Point rate at `t` (CEIL on the ramp, clamped to SCALE). Port of `rate_at`. */
170
- function rateAt(tFp, slopeLowPct, slopeMidPct, slopeHighPct, kFp) {
171
- const t = tFp < fixedPoint_1.ONE ? tFp : fixedPoint_1.ONE;
172
- const low = BigInt(slopeLowPct);
173
- const mid = BigInt(slopeMidPct);
174
- const high = BigInt(slopeHighPct);
175
- let base;
176
- let span;
177
- let num;
178
- let den;
179
- if (kFp === 0n) {
180
- base = low;
181
- span = high > low ? high - low : 0n;
182
- num = t;
183
- den = fixedPoint_1.ONE;
184
- }
185
- else if (t <= kFp) {
186
- base = low;
187
- span = mid > low ? mid - low : 0n;
188
- num = t;
189
- den = kFp;
190
- }
191
- else {
192
- base = mid;
193
- span = high > mid ? high - mid : 0n;
194
- num = t - kFp;
195
- den = fixedPoint_1.ONE - kFp;
196
- }
197
- const prod = span * num;
198
- const add = prod / den + (prod % den !== 0n ? 1n : 0n);
199
- const rate = base + add;
200
- return rate < SCALE ? rate : SCALE;
201
- }
202
- /**
203
- * ∫ rate over [0, t] (1e18-scaled area). Port of `integral_to` — keep the
204
- * `x*x/(2*den)` before the span multiply, exactly like the contract.
205
- */
206
- function integralTo(tFp, slopeLowPct, slopeMidPct, slopeHighPct, kFp) {
207
- const t = tFp < fixedPoint_1.ONE ? tFp : fixedPoint_1.ONE;
208
- const low = BigInt(slopeLowPct);
209
- const mid = BigInt(slopeMidPct);
210
- const high = BigInt(slopeHighPct);
211
- const ramp = (x, span, den) => {
212
- if (den === 0n || span === 0n || x === 0n)
213
- return 0n;
214
- const halfSq = (x * x) / (2n * den);
215
- return span * halfSq;
216
- };
217
- if (kFp === 0n) {
218
- const span = high > low ? high - low : 0n;
219
- return low * t + ramp(t, span, fixedPoint_1.ONE);
220
- }
221
- if (t <= kFp) {
222
- const span = mid > low ? mid - low : 0n;
223
- return low * t + ramp(t, span, kFp);
224
- }
225
- const first = (kFp * (low + mid)) / 2n;
226
- const rest = t - kFp;
227
- const span = high > mid ? high - mid : 0n;
228
- return first + mid * rest + ramp(rest, span, fixedPoint_1.ONE - kFp);
229
- }
230
- /**
231
- * Average surge-fee percentage (PERCENT_SCALE units, 0..=10_000) charged for
232
- * moving the window fill from `effectiveSelloffBefore` to
233
- * `effectiveSelloffAfter` against `cap`. Port of v5.1 `calc_surge_fee_pct`:
234
- * the rate is INTEGRATED over the crossed span (CEIL), so the charge is
235
- * path-independent. When the span is empty (`after <= before`) the point
236
- * rate at `after` is returned.
237
- */
238
- function calcSurgeFeePct(effectiveSelloffBefore, effectiveSelloffAfter, cap, thresholdPct, slopeLowPct, slopeMidPct, slopeHighPct, kinkPct) {
239
- if (cap === 0n || slopeHighPct === 0)
240
- return 0;
241
- const thr = BigInt(thresholdPct);
242
- if (thr >= SCALE)
243
- return 0;
244
- const kFp = kinkT(kinkPct, thresholdPct);
245
- const fill = (x) => {
246
- const raw = (x * SCALE) / cap;
247
- return raw < SCALE ? raw : SCALE;
248
- };
249
- const f0 = fill(effectiveSelloffBefore);
250
- const f1 = fill(effectiveSelloffAfter);
251
- if (f1 <= thr)
252
- return 0;
253
- const denom = SCALE - thr;
254
- const t1 = ((f1 - thr) * fixedPoint_1.ONE) / denom;
255
- if (f1 <= f0) {
256
- return Number(rateAt(t1, slopeLowPct, slopeMidPct, slopeHighPct, kFp));
257
- }
258
- const f0Clamped = f0 > thr ? f0 : thr;
259
- const t0 = ((f0Clamped - thr) * fixedPoint_1.ONE) / denom;
260
- const integral = integralTo(t1, slopeLowPct, slopeMidPct, slopeHighPct, kFp) -
261
- integralTo(t0, slopeLowPct, slopeMidPct, slopeHighPct, kFp);
262
- const integralClamped = integral > 0n ? integral : 0n;
263
- const numerator = denom * integralClamped;
264
- const width = f1 - f0Clamped;
265
- const scaledDen = width * fixedPoint_1.ONE;
266
- const avg = numerator / scaledDen + (numerator % scaledDen !== 0n ? 1n : 0n);
267
- return Number(avg < SCALE ? avg : SCALE);
268
- }
269
- /**
270
- * CEIL fee application of a known percentage on `amount`, clamped to
271
- * `amount`. NOTE: the contract does NOT charge the whole output at one
272
- * rate — use {@link calcSegmentedSurgeFeeAmount} to mirror an actual swap.
273
- * This helper remains for coarse display math only.
274
- */
275
- function calcSurgeFeeAmount(amountOut, surgePct) {
276
- if (surgePct <= 0 || amountOut <= 0n)
277
- return 0n;
278
- const num = amountOut * BigInt(surgePct);
279
- const fee = num / SCALE + (num % SCALE !== 0n ? 1n : 0n);
280
- return fee < amountOut ? fee : amountOut;
281
- }
282
- /**
283
- * Surge fee in OUTPUT-token units for one swap — the exact v5.1 on-chain
284
- * charge (swap.rs): only the output produced ABOVE the threshold is taxed,
285
- * segment by segment across the taxed span, each segment's REAL curve
286
- * output at that segment's average rate (CEIL per segment), total clamped
287
- * to `amountOut`. Charging one average rate on the whole output would
288
- * re-open the audit M-05 split dodge on asymmetric pools.
289
- */
290
- function calcSegmentedSurgeFeeAmount(p) {
291
- const { effectiveSelloffBefore: before, effectiveSelloffAfter: after, cap, thresholdPct, slopeLowPct, slopeMidPct, slopeHighPct, kinkPct, amountInAfterFee, amountOut, } = p;
292
- // Same precheck as swap.rs: whole-span average of 0 ⇒ nothing to charge.
293
- const wholeSpanPct = calcSurgeFeePct(before, after, cap, thresholdPct, slopeLowPct, slopeMidPct, slopeHighPct, kinkPct);
294
- if (wholeSpanPct === 0)
295
- return 0n;
296
- const thrUnits = (cap * BigInt(thresholdPct)) / SCALE;
297
- const span = after > before ? after - before : 0n;
298
- const taxedLo = before > thrUnits ? before : thrUnits;
299
- if (span === 0n || after <= taxedLo)
300
- return 0n;
301
- const segments = BigInt(p.segments ?? exports.SURGE_FEE_SEGMENTS);
302
- // Flooring the input slice understates the output, which overstates the
303
- // taxed remainder — the safe (conservative) direction, as on-chain.
304
- const cumulativeOut = (u) => {
305
- if (u <= before)
306
- return 0n;
307
- if (u >= after)
308
- return amountOut;
309
- const x = (amountInAfterFee * (u - before)) / span;
310
- return p.curveOut(x);
311
- };
312
- const taxedWidth = after - taxedLo;
313
- let feeAcc = 0n;
314
- let prevU = taxedLo;
315
- let prevY = cumulativeOut(taxedLo);
316
- for (let k = 1n; k <= segments; k++) {
317
- const u = k === segments ? after : taxedLo + (taxedWidth * k) / segments;
318
- const y = cumulativeOut(u);
319
- const segOut = y > prevY ? y - prevY : 0n;
320
- if (segOut > 0n && u > prevU) {
321
- const segPct = BigInt(calcSurgeFeePct(prevU, u, cap, thresholdPct, slopeLowPct, slopeMidPct, slopeHighPct, kinkPct));
322
- const num = segOut * segPct;
323
- feeAcc += num / SCALE + (num % SCALE !== 0n ? 1n : 0n);
324
- }
325
- prevU = u;
326
- prevY = y;
327
- }
328
- return feeAcc < amountOut ? feeAcc : amountOut;
329
- }
330
- //# sourceMappingURL=maxSelloff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"maxSelloff.js","sourceRoot":"","sources":["../../src/math/maxSelloff.ts"],"names":[],"mappings":"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"}