@varla/sdk 2.14.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.
Files changed (40) hide show
  1. package/AGENTS.md +5 -5
  2. package/CHANGELOG.md +17 -0
  3. package/dist/abi/full/OracleUpdaterRouter.d.ts +35 -1
  4. package/dist/abi/full/OracleUpdaterRouter.d.ts.map +1 -1
  5. package/dist/abi/full/OracleUpdaterRouter.js +46 -1
  6. package/dist/abi/full/OracleUpdaterRouter.js.map +1 -1
  7. package/dist/actions/oracleUpdaterRouter.d.ts +24 -0
  8. package/dist/actions/oracleUpdaterRouter.d.ts.map +1 -1
  9. package/dist/actions/oracleUpdaterRouter.js +38 -0
  10. package/dist/actions/oracleUpdaterRouter.js.map +1 -1
  11. package/dist/generated.d.ts +35 -1
  12. package/dist/generated.d.ts.map +1 -1
  13. package/dist/leverage/deleverageExecute.d.ts +6 -0
  14. package/dist/leverage/deleverageExecute.d.ts.map +1 -1
  15. package/dist/leverage/deleverageExecute.js +14 -1
  16. package/dist/leverage/deleverageExecute.js.map +1 -1
  17. package/dist/leverage/execute.d.ts +6 -0
  18. package/dist/leverage/execute.d.ts.map +1 -1
  19. package/dist/leverage/execute.js +14 -1
  20. package/dist/leverage/execute.js.map +1 -1
  21. package/dist/leverage/index.d.ts +1 -1
  22. package/dist/leverage/index.d.ts.map +1 -1
  23. package/dist/leverage/index.js +1 -1
  24. package/dist/leverage/index.js.map +1 -1
  25. package/dist/leverage/math.d.ts +12 -0
  26. package/dist/leverage/math.d.ts.map +1 -1
  27. package/dist/leverage/math.js +66 -5
  28. package/dist/leverage/math.js.map +1 -1
  29. package/dist/leverage/types.d.ts +23 -0
  30. package/dist/leverage/types.d.ts.map +1 -1
  31. package/dist/leverage/types.js +21 -0
  32. package/dist/leverage/types.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/abi/full/OracleUpdaterRouter.ts +46 -1
  35. package/src/actions/oracleUpdaterRouter.ts +51 -0
  36. package/src/leverage/deleverageExecute.ts +22 -0
  37. package/src/leverage/execute.ts +22 -0
  38. package/src/leverage/index.ts +1 -0
  39. package/src/leverage/math.ts +92 -5
  40. package/src/leverage/types.ts +39 -0
