@varla/sdk 2.15.0 → 2.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/leverage/deleverageExecute.d.ts +6 -0
- package/dist/leverage/deleverageExecute.d.ts.map +1 -1
- package/dist/leverage/deleverageExecute.js +14 -1
- package/dist/leverage/deleverageExecute.js.map +1 -1
- package/dist/leverage/execute.d.ts +6 -0
- package/dist/leverage/execute.d.ts.map +1 -1
- package/dist/leverage/execute.js +14 -1
- package/dist/leverage/execute.js.map +1 -1
- package/dist/leverage/index.d.ts +1 -1
- package/dist/leverage/index.d.ts.map +1 -1
- package/dist/leverage/index.js +1 -1
- package/dist/leverage/index.js.map +1 -1
- package/dist/leverage/math.d.ts +12 -0
- package/dist/leverage/math.d.ts.map +1 -1
- package/dist/leverage/math.js +66 -5
- package/dist/leverage/math.js.map +1 -1
- package/dist/leverage/types.d.ts +23 -0
- package/dist/leverage/types.d.ts.map +1 -1
- package/dist/leverage/types.js +21 -0
- package/dist/leverage/types.js.map +1 -1
- package/package.json +1 -1
- package/src/leverage/deleverageExecute.ts +22 -0
- package/src/leverage/execute.ts +22 -0
- package/src/leverage/index.ts +1 -0
- package/src/leverage/math.ts +92 -5
- package/src/leverage/types.ts +39 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @varla-xyz/protocol
|
|
2
2
|
|
|
3
|
+
## 2.15.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a943668: Applied internal formatting adjustments in leverage execution and math utilities with no functional changes.
|
|
8
|
+
|
|
9
|
+
- Reorganized internal code formatting in leverage execution loops and planning calculations.
|
|
10
|
+
|
|
3
11
|
## 2.15.0
|
|
4
12
|
|
|
5
13
|
### Minor Changes
|
|
@@ -26,6 +26,12 @@ export type RunDeleverageLoopParams = {
|
|
|
26
26
|
}>) => Promise<SellResult>;
|
|
27
27
|
onProgress?: OnDeleverageProgress;
|
|
28
28
|
confirmations?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Maximum acceptable slippage for sell fills (bps).
|
|
31
|
+
* If `actualCollateral < expectedCollateral * (10_000 - maxSlippageBps) / 10_000`,
|
|
32
|
+
* the loop aborts with a `SlippageExceededError`.
|
|
33
|
+
*/
|
|
34
|
+
maxSlippageBps?: bigint;
|
|
29
35
|
};
|
|
30
36
|
export type RunDeleverageLoopResult = {
|
|
31
37
|
completed: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleverageExecute.d.ts","sourceRoot":"","sources":["../../src/leverage/deleverageExecute.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIhE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"deleverageExecute.d.ts","sourceRoot":"","sources":["../../src/leverage/deleverageExecute.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIhE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7E,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,CAAC;IAErB,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,KAAK,IAAI,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,2BAA2B,CAAC,CAAC;IACnF,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAClD,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACrF,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAgFlC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Note: explicit .js extension is required for Node ESM resolution.
|
|
2
2
|
import { prepareCoreRepay, prepareCoreWithdraw } from "../actions/core.js";
|
|
3
3
|
import { sendTx } from "../actions/tx.js";
|
|
4
|
+
import { SlippageExceededError } from "./types.js";
|
|
4
5
|
export async function runDeleverageLoop(params) {
|
|
5
|
-
const { plan, positionId, publicClient, walletClient, coreAddress, account, onSellStep, onProgress, confirmations = 1, } = params;
|
|
6
|
+
const { plan, positionId, publicClient, walletClient, coreAddress, account, onSellStep, onProgress, confirmations = 1, maxSlippageBps, } = params;
|
|
6
7
|
const total = plan.steps.length;
|
|
7
8
|
// Track actual collateral proceeds from the most recent sell step.
|
|
8
9
|
let lastSellActualCollateral;
|
|
@@ -24,6 +25,18 @@ export async function runDeleverageLoop(params) {
|
|
|
24
25
|
}
|
|
25
26
|
if (step.kind === "sell") {
|
|
26
27
|
const res = await onSellStep(step);
|
|
28
|
+
// Slippage guard: reject fills that deviate too far from expected.
|
|
29
|
+
if (maxSlippageBps !== undefined && step.expectedCollateral > 0n) {
|
|
30
|
+
const minAcceptable = (step.expectedCollateral * (10000n - maxSlippageBps)) / 10000n;
|
|
31
|
+
if (res.actualCollateral < minAcceptable) {
|
|
32
|
+
throw new SlippageExceededError({
|
|
33
|
+
expected: step.expectedCollateral,
|
|
34
|
+
actual: res.actualCollateral,
|
|
35
|
+
maxSlippageBps,
|
|
36
|
+
side: "sell",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
27
40
|
lastSellActualCollateral = res.actualCollateral;
|
|
28
41
|
onProgress?.({ completed: i + 1, total, step, sellResult: res });
|
|
29
42
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleverageExecute.js","sourceRoot":"","sources":["../../src/leverage/deleverageExecute.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAWpE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"deleverageExecute.js","sourceRoot":"","sources":["../../src/leverage/deleverageExecute.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,12 @@ export type RunLeverageLoopParams = {
|
|
|
33
33
|
onProgress?: OnLeverageProgress;
|
|
34
34
|
/** Number of block confirmations to wait per tx (default: 1). */
|
|
35
35
|
confirmations?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Maximum acceptable slippage for buy fills (bps).
|
|
38
|
+
* If `actualTokens < expectedTokens * (10_000 - maxSlippageBps) / 10_000`,
|
|
39
|
+
* the loop aborts with a `SlippageExceededError`.
|
|
40
|
+
*/
|
|
41
|
+
maxSlippageBps?: bigint;
|
|
36
42
|
};
|
|
37
43
|
export type RunLeverageLoopResult = {
|
|
38
44
|
/** Results for each step, aligned to `plan.steps`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/leverage/execute.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIhE,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/leverage/execute.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIhE,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,qBAAqB,GAAG;IAClC,gFAAgF;IAChF,IAAI,EAAE,YAAY,CAAC;IACnB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,2BAA2B,CAAC,CAAC;IACnF,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAClD,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;;;OAQG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAChF,kCAAkC;IAClC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,sDAAsD;IACtD,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;IACnB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAMF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAuGhC"}
|
package/dist/leverage/execute.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Note: explicit .js extension is required for Node ESM resolution.
|
|
2
2
|
import { prepareCoreBorrow, prepareCoreDeposit } from "../actions/core.js";
|
|
3
3
|
import { sendTx } from "../actions/tx.js";
|
|
4
|
+
import { SlippageExceededError } from "./types.js";
|
|
4
5
|
// ---------------------------------------------------------------------------
|
|
5
6
|
// Executor
|
|
6
7
|
// ---------------------------------------------------------------------------
|
|
@@ -19,7 +20,7 @@ import { sendTx } from "../actions/tx.js";
|
|
|
19
20
|
* If any step fails, execution stops and returns partial results.
|
|
20
21
|
*/
|
|
21
22
|
export async function runLeverageLoop(params) {
|
|
22
|
-
const { plan, positionId, publicClient, walletClient, coreAddress, account, onBuyStep, onProgress, confirmations = 1, } = params;
|
|
23
|
+
const { plan, positionId, publicClient, walletClient, coreAddress, account, onBuyStep, onProgress, confirmations = 1, maxSlippageBps, } = params;
|
|
23
24
|
const results = [];
|
|
24
25
|
const totalSteps = plan.steps.length;
|
|
25
26
|
// Track actual tokens from the most recent buy (for slippage-aware deposits).
|
|
@@ -29,6 +30,18 @@ export async function runLeverageLoop(params) {
|
|
|
29
30
|
try {
|
|
30
31
|
if (step.kind === "buy") {
|
|
31
32
|
const buyResult = await onBuyStep(step);
|
|
33
|
+
// Slippage guard: reject fills that deviate too far from expected.
|
|
34
|
+
if (maxSlippageBps !== undefined && step.expectedTokens > 0n) {
|
|
35
|
+
const minAcceptable = (step.expectedTokens * (10000n - maxSlippageBps)) / 10000n;
|
|
36
|
+
if (buyResult.actualTokens < minAcceptable) {
|
|
37
|
+
throw new SlippageExceededError({
|
|
38
|
+
expected: step.expectedTokens,
|
|
39
|
+
actual: buyResult.actualTokens,
|
|
40
|
+
maxSlippageBps,
|
|
41
|
+
side: "buy",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
32
45
|
lastBuyActualTokens = buyResult.actualTokens;
|
|
33
46
|
const result = { step, buyResult };
|
|
34
47
|
results.push(result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/leverage/execute.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAYpE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/leverage/execute.ts"],"names":[],"mappings":"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"}
|
package/dist/leverage/index.d.ts
CHANGED
|
@@ -28,5 +28,5 @@ export { planDeleverageFromChain, planLeverageFromChain, planLeverageFromChainPr
|
|
|
28
28
|
export type { ReadErc1155IsApprovedForAllParams } from "./preflight.js";
|
|
29
29
|
export { prepareApprovePositionsTokenIfNeeded, readErc1155IsApprovedForAll, } from "./preflight.js";
|
|
30
30
|
export type { BuyResult, DeleveragePlan, DeleverageStep, LeverageDirection, LeveragePlan, LeverageStep, LeverageStepResult, LeverageSummary, OnLeverageProgress, SellResult, } from "./types.js";
|
|
31
|
-
export { collateralForDollars, DEFAULT_MAX_ITERATIONS, DEFAULT_MIN_STEP_COLLATERAL, PRICE_E8, pow10, WAD, } from "./types.js";
|
|
31
|
+
export { collateralForDollars, DEFAULT_MAX_ITERATIONS, DEFAULT_MIN_STEP_COLLATERAL, PRICE_E8, pow10, SlippageExceededError, WAD, } from "./types.js";
|
|
32
32
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/leverage/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EACV,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,6BAA6B,EAC7B,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EACL,oCAAoC,EACpC,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,QAAQ,EACR,KAAK,EACL,GAAG,GACJ,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/leverage/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EACV,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,6BAA6B,EAC7B,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EACL,oCAAoC,EACpC,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,QAAQ,EACR,KAAK,EACL,qBAAqB,EACrB,GAAG,GACJ,MAAM,YAAY,CAAC"}
|
package/dist/leverage/index.js
CHANGED
|
@@ -8,5 +8,5 @@ export { collateralForTokens, estimateLiquidationPrice, leverageScenario, maxLev
|
|
|
8
8
|
export { planDeleverageFromChain, planLeverageFromChain, planLeverageFromChainPrecise, resolveLeveragePositionId, } from "./plan.js";
|
|
9
9
|
// Preflight
|
|
10
10
|
export { prepareApprovePositionsTokenIfNeeded, readErc1155IsApprovedForAll, } from "./preflight.js";
|
|
11
|
-
export { collateralForDollars, DEFAULT_MAX_ITERATIONS, DEFAULT_MIN_STEP_COLLATERAL, PRICE_E8, pow10, WAD, } from "./types.js";
|
|
11
|
+
export { collateralForDollars, DEFAULT_MAX_ITERATIONS, DEFAULT_MIN_STEP_COLLATERAL, PRICE_E8, pow10, SlippageExceededError, WAD, } from "./types.js";
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/leverage/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AA2BpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAM/C,YAAY;AACZ,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAMnB,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,WAAW,CAAC;AAEnB,YAAY;AACZ,OAAO,EACL,oCAAoC,EACpC,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAcxB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,QAAQ,EACR,KAAK,EACL,GAAG,GACJ,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/leverage/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AA2BpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAM/C,YAAY;AACZ,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAMnB,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,WAAW,CAAC;AAEnB,YAAY;AACZ,OAAO,EACL,oCAAoC,EACpC,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AAcxB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,QAAQ,EACR,KAAK,EACL,qBAAqB,EACrB,GAAG,GACJ,MAAM,YAAY,CAAC"}
|
package/dist/leverage/math.d.ts
CHANGED
|
@@ -55,6 +55,12 @@ export type PlanLeverageLoopParams = {
|
|
|
55
55
|
startingDebt?: bigint;
|
|
56
56
|
/** Optional absolute cap on total debt (collateral base units). */
|
|
57
57
|
maxTotalDebt?: bigint;
|
|
58
|
+
/**
|
|
59
|
+
* Assumed slippage/spread for CLOB buys (bps, e.g. 50 = 0.50%).
|
|
60
|
+
* Buys use an effectively higher price: `price * (10_000 + slippageBps) / 10_000`.
|
|
61
|
+
* Default: 0 (ideal execution).
|
|
62
|
+
*/
|
|
63
|
+
slippageBps?: bigint;
|
|
58
64
|
};
|
|
59
65
|
/**
|
|
60
66
|
* Plan a leverage loop (pure math, zero RPC).
|
|
@@ -87,6 +93,12 @@ export type PlanDeleverageParams = {
|
|
|
87
93
|
maxIterations?: number;
|
|
88
94
|
/** Minimum sell size (in collateral base units) to continue looping. */
|
|
89
95
|
minStepSell?: bigint;
|
|
96
|
+
/**
|
|
97
|
+
* Assumed slippage/spread for CLOB sells (bps, e.g. 50 = 0.50%).
|
|
98
|
+
* Sells use an effectively lower price: `price * (10_000 - slippageBps) / 10_000`.
|
|
99
|
+
* Default: 0 (ideal execution).
|
|
100
|
+
*/
|
|
101
|
+
slippageBps?: bigint;
|
|
90
102
|
};
|
|
91
103
|
/**
|
|
92
104
|
* Plan a deleverage (unwind) loop (pure math, zero RPC).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/leverage/math.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EAEd,YAAY,EAGb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/leverage/math.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,cAAc,EAEd,YAAY,EAGb,MAAM,YAAY,CAAC;AA+CpB;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAG1F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAErF;AAMD,MAAM,MAAM,sBAAsB,GAAG;IACnC,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,YAAY,CA+J7E;AAMD,MAAM,MAAM,oBAAoB,GAAG;IACjC,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAoI3E;AAMD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,gBAAgB,CAanB"}
|
package/dist/leverage/math.js
CHANGED
|
@@ -23,6 +23,19 @@ function mulDivUp(a, b, c) {
|
|
|
23
23
|
throw new Error("mulDivUp: division by zero");
|
|
24
24
|
return (a * b + c - 1n) / c;
|
|
25
25
|
}
|
|
26
|
+
/** BPS base (100%). */
|
|
27
|
+
const BPS_BASE = 10000n;
|
|
28
|
+
/**
|
|
29
|
+
* Adjust a price for slippage.
|
|
30
|
+
* - Buying: pay more per token → effective price goes UP.
|
|
31
|
+
* - Selling: receive less per token → effective price goes DOWN.
|
|
32
|
+
*/
|
|
33
|
+
function applySlippageToBuyPrice(price, slippageBps) {
|
|
34
|
+
return slippageBps > 0n ? mulDivUp(price, BPS_BASE + slippageBps, BPS_BASE) : price;
|
|
35
|
+
}
|
|
36
|
+
function applySlippageToSellPrice(price, slippageBps) {
|
|
37
|
+
return slippageBps > 0n ? mulDiv(price, BPS_BASE - slippageBps, BPS_BASE) : price;
|
|
38
|
+
}
|
|
26
39
|
// ---------------------------------------------------------------------------
|
|
27
40
|
// Public helpers
|
|
28
41
|
// ---------------------------------------------------------------------------
|
|
@@ -89,7 +102,7 @@ export function collateralForTokens(tokenAmount, tokenPriceE8) {
|
|
|
89
102
|
* If `maxIterations` is hit, the final iteration ends at `deposit`.
|
|
90
103
|
*/
|
|
91
104
|
export function planLeverageLoop(params) {
|
|
92
|
-
const { initialCapital, tokenPriceE8, ltvWad, targetLeverageWad, maxIterations = DEFAULT_MAX_ITERATIONS, minStepBorrow = DEFAULT_MIN_STEP_COLLATERAL, startingTokens = 0n, startingDebt = 0n, maxTotalDebt, } = params;
|
|
105
|
+
const { initialCapital, tokenPriceE8, ltvWad, targetLeverageWad, maxIterations = DEFAULT_MAX_ITERATIONS, minStepBorrow = DEFAULT_MIN_STEP_COLLATERAL, startingTokens = 0n, startingDebt = 0n, maxTotalDebt, slippageBps = 0n, } = params;
|
|
93
106
|
if (initialCapital <= 0n)
|
|
94
107
|
throw new Error("initialCapital must be > 0");
|
|
95
108
|
if (tokenPriceE8 <= 0n)
|
|
@@ -102,7 +115,12 @@ export function planLeverageLoop(params) {
|
|
|
102
115
|
throw new Error("startingTokens must be >= 0");
|
|
103
116
|
if (startingDebt < 0n)
|
|
104
117
|
throw new Error("startingDebt must be >= 0");
|
|
118
|
+
if (slippageBps < 0n)
|
|
119
|
+
throw new Error("slippageBps must be >= 0");
|
|
120
|
+
if (slippageBps >= BPS_BASE)
|
|
121
|
+
throw new Error("slippageBps must be < 10_000");
|
|
105
122
|
const maxLev = maxLeverage(ltvWad);
|
|
123
|
+
const effectiveBuyPrice = applySlippageToBuyPrice(tokenPriceE8, slippageBps);
|
|
106
124
|
// Target leverage semantics:
|
|
107
125
|
// - undefined => run to max (bounded by maxIterations / minStepBorrow / caps)
|
|
108
126
|
// - <= 1× => treat as 1× (no borrowing)
|
|
@@ -132,7 +150,8 @@ export function planLeverageLoop(params) {
|
|
|
132
150
|
break;
|
|
133
151
|
// buy
|
|
134
152
|
const spendCollateral = collateralAvailable;
|
|
135
|
-
|
|
153
|
+
// Use effective (slippage-adjusted) price for buy, but ideal price for expectedTokens display.
|
|
154
|
+
const tokensBought = tokensForCollateral(spendCollateral, effectiveBuyPrice);
|
|
136
155
|
if (tokensBought <= 0n)
|
|
137
156
|
break;
|
|
138
157
|
// Spend the available collateral for this iteration.
|
|
@@ -188,6 +207,16 @@ export function planLeverageLoop(params) {
|
|
|
188
207
|
estimatedLiquidationPriceE8,
|
|
189
208
|
iterations,
|
|
190
209
|
maxLeverageWad: maxLev,
|
|
210
|
+
assumedSlippageBps: slippageBps,
|
|
211
|
+
totalSlippageCost: slippageBps > 0n
|
|
212
|
+
? clampPositive(
|
|
213
|
+
// Ideal tokens - actual tokens, valued at mid price.
|
|
214
|
+
collateralForTokens(steps
|
|
215
|
+
.filter((s) => s.kind === "buy")
|
|
216
|
+
.reduce((acc, s) => acc + tokensForCollateral(s.collateralAmount, tokenPriceE8), 0n) -
|
|
217
|
+
totalTokens +
|
|
218
|
+
startingTokens, tokenPriceE8))
|
|
219
|
+
: 0n,
|
|
191
220
|
};
|
|
192
221
|
return {
|
|
193
222
|
steps,
|
|
@@ -208,7 +237,7 @@ export function planLeverageLoop(params) {
|
|
|
208
237
|
* Steps: withdraw → sell → repay → ...
|
|
209
238
|
*/
|
|
210
239
|
export function planDeleverage(params) {
|
|
211
|
-
const { depositedTokens, currentDebt, tokenPriceE8, ltvWad, targetDebtReduction, maxIterations = DEFAULT_MAX_ITERATIONS, minStepSell = DEFAULT_MIN_STEP_COLLATERAL, } = params;
|
|
240
|
+
const { depositedTokens, currentDebt, tokenPriceE8, ltvWad, targetDebtReduction, maxIterations = DEFAULT_MAX_ITERATIONS, minStepSell = DEFAULT_MIN_STEP_COLLATERAL, slippageBps = 0n, } = params;
|
|
212
241
|
if (tokenPriceE8 <= 0n)
|
|
213
242
|
throw new Error("tokenPriceE8 must be > 0");
|
|
214
243
|
if (ltvWad <= 0n || ltvWad >= WAD)
|
|
@@ -217,6 +246,11 @@ export function planDeleverage(params) {
|
|
|
217
246
|
throw new Error("depositedTokens must be >= 0");
|
|
218
247
|
if (currentDebt < 0n)
|
|
219
248
|
throw new Error("currentDebt must be >= 0");
|
|
249
|
+
if (slippageBps < 0n)
|
|
250
|
+
throw new Error("slippageBps must be >= 0");
|
|
251
|
+
if (slippageBps >= BPS_BASE)
|
|
252
|
+
throw new Error("slippageBps must be < 10_000");
|
|
253
|
+
const effectiveSellPrice = applySlippageToSellPrice(tokenPriceE8, slippageBps);
|
|
220
254
|
const targetRepay = targetDebtReduction === "full" ? currentDebt : targetDebtReduction;
|
|
221
255
|
if (targetRepay <= 0n) {
|
|
222
256
|
return {
|
|
@@ -227,6 +261,8 @@ export function planDeleverage(params) {
|
|
|
227
261
|
tokensRemaining: depositedTokens,
|
|
228
262
|
collateralRemaining: 0n,
|
|
229
263
|
iterations: 0,
|
|
264
|
+
assumedSlippageBps: slippageBps,
|
|
265
|
+
totalSlippageCost: 0n,
|
|
230
266
|
},
|
|
231
267
|
};
|
|
232
268
|
}
|
|
@@ -235,6 +271,7 @@ export function planDeleverage(params) {
|
|
|
235
271
|
let remainingDebt = currentDebt;
|
|
236
272
|
let totalSold = 0n;
|
|
237
273
|
let totalRepaid = 0n;
|
|
274
|
+
let excessCollateral = 0n; // sell proceeds not used for repayment (returned to user)
|
|
238
275
|
for (let i = 0; i < maxIterations; i++) {
|
|
239
276
|
if (remainingDebt <= 0n)
|
|
240
277
|
break;
|
|
@@ -255,7 +292,7 @@ export function planDeleverage(params) {
|
|
|
255
292
|
const tokensToWithdraw = withdrawable < tokensNeededForTarget ? withdrawable : tokensNeededForTarget;
|
|
256
293
|
if (tokensToWithdraw <= 0n)
|
|
257
294
|
break;
|
|
258
|
-
const collateralProceeds = collateralForTokens(tokensToWithdraw,
|
|
295
|
+
const collateralProceeds = collateralForTokens(tokensToWithdraw, effectiveSellPrice);
|
|
259
296
|
if (collateralProceeds < minStepSell)
|
|
260
297
|
break;
|
|
261
298
|
// withdraw
|
|
@@ -274,8 +311,27 @@ export function planDeleverage(params) {
|
|
|
274
311
|
steps.push({ kind: "repay", collateralAmount: repayAmount, iteration: i });
|
|
275
312
|
remainingDebt -= repayAmount;
|
|
276
313
|
totalRepaid += repayAmount;
|
|
314
|
+
excessCollateral += collateralProceeds - repayAmount;
|
|
315
|
+
}
|
|
316
|
+
// Phase 2: After all debt is repaid, withdraw and sell remaining tokens.
|
|
317
|
+
// This ensures "full" close returns all collateral to the user, not just repays debt.
|
|
318
|
+
// Only fires when debt is fully repaid — if debt remains (underwater/stuck), skip.
|
|
319
|
+
if (targetDebtReduction === "full" && remainingDebt <= 0n && remainingTokens > 0n) {
|
|
320
|
+
const collateralProceeds = collateralForTokens(remainingTokens, tokenPriceE8);
|
|
321
|
+
const iteration = steps.length > 0 ? steps[steps.length - 1].iteration + 1 : 0;
|
|
322
|
+
steps.push({ kind: "withdraw", amount: remainingTokens, iteration });
|
|
323
|
+
steps.push({
|
|
324
|
+
kind: "sell",
|
|
325
|
+
tokenAmount: remainingTokens,
|
|
326
|
+
expectedCollateral: collateralProceeds,
|
|
327
|
+
iteration,
|
|
328
|
+
});
|
|
329
|
+
excessCollateral += collateralProceeds;
|
|
330
|
+
totalSold += remainingTokens;
|
|
331
|
+
remainingTokens = 0n;
|
|
277
332
|
}
|
|
278
|
-
const collateralRemaining =
|
|
333
|
+
const collateralRemaining = excessCollateral +
|
|
334
|
+
clampPositive(collateralForTokens(remainingTokens, tokenPriceE8) - remainingDebt);
|
|
279
335
|
const iterations = steps.length > 0 ? steps[steps.length - 1].iteration + 1 : 0;
|
|
280
336
|
return {
|
|
281
337
|
steps,
|
|
@@ -285,6 +341,11 @@ export function planDeleverage(params) {
|
|
|
285
341
|
tokensRemaining: remainingTokens,
|
|
286
342
|
collateralRemaining,
|
|
287
343
|
iterations,
|
|
344
|
+
assumedSlippageBps: slippageBps,
|
|
345
|
+
totalSlippageCost: slippageBps > 0n
|
|
346
|
+
? clampPositive(collateralForTokens(totalSold, tokenPriceE8) -
|
|
347
|
+
collateralForTokens(totalSold, effectiveSellPrice))
|
|
348
|
+
: 0n,
|
|
288
349
|
},
|
|
289
350
|
};
|
|
290
351
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/leverage/math.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/leverage/math.ts"],"names":[],"mappings":"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"}
|
package/dist/leverage/types.d.ts
CHANGED
|
@@ -79,6 +79,10 @@ export type LeverageSummary = {
|
|
|
79
79
|
iterations: number;
|
|
80
80
|
/** Maximum theoretical leverage = 1 / (1 - LTV) as WAD. */
|
|
81
81
|
maxLeverageWad: bigint;
|
|
82
|
+
/** Assumed slippage/spread used in planning (bps). 0 if not specified. */
|
|
83
|
+
assumedSlippageBps: bigint;
|
|
84
|
+
/** Total collateral lost to slippage across all buy steps (base units). */
|
|
85
|
+
totalSlippageCost: bigint;
|
|
82
86
|
};
|
|
83
87
|
/**
|
|
84
88
|
* Complete leverage plan returned by the planner.
|
|
@@ -124,6 +128,10 @@ export type DeleveragePlan = {
|
|
|
124
128
|
tokensRemaining: bigint;
|
|
125
129
|
collateralRemaining: bigint;
|
|
126
130
|
iterations: number;
|
|
131
|
+
/** Assumed slippage/spread used in planning (bps). 0 if not specified. */
|
|
132
|
+
assumedSlippageBps: bigint;
|
|
133
|
+
/** Total collateral lost to slippage across all sell steps (base units). */
|
|
134
|
+
totalSlippageCost: bigint;
|
|
127
135
|
};
|
|
128
136
|
};
|
|
129
137
|
/**
|
|
@@ -154,4 +162,19 @@ export type OnLeverageProgress = (info: {
|
|
|
154
162
|
step: LeverageStep;
|
|
155
163
|
result: LeverageStepResult;
|
|
156
164
|
}) => void;
|
|
165
|
+
/**
|
|
166
|
+
* Thrown by executors when actual fill deviates beyond `maxSlippageBps`.
|
|
167
|
+
*/
|
|
168
|
+
export declare class SlippageExceededError extends Error {
|
|
169
|
+
readonly expected: bigint;
|
|
170
|
+
readonly actual: bigint;
|
|
171
|
+
readonly maxSlippageBps: bigint;
|
|
172
|
+
readonly side: "buy" | "sell";
|
|
173
|
+
constructor(params: {
|
|
174
|
+
expected: bigint;
|
|
175
|
+
actual: bigint;
|
|
176
|
+
maxSlippageBps: bigint;
|
|
177
|
+
side: "buy" | "sell";
|
|
178
|
+
});
|
|
179
|
+
}
|
|
157
180
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/leverage/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAMjC,4BAA4B;AAC5B,eAAO,MAAM,GAAG,uBAA6B,CAAC;AAE9C,4CAA4C;AAC5C,eAAO,MAAM,QAAQ,aAAe,CAAC;AAErC,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,WAAa,CAAC;AAMtD,8BAA8B;AAC9B,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKvC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE1F;AAMD,2CAA2C;AAC3C,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,sEAAsE;IACtE,gBAAgB,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,2BAA2B,EAAE,MAAM,CAAC;IACpC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/leverage/types.ts"],"names":[],"mappings":"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"}
|
package/dist/leverage/types.js
CHANGED
|
@@ -40,4 +40,25 @@ export function pow10(n) {
|
|
|
40
40
|
export function collateralForDollars(params) {
|
|
41
41
|
return params.dollars * pow10(params.decimals);
|
|
42
42
|
}
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Slippage error
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/**
|
|
47
|
+
* Thrown by executors when actual fill deviates beyond `maxSlippageBps`.
|
|
48
|
+
*/
|
|
49
|
+
export class SlippageExceededError extends Error {
|
|
50
|
+
expected;
|
|
51
|
+
actual;
|
|
52
|
+
maxSlippageBps;
|
|
53
|
+
side;
|
|
54
|
+
constructor(params) {
|
|
55
|
+
const pct = (Number(params.maxSlippageBps) / 100).toFixed(2);
|
|
56
|
+
super(`Slippage exceeded on ${params.side}: expected ${params.expected}, got ${params.actual} (max ${pct}%)`);
|
|
57
|
+
this.name = "SlippageExceededError";
|
|
58
|
+
this.expected = params.expected;
|
|
59
|
+
this.actual = params.actual;
|
|
60
|
+
this.maxSlippageBps = params.maxSlippageBps;
|
|
61
|
+
this.side = params.side;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
43
64
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/leverage/types.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAIpE,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,4BAA4B;AAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,oBAA0B,CAAC;AAE9C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAY,CAAC;AAErC,oDAAoD;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,QAAU,CAAC;AAEtD,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,8BAA8B;AAC9B,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC5E,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,GAAG,CAAC;IACvC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA6C;IAChF,OAAO,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/leverage/types.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAIpE,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,4BAA4B;AAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,oBAA0B,CAAC;AAE9C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAY,CAAC;AAErC,oDAAoD;AACpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,QAAU,CAAC;AAEtD,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,8BAA8B;AAC9B,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC5E,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,GAAG,CAAC;IACvC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA6C;IAChF,OAAO,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAoKD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,cAAc,CAAS;IACvB,IAAI,CAAiB;IAE9B,YAAY,MAKX;QACC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,CACH,wBAAwB,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CACvG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -12,6 +12,7 @@ import type { Address, PublicClient, WalletClient } from "viem";
|
|
|
12
12
|
import { prepareCoreRepay, prepareCoreWithdraw } from "../actions/core.js";
|
|
13
13
|
import { sendTx } from "../actions/tx.js";
|
|
14
14
|
import type { DeleveragePlan, DeleverageStep, SellResult } from "./types.js";
|
|
15
|
+
import { SlippageExceededError } from "./types.js";
|
|
15
16
|
|
|
16
17
|
export type OnDeleverageProgress = (info: {
|
|
17
18
|
completed: number;
|
|
@@ -33,6 +34,12 @@ export type RunDeleverageLoopParams = {
|
|
|
33
34
|
onSellStep: (step: Extract<DeleverageStep, { kind: "sell" }>) => Promise<SellResult>;
|
|
34
35
|
onProgress?: OnDeleverageProgress;
|
|
35
36
|
confirmations?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Maximum acceptable slippage for sell fills (bps).
|
|
39
|
+
* If `actualCollateral < expectedCollateral * (10_000 - maxSlippageBps) / 10_000`,
|
|
40
|
+
* the loop aborts with a `SlippageExceededError`.
|
|
41
|
+
*/
|
|
42
|
+
maxSlippageBps?: bigint;
|
|
36
43
|
};
|
|
37
44
|
|
|
38
45
|
export type RunDeleverageLoopResult = {
|
|
@@ -54,6 +61,7 @@ export async function runDeleverageLoop(
|
|
|
54
61
|
onSellStep,
|
|
55
62
|
onProgress,
|
|
56
63
|
confirmations = 1,
|
|
64
|
+
maxSlippageBps,
|
|
57
65
|
} = params;
|
|
58
66
|
|
|
59
67
|
const total = plan.steps.length;
|
|
@@ -80,6 +88,20 @@ export async function runDeleverageLoop(
|
|
|
80
88
|
|
|
81
89
|
if (step.kind === "sell") {
|
|
82
90
|
const res = await onSellStep(step);
|
|
91
|
+
|
|
92
|
+
// Slippage guard: reject fills that deviate too far from expected.
|
|
93
|
+
if (maxSlippageBps !== undefined && step.expectedCollateral > 0n) {
|
|
94
|
+
const minAcceptable = (step.expectedCollateral * (10_000n - maxSlippageBps)) / 10_000n;
|
|
95
|
+
if (res.actualCollateral < minAcceptable) {
|
|
96
|
+
throw new SlippageExceededError({
|
|
97
|
+
expected: step.expectedCollateral,
|
|
98
|
+
actual: res.actualCollateral,
|
|
99
|
+
maxSlippageBps,
|
|
100
|
+
side: "sell",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
83
105
|
lastSellActualCollateral = res.actualCollateral;
|
|
84
106
|
onProgress?.({ completed: i + 1, total, step, sellResult: res });
|
|
85
107
|
continue;
|
package/src/leverage/execute.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
LeverageStepResult,
|
|
20
20
|
OnLeverageProgress,
|
|
21
21
|
} from "./types.js";
|
|
22
|
+
import { SlippageExceededError } from "./types.js";
|
|
22
23
|
|
|
23
24
|
// ---------------------------------------------------------------------------
|
|
24
25
|
// Types
|
|
@@ -48,6 +49,12 @@ export type RunLeverageLoopParams = {
|
|
|
48
49
|
onProgress?: OnLeverageProgress;
|
|
49
50
|
/** Number of block confirmations to wait per tx (default: 1). */
|
|
50
51
|
confirmations?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Maximum acceptable slippage for buy fills (bps).
|
|
54
|
+
* If `actualTokens < expectedTokens * (10_000 - maxSlippageBps) / 10_000`,
|
|
55
|
+
* the loop aborts with a `SlippageExceededError`.
|
|
56
|
+
*/
|
|
57
|
+
maxSlippageBps?: bigint;
|
|
51
58
|
};
|
|
52
59
|
|
|
53
60
|
export type RunLeverageLoopResult = {
|
|
@@ -92,6 +99,7 @@ export async function runLeverageLoop(
|
|
|
92
99
|
onBuyStep,
|
|
93
100
|
onProgress,
|
|
94
101
|
confirmations = 1,
|
|
102
|
+
maxSlippageBps,
|
|
95
103
|
} = params;
|
|
96
104
|
|
|
97
105
|
const results: LeverageStepResult[] = [];
|
|
@@ -106,6 +114,20 @@ export async function runLeverageLoop(
|
|
|
106
114
|
try {
|
|
107
115
|
if (step.kind === "buy") {
|
|
108
116
|
const buyResult = await onBuyStep(step);
|
|
117
|
+
|
|
118
|
+
// Slippage guard: reject fills that deviate too far from expected.
|
|
119
|
+
if (maxSlippageBps !== undefined && step.expectedTokens > 0n) {
|
|
120
|
+
const minAcceptable = (step.expectedTokens * (10_000n - maxSlippageBps)) / 10_000n;
|
|
121
|
+
if (buyResult.actualTokens < minAcceptable) {
|
|
122
|
+
throw new SlippageExceededError({
|
|
123
|
+
expected: step.expectedTokens,
|
|
124
|
+
actual: buyResult.actualTokens,
|
|
125
|
+
maxSlippageBps,
|
|
126
|
+
side: "buy",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
109
131
|
lastBuyActualTokens = buyResult.actualTokens;
|
|
110
132
|
|
|
111
133
|
const result: LeverageStepResult = { step, buyResult };
|
package/src/leverage/index.ts
CHANGED
package/src/leverage/math.ts
CHANGED
|
@@ -41,6 +41,21 @@ function mulDivUp(a: bigint, b: bigint, c: bigint): bigint {
|
|
|
41
41
|
return (a * b + c - 1n) / c;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/** BPS base (100%). */
|
|
45
|
+
const BPS_BASE = 10_000n;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Adjust a price for slippage.
|
|
49
|
+
* - Buying: pay more per token → effective price goes UP.
|
|
50
|
+
* - Selling: receive less per token → effective price goes DOWN.
|
|
51
|
+
*/
|
|
52
|
+
function applySlippageToBuyPrice(price: bigint, slippageBps: bigint): bigint {
|
|
53
|
+
return slippageBps > 0n ? mulDivUp(price, BPS_BASE + slippageBps, BPS_BASE) : price;
|
|
54
|
+
}
|
|
55
|
+
function applySlippageToSellPrice(price: bigint, slippageBps: bigint): bigint {
|
|
56
|
+
return slippageBps > 0n ? mulDiv(price, BPS_BASE - slippageBps, BPS_BASE) : price;
|
|
57
|
+
}
|
|
58
|
+
|
|
44
59
|
// ---------------------------------------------------------------------------
|
|
45
60
|
// Public helpers
|
|
46
61
|
// ---------------------------------------------------------------------------
|
|
@@ -126,6 +141,12 @@ export type PlanLeverageLoopParams = {
|
|
|
126
141
|
startingDebt?: bigint;
|
|
127
142
|
/** Optional absolute cap on total debt (collateral base units). */
|
|
128
143
|
maxTotalDebt?: bigint;
|
|
144
|
+
/**
|
|
145
|
+
* Assumed slippage/spread for CLOB buys (bps, e.g. 50 = 0.50%).
|
|
146
|
+
* Buys use an effectively higher price: `price * (10_000 + slippageBps) / 10_000`.
|
|
147
|
+
* Default: 0 (ideal execution).
|
|
148
|
+
*/
|
|
149
|
+
slippageBps?: bigint;
|
|
129
150
|
};
|
|
130
151
|
|
|
131
152
|
/**
|
|
@@ -151,6 +172,7 @@ export function planLeverageLoop(params: PlanLeverageLoopParams): LeveragePlan {
|
|
|
151
172
|
startingTokens = 0n,
|
|
152
173
|
startingDebt = 0n,
|
|
153
174
|
maxTotalDebt,
|
|
175
|
+
slippageBps = 0n,
|
|
154
176
|
} = params;
|
|
155
177
|
|
|
156
178
|
if (initialCapital <= 0n) throw new Error("initialCapital must be > 0");
|
|
@@ -159,8 +181,11 @@ export function planLeverageLoop(params: PlanLeverageLoopParams): LeveragePlan {
|
|
|
159
181
|
if (maxIterations < 1) throw new Error("maxIterations must be >= 1");
|
|
160
182
|
if (startingTokens < 0n) throw new Error("startingTokens must be >= 0");
|
|
161
183
|
if (startingDebt < 0n) throw new Error("startingDebt must be >= 0");
|
|
184
|
+
if (slippageBps < 0n) throw new Error("slippageBps must be >= 0");
|
|
185
|
+
if (slippageBps >= BPS_BASE) throw new Error("slippageBps must be < 10_000");
|
|
162
186
|
|
|
163
187
|
const maxLev = maxLeverage(ltvWad);
|
|
188
|
+
const effectiveBuyPrice = applySlippageToBuyPrice(tokenPriceE8, slippageBps);
|
|
164
189
|
|
|
165
190
|
// Target leverage semantics:
|
|
166
191
|
// - undefined => run to max (bounded by maxIterations / minStepBorrow / caps)
|
|
@@ -198,7 +223,8 @@ export function planLeverageLoop(params: PlanLeverageLoopParams): LeveragePlan {
|
|
|
198
223
|
// buy
|
|
199
224
|
const spendCollateral = collateralAvailable;
|
|
200
225
|
|
|
201
|
-
|
|
226
|
+
// Use effective (slippage-adjusted) price for buy, but ideal price for expectedTokens display.
|
|
227
|
+
const tokensBought = tokensForCollateral(spendCollateral, effectiveBuyPrice);
|
|
202
228
|
if (tokensBought <= 0n) break;
|
|
203
229
|
|
|
204
230
|
// Spend the available collateral for this iteration.
|
|
@@ -262,6 +288,24 @@ export function planLeverageLoop(params: PlanLeverageLoopParams): LeveragePlan {
|
|
|
262
288
|
estimatedLiquidationPriceE8,
|
|
263
289
|
iterations,
|
|
264
290
|
maxLeverageWad: maxLev,
|
|
291
|
+
assumedSlippageBps: slippageBps,
|
|
292
|
+
totalSlippageCost:
|
|
293
|
+
slippageBps > 0n
|
|
294
|
+
? clampPositive(
|
|
295
|
+
// Ideal tokens - actual tokens, valued at mid price.
|
|
296
|
+
collateralForTokens(
|
|
297
|
+
steps
|
|
298
|
+
.filter((s): s is Extract<LeverageStep, { kind: "buy" }> => s.kind === "buy")
|
|
299
|
+
.reduce(
|
|
300
|
+
(acc, s) => acc + tokensForCollateral(s.collateralAmount, tokenPriceE8),
|
|
301
|
+
0n,
|
|
302
|
+
) -
|
|
303
|
+
totalTokens +
|
|
304
|
+
startingTokens,
|
|
305
|
+
tokenPriceE8,
|
|
306
|
+
),
|
|
307
|
+
)
|
|
308
|
+
: 0n,
|
|
265
309
|
};
|
|
266
310
|
|
|
267
311
|
return {
|
|
@@ -300,6 +344,12 @@ export type PlanDeleverageParams = {
|
|
|
300
344
|
maxIterations?: number;
|
|
301
345
|
/** Minimum sell size (in collateral base units) to continue looping. */
|
|
302
346
|
minStepSell?: bigint;
|
|
347
|
+
/**
|
|
348
|
+
* Assumed slippage/spread for CLOB sells (bps, e.g. 50 = 0.50%).
|
|
349
|
+
* Sells use an effectively lower price: `price * (10_000 - slippageBps) / 10_000`.
|
|
350
|
+
* Default: 0 (ideal execution).
|
|
351
|
+
*/
|
|
352
|
+
slippageBps?: bigint;
|
|
303
353
|
};
|
|
304
354
|
|
|
305
355
|
/**
|
|
@@ -316,12 +366,17 @@ export function planDeleverage(params: PlanDeleverageParams): DeleveragePlan {
|
|
|
316
366
|
targetDebtReduction,
|
|
317
367
|
maxIterations = DEFAULT_MAX_ITERATIONS,
|
|
318
368
|
minStepSell = DEFAULT_MIN_STEP_COLLATERAL,
|
|
369
|
+
slippageBps = 0n,
|
|
319
370
|
} = params;
|
|
320
371
|
|
|
321
372
|
if (tokenPriceE8 <= 0n) throw new Error("tokenPriceE8 must be > 0");
|
|
322
373
|
if (ltvWad <= 0n || ltvWad >= WAD) throw new Error("ltvWad must be in (0, 1e18)");
|
|
323
374
|
if (depositedTokens < 0n) throw new Error("depositedTokens must be >= 0");
|
|
324
375
|
if (currentDebt < 0n) throw new Error("currentDebt must be >= 0");
|
|
376
|
+
if (slippageBps < 0n) throw new Error("slippageBps must be >= 0");
|
|
377
|
+
if (slippageBps >= BPS_BASE) throw new Error("slippageBps must be < 10_000");
|
|
378
|
+
|
|
379
|
+
const effectiveSellPrice = applySlippageToSellPrice(tokenPriceE8, slippageBps);
|
|
325
380
|
|
|
326
381
|
const targetRepay = targetDebtReduction === "full" ? currentDebt : targetDebtReduction;
|
|
327
382
|
if (targetRepay <= 0n) {
|
|
@@ -333,6 +388,8 @@ export function planDeleverage(params: PlanDeleverageParams): DeleveragePlan {
|
|
|
333
388
|
tokensRemaining: depositedTokens,
|
|
334
389
|
collateralRemaining: 0n,
|
|
335
390
|
iterations: 0,
|
|
391
|
+
assumedSlippageBps: slippageBps,
|
|
392
|
+
totalSlippageCost: 0n,
|
|
336
393
|
},
|
|
337
394
|
};
|
|
338
395
|
}
|
|
@@ -342,6 +399,7 @@ export function planDeleverage(params: PlanDeleverageParams): DeleveragePlan {
|
|
|
342
399
|
let remainingDebt = currentDebt;
|
|
343
400
|
let totalSold = 0n;
|
|
344
401
|
let totalRepaid = 0n;
|
|
402
|
+
let excessCollateral = 0n; // sell proceeds not used for repayment (returned to user)
|
|
345
403
|
|
|
346
404
|
for (let i = 0; i < maxIterations; i++) {
|
|
347
405
|
if (remainingDebt <= 0n) break;
|
|
@@ -364,7 +422,7 @@ export function planDeleverage(params: PlanDeleverageParams): DeleveragePlan {
|
|
|
364
422
|
withdrawable < tokensNeededForTarget ? withdrawable : tokensNeededForTarget;
|
|
365
423
|
if (tokensToWithdraw <= 0n) break;
|
|
366
424
|
|
|
367
|
-
const collateralProceeds = collateralForTokens(tokensToWithdraw,
|
|
425
|
+
const collateralProceeds = collateralForTokens(tokensToWithdraw, effectiveSellPrice);
|
|
368
426
|
if (collateralProceeds < minStepSell) break;
|
|
369
427
|
|
|
370
428
|
// withdraw
|
|
@@ -385,11 +443,32 @@ export function planDeleverage(params: PlanDeleverageParams): DeleveragePlan {
|
|
|
385
443
|
steps.push({ kind: "repay", collateralAmount: repayAmount, iteration: i });
|
|
386
444
|
remainingDebt -= repayAmount;
|
|
387
445
|
totalRepaid += repayAmount;
|
|
446
|
+
excessCollateral += collateralProceeds - repayAmount;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Phase 2: After all debt is repaid, withdraw and sell remaining tokens.
|
|
450
|
+
// This ensures "full" close returns all collateral to the user, not just repays debt.
|
|
451
|
+
// Only fires when debt is fully repaid — if debt remains (underwater/stuck), skip.
|
|
452
|
+
if (targetDebtReduction === "full" && remainingDebt <= 0n && remainingTokens > 0n) {
|
|
453
|
+
const collateralProceeds = collateralForTokens(remainingTokens, tokenPriceE8);
|
|
454
|
+
const iteration = steps.length > 0 ? steps[steps.length - 1]!.iteration + 1 : 0;
|
|
455
|
+
|
|
456
|
+
steps.push({ kind: "withdraw", amount: remainingTokens, iteration });
|
|
457
|
+
steps.push({
|
|
458
|
+
kind: "sell",
|
|
459
|
+
tokenAmount: remainingTokens,
|
|
460
|
+
expectedCollateral: collateralProceeds,
|
|
461
|
+
iteration,
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
excessCollateral += collateralProceeds;
|
|
465
|
+
totalSold += remainingTokens;
|
|
466
|
+
remainingTokens = 0n;
|
|
388
467
|
}
|
|
389
468
|
|
|
390
|
-
const collateralRemaining =
|
|
391
|
-
|
|
392
|
-
|
|
469
|
+
const collateralRemaining =
|
|
470
|
+
excessCollateral +
|
|
471
|
+
clampPositive(collateralForTokens(remainingTokens, tokenPriceE8) - remainingDebt);
|
|
393
472
|
const iterations = steps.length > 0 ? steps[steps.length - 1]!.iteration + 1 : 0;
|
|
394
473
|
|
|
395
474
|
return {
|
|
@@ -400,6 +479,14 @@ export function planDeleverage(params: PlanDeleverageParams): DeleveragePlan {
|
|
|
400
479
|
tokensRemaining: remainingTokens,
|
|
401
480
|
collateralRemaining,
|
|
402
481
|
iterations,
|
|
482
|
+
assumedSlippageBps: slippageBps,
|
|
483
|
+
totalSlippageCost:
|
|
484
|
+
slippageBps > 0n
|
|
485
|
+
? clampPositive(
|
|
486
|
+
collateralForTokens(totalSold, tokenPriceE8) -
|
|
487
|
+
collateralForTokens(totalSold, effectiveSellPrice),
|
|
488
|
+
)
|
|
489
|
+
: 0n,
|
|
403
490
|
},
|
|
404
491
|
};
|
|
405
492
|
}
|
package/src/leverage/types.ts
CHANGED
|
@@ -109,6 +109,10 @@ export type LeverageSummary = {
|
|
|
109
109
|
iterations: number;
|
|
110
110
|
/** Maximum theoretical leverage = 1 / (1 - LTV) as WAD. */
|
|
111
111
|
maxLeverageWad: bigint;
|
|
112
|
+
/** Assumed slippage/spread used in planning (bps). 0 if not specified. */
|
|
113
|
+
assumedSlippageBps: bigint;
|
|
114
|
+
/** Total collateral lost to slippage across all buy steps (base units). */
|
|
115
|
+
totalSlippageCost: bigint;
|
|
112
116
|
};
|
|
113
117
|
|
|
114
118
|
/**
|
|
@@ -164,6 +168,10 @@ export type DeleveragePlan = {
|
|
|
164
168
|
tokensRemaining: bigint;
|
|
165
169
|
collateralRemaining: bigint;
|
|
166
170
|
iterations: number;
|
|
171
|
+
/** Assumed slippage/spread used in planning (bps). 0 if not specified. */
|
|
172
|
+
assumedSlippageBps: bigint;
|
|
173
|
+
/** Total collateral lost to slippage across all sell steps (base units). */
|
|
174
|
+
totalSlippageCost: bigint;
|
|
167
175
|
};
|
|
168
176
|
};
|
|
169
177
|
|
|
@@ -202,3 +210,34 @@ export type OnLeverageProgress = (info: {
|
|
|
202
210
|
step: LeverageStep;
|
|
203
211
|
result: LeverageStepResult;
|
|
204
212
|
}) => void;
|
|
213
|
+
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
// Slippage error
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Thrown by executors when actual fill deviates beyond `maxSlippageBps`.
|
|
220
|
+
*/
|
|
221
|
+
export class SlippageExceededError extends Error {
|
|
222
|
+
readonly expected: bigint;
|
|
223
|
+
readonly actual: bigint;
|
|
224
|
+
readonly maxSlippageBps: bigint;
|
|
225
|
+
readonly side: "buy" | "sell";
|
|
226
|
+
|
|
227
|
+
constructor(params: {
|
|
228
|
+
expected: bigint;
|
|
229
|
+
actual: bigint;
|
|
230
|
+
maxSlippageBps: bigint;
|
|
231
|
+
side: "buy" | "sell";
|
|
232
|
+
}) {
|
|
233
|
+
const pct = (Number(params.maxSlippageBps) / 100).toFixed(2);
|
|
234
|
+
super(
|
|
235
|
+
`Slippage exceeded on ${params.side}: expected ${params.expected}, got ${params.actual} (max ${pct}%)`,
|
|
236
|
+
);
|
|
237
|
+
this.name = "SlippageExceededError";
|
|
238
|
+
this.expected = params.expected;
|
|
239
|
+
this.actual = params.actual;
|
|
240
|
+
this.maxSlippageBps = params.maxSlippageBps;
|
|
241
|
+
this.side = params.side;
|
|
242
|
+
}
|
|
243
|
+
}
|