@@ -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"}
@@ -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"}
@@ -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;AAgCpB;;;;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;CACvB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,YAAY,CAwI7E;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;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CA+F3E;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"}
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"}
@@ -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
- const tokensBought = tokensForCollateral(spendCollateral, tokenPriceE8);
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, tokenPriceE8);
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 = clampPositive(collateralForTokens(remainingTokens, tokenPriceE8) - remainingDebt);
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":"AAAA,oEAAoE;AAgBpE,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEhG,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,iBAAiB;AACjB,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC7C,IAAI,CAAC,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5D,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,uBAAuB;AACvB,MAAM,QAAQ,GAAG,MAAO,CAAC;AAEzB;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,KAAa,EAAE,WAAmB;IACjE,OAAO,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACtF,CAAC;AACD,SAAS,wBAAwB,CAAC,KAAa,EAAE,WAAmB;IAClE,OAAO,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACpF,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,CAAC,cAAc;IAC5C,IAAI,MAAM,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,SAAiB,EACjB,MAAc;IAEd,IAAI,WAAW,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,SAAS,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,MAAM,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,GAAG,CAAC;IAC7C,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;IACzC,IAAI,WAAW,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAClC,sEAAsE;IACtE,OAAO,CAAC,SAAS,GAAG,WAAW,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,gBAAwB,EAAE,YAAoB;IAChF,IAAI,YAAY,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,YAAoB;IAC3E,OAAO,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAuCD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA8B;IAC7D,MAAM,EACJ,cAAc,EACd,YAAY,EACZ,MAAM,EACN,iBAAiB,EACjB,aAAa,GAAG,sBAAsB,EACtC,aAAa,GAAG,2BAA2B,EAC3C,cAAc,GAAG,EAAE,EACnB,YAAY,GAAG,EAAE,EACjB,YAAY,EACZ,WAAW,GAAG,EAAE,GACjB,GAAG,MAAM,CAAC;IAEX,IAAI,cAAc,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACxE,IAAI,YAAY,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAClF,IAAI,aAAa,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACrE,IAAI,cAAc,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACxE,IAAI,YAAY,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACpE,IAAI,WAAW,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAClE,IAAI,WAAW,IAAI,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAE7E,6BAA6B;IAC7B,8EAA8E;IAC9E,wCAAwC;IACxC,gCAAgC;IAChC,MAAM,kBAAkB,GACtB,iBAAiB,KAAK,SAAS;QAC7B,CAAC,CAAC,iBAAiB,IAAI,GAAG;YACxB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,iBAAiB,GAAG,MAAM;gBAC1B,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,iBAAiB;QACvB,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,IAAI,WAAW,GAAG,cAAc,CAAC;IACjC,IAAI,SAAS,GAAG,YAAY,CAAC;IAC7B,IAAI,mBAAmB,GAAG,cAAc,CAAC;IAEzC,uDAAuD;IACvD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,aAAa,CAAC,gBAAgB,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC;IAEnF,2EAA2E;IAC3E,MAAM,eAAe,GACnB,kBAAkB,KAAK,SAAS;QAC9B,CAAC,CAAC,kBAAkB,GAAG,GAAG;YACxB,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,GAAG,GAAG,EAAE,GAAG,CAAC;YACnD,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,SAAS,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,mBAAmB,IAAI,EAAE;YAAE,MAAM;QAErC,MAAM;QACN,MAAM,eAAe,GAAG,mBAAmB,CAAC;QAE5C,+FAA+F;QAC/F,MAAM,YAAY,GAAG,mBAAmB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAC7E,IAAI,YAAY,IAAI,EAAE;YAAE,MAAM;QAE9B,qDAAqD;QACrD,iEAAiE;QACjE,mBAAmB,GAAG,EAAE,CAAC;QAEzB,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,KAAK;YACX,gBAAgB,EAAE,eAAe;YACjC,cAAc,EAAE,YAAY;YAC5B,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,WAAW,IAAI,YAAY,CAAC;QAE5B,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAEpE,0EAA0E;QAC1E,IAAI,CAAC,KAAK,aAAa,GAAG,CAAC;YAAE,MAAM;QAEnC,SAAS;QACT,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;QACrF,IAAI,mBAAmB,IAAI,EAAE;YAAE,MAAM;QAErC,IAAI,YAAY,GAAG,mBAAmB,CAAC;QAEvC,iBAAiB;QACjB,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,aAAa,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;YAC7D,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;QACrE,CAAC;QAED,8DAA8D;QAC9D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;YAC1D,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;QACrE,CAAC;QAED,IAAI,YAAY,IAAI,EAAE;YAAE,MAAM;QAC9B,IAAI,YAAY,GAAG,aAAa;YAAE,MAAM;QAExC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7E,SAAS,IAAI,YAAY,CAAC;QAC1B,mBAAmB,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,mBAAmB;IACnB,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IAC3D,MAAM,oBAAoB,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,MAAM,2BAA2B,GAAG,wBAAwB,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAE7F,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAoB;QAC/B,WAAW;QACX,SAAS;QACT,SAAS;QACT,oBAAoB;QACpB,2BAA2B;QAC3B,UAAU;QACV,cAAc,EAAE,MAAM;QACtB,kBAAkB,EAAE,WAAW;QAC/B,iBAAiB,EACf,WAAW,GAAG,EAAE;YACd,CAAC,CAAC,aAAa;YACX,qDAAqD;YACrD,mBAAmB,CACjB,KAAK;iBACF,MAAM,CAAC,CAAC,CAAC,EAA+C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;iBAC5E,MAAM,CACL,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,EAAE,YAAY,CAAC,EACvE,EAAE,CACH;gBACD,WAAW;gBACX,cAAc,EAChB,YAAY,CACb,CACF;YACH,CAAC,CAAC,EAAE;KACT,CAAC;IAEF,OAAO;QACL,KAAK;QACL,OAAO;QACP,MAAM,EAAE;YACN,cAAc;YACd,YAAY;YACZ,MAAM;YACN,iBAAiB;YACjB,aAAa;YACb,aAAa;SACd;KACF,CAAC;AACJ,CAAC;AAgCD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAA4B;IACzD,MAAM,EACJ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,MAAM,EACN,mBAAmB,EACnB,aAAa,GAAG,sBAAsB,EACtC,WAAW,GAAG,2BAA2B,EACzC,WAAW,GAAG,EAAE,GACjB,GAAG,MAAM,CAAC;IAEX,IAAI,YAAY,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAClF,IAAI,eAAe,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1E,IAAI,WAAW,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAClE,IAAI,WAAW,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAClE,IAAI,WAAW,IAAI,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE7E,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAE/E,MAAM,WAAW,GAAG,mBAAmB,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACvF,IAAI,WAAW,IAAI,EAAE,EAAE,CAAC;QACtB,OAAO;YACL,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACP,YAAY,EAAE,EAAE;gBAChB,cAAc,EAAE,EAAE;gBAClB,eAAe,EAAE,eAAe;gBAChC,mBAAmB,EAAE,EAAE;gBACvB,UAAU,EAAE,CAAC;gBACb,kBAAkB,EAAE,WAAW;gBAC/B,iBAAiB,EAAE,EAAE;aACtB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,eAAe,GAAG,eAAe,CAAC;IACtC,IAAI,aAAa,GAAG,WAAW,CAAC;IAChC,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,gBAAgB,GAAG,EAAE,CAAC,CAAC,0DAA0D;IAErF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,aAAa,IAAI,EAAE;YAAE,MAAM;QAC/B,IAAI,WAAW,IAAI,WAAW;YAAE,MAAM;QACtC,IAAI,eAAe,IAAI,EAAE;YAAE,MAAM;QAEjC,+CAA+C;QAC/C,0CAA0C;QAC1C,0DAA0D;QAC1D,MAAM,kBAAkB,GACtB,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,GAAG,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3F,MAAM,YAAY,GAAG,aAAa,CAAC,eAAe,GAAG,kBAAkB,CAAC,CAAC;QACzE,IAAI,YAAY,IAAI,EAAE;YAAE,MAAM;QAE9B,qCAAqC;QACrC,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC;QACjE,MAAM,qBAAqB,GAAG,QAAQ,CAAC,eAAe,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChF,MAAM,gBAAgB,GACpB,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC;QAC9E,IAAI,gBAAgB,IAAI,EAAE;YAAE,MAAM;QAElC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACrF,IAAI,kBAAkB,GAAG,WAAW;YAAE,MAAM;QAE5C,WAAW;QACX,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,eAAe,IAAI,gBAAgB,CAAC;QAEpC,OAAO;QACP,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,gBAAgB;YAC7B,kBAAkB,EAAE,kBAAkB;YACtC,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,SAAS,IAAI,gBAAgB,CAAC;QAE9B,QAAQ;QACR,MAAM,WAAW,GAAG,kBAAkB,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3E,aAAa,IAAI,WAAW,CAAC;QAC7B,WAAW,IAAI,WAAW,CAAC;QAC3B,gBAAgB,IAAI,kBAAkB,GAAG,WAAW,CAAC;IACvD,CAAC;IAED,yEAAyE;IACzE,sFAAsF;IACtF,mFAAmF;IACnF,IAAI,mBAAmB,KAAK,MAAM,IAAI,aAAa,IAAI,EAAE,IAAI,eAAe,GAAG,EAAE,EAAE,CAAC;QAClF,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,eAAe;YAC5B,kBAAkB,EAAE,kBAAkB;YACtC,SAAS;SACV,CAAC,CAAC;QAEH,gBAAgB,IAAI,kBAAkB,CAAC;QACvC,SAAS,IAAI,eAAe,CAAC;QAC7B,eAAe,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,mBAAmB,GACvB,gBAAgB;QAChB,aAAa,CAAC,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC,GAAG,aAAa,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjF,OAAO;QACL,KAAK;QACL,OAAO,EAAE;YACP,YAAY,EAAE,SAAS;YACvB,cAAc,EAAE,WAAW;YAC3B,eAAe,EAAE,eAAe;YAChC,mBAAmB;YACnB,UAAU;YACV,kBAAkB,EAAE,WAAW;YAC/B,iBAAiB,EACf,WAAW,GAAG,EAAE;gBACd,CAAC,CAAC,aAAa,CACX,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC;oBAC1C,mBAAmB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CACrD;gBACH,CAAC,CAAC,EAAE;SACT;KACF,CAAC;AACJ,CAAC;AAmBD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAMhC;IACC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE/E,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,CAAC;IAEpD,MAAM,SAAS,GAAG,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,qCAAqC;IACrC,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,SAAS,GAAG,EAAE,IAAI,eAAe,GAAG,SAAS,CAAC;IAEnE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACnE,CAAC"}
@@ -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;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,gCAAgC;IAChC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,0BAA0B;IAC1B,OAAO,EAAE,eAAe,CAAC;IACzB,mDAAmD;IACnD,MAAM,EAAE;QACN,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;QACtC,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH,CAAC;AAMF,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEN,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC;AAMF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,KAAK,IAAI,CAAC"}
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;IACvB,0EAA0E;IAC1E,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,gCAAgC;IAChC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,0BAA0B;IAC1B,OAAO,EAAE,eAAe,CAAC;IACzB,mDAAmD;IACnD,MAAM,EAAE;QACN,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;QACtC,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH,CAAC;AAMF,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEN,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC;QACnB,0EAA0E;QAC1E,kBAAkB,EAAE,MAAM,CAAC;QAC3B,4EAA4E;QAC5E,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC;AAMF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,KAAK,IAAI,CAAC;AAMX;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;gBAElB,MAAM,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;KACtB;CAWF"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@varla/sdk",
3
- "version": "2.14.0",
3
+ "version": "2.15.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -319,6 +319,51 @@ export const ORACLEUPDATERROUTER_ABI = [
319
319
  "stateMutability": "view",
320
320
  "type": "function"
321
321
  },
322
+ {
323
+ "inputs": [
324
+ {
325
+ "internalType": "uint256",
326
+ "name": "index",
327
+ "type": "uint256"
328
+ }
329
+ ],
330
+ "name": "getPublisherAt",
331
+ "outputs": [
332
+ {
333
+ "internalType": "address",
334
+ "name": "",
335
+ "type": "address"
336
+ }
337
+ ],
338
+ "stateMutability": "view",
339
+ "type": "function"
340
+ },
341
+ {
342
+ "inputs": [],
343
+ "name": "getPublisherCount",
344
+ "outputs": [
345
+ {
346
+ "internalType": "uint256",
347
+ "name": "",
348
+ "type": "uint256"
349
+ }
350
+ ],
351
+ "stateMutability": "view",
352
+ "type": "function"
353
+ },
354
+ {
355
+ "inputs": [],
356
+ "name": "getPublishers",
357
+ "outputs": [
358
+ {
359
+ "internalType": "address[]",
360
+ "name": "",
361
+ "type": "address[]"
362
+ }
363
+ ],
364
+ "stateMutability": "view",
365
+ "type": "function"
366
+ },
322
367
  {
323
368
  "inputs": [
324
369
  {
@@ -402,7 +447,7 @@ export const ORACLEUPDATERROUTER_ABI = [
402
447
  "inputs": [
403
448
  {
404
449
  "internalType": "address",
405
- "name": "",
450
+ "name": "publisher",
406
451
  "type": "address"
407
452
  }
408
453
  ],
@@ -267,6 +267,57 @@ export async function readIsPublisher(params: {
267
267
  return result as boolean;
268
268
  }
269
269
 
270
+ /**
271
+ * Return all current publishers on the OracleUpdaterRouter.
272
+ *
273
+ * Reads from the on-chain EnumerableSet — no event scanning required.
274
+ */
275
+ export async function readOracleUpdaterRouterPublishers(params: {
276
+ publicClient: Pick<PublicClient, "readContract">;
277
+ routerAddress: Address;
278
+ }): Promise<readonly Address[]> {
279
+ const result = await params.publicClient.readContract({
280
+ address: params.routerAddress,
281
+ abi: abis.ORACLEUPDATERROUTER_ABI,
282
+ functionName: "getPublishers",
283
+ args: [],
284
+ });
285
+ return result as readonly Address[];
286
+ }
287
+
288
+ /**
289
+ * Return the number of current publishers on the OracleUpdaterRouter.
290
+ */
291
+ export async function readOracleUpdaterRouterPublisherCount(params: {
292
+ publicClient: Pick<PublicClient, "readContract">;
293
+ routerAddress: Address;
294
+ }): Promise<bigint> {
295
+ const result = await params.publicClient.readContract({
296
+ address: params.routerAddress,
297
+ abi: abis.ORACLEUPDATERROUTER_ABI,
298
+ functionName: "getPublisherCount",
299
+ args: [],
300
+ });
301
+ return BigInt(result as bigint);
302
+ }
303
+
304
+ /**
305
+ * Return the publisher at the given index on the OracleUpdaterRouter.
306
+ */
307
+ export async function readOracleUpdaterRouterPublisherAt(params: {
308
+ publicClient: Pick<PublicClient, "readContract">;
309
+ routerAddress: Address;
310
+ index: bigint;
311
+ }): Promise<Address> {
312
+ const result = await params.publicClient.readContract({
313
+ address: params.routerAddress,
314
+ abi: abis.ORACLEUPDATERROUTER_ABI,
315
+ functionName: "getPublisherAt",
316
+ args: [params.index],
317
+ });
318
+ return result as Address;
319
+ }
320
+
270
321
  /** Change the AccessManager authority for OracleUpdaterRouter. */
271
322
  export async function prepareOracleUpdaterRouterSetAuthority(params: {
272
323
  publicClient: { simulateContract: (args: any) => Promise<any> };
@@ -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;
@@ -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 };
@@ -84,5 +84,6 @@ export {
84
84
  DEFAULT_MIN_STEP_COLLATERAL,
85
85
  PRICE_E8,
86
86
  pow10,
87
+ SlippageExceededError,
87
88
  WAD,
88
89
  } from "./types.js";