defi-dash-sdk 0.1.3 → 0.1.4

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 (181) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +199 -97
  3. package/dist/__tests__/deleverageEstimate.unit.test.d.ts +10 -0
  4. package/dist/__tests__/deleverageEstimate.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/deleverageEstimate.unit.test.js +116 -0
  6. package/dist/__tests__/deleverageEstimate.unit.test.js.map +1 -0
  7. package/dist/__tests__/findBestLeverageRoute.test.d.ts +12 -0
  8. package/dist/__tests__/findBestLeverageRoute.test.d.ts.map +1 -0
  9. package/dist/__tests__/findBestLeverageRoute.test.js +177 -0
  10. package/dist/__tests__/findBestLeverageRoute.test.js.map +1 -0
  11. package/dist/__tests__/getAssetApy.test.d.ts +2 -0
  12. package/dist/__tests__/getAssetApy.test.d.ts.map +1 -0
  13. package/dist/__tests__/getAssetApy.test.js +133 -0
  14. package/dist/__tests__/getAssetApy.test.js.map +1 -0
  15. package/dist/__tests__/getAssetRiskParams.test.d.ts +11 -0
  16. package/dist/__tests__/getAssetRiskParams.test.d.ts.map +1 -0
  17. package/dist/__tests__/getAssetRiskParams.test.js +183 -0
  18. package/dist/__tests__/getAssetRiskParams.test.js.map +1 -0
  19. package/dist/__tests__/internal.getAssetApy.test.d.ts +2 -0
  20. package/dist/__tests__/internal.getAssetApy.test.d.ts.map +1 -0
  21. package/dist/__tests__/internal.getAssetApy.test.js +140 -0
  22. package/dist/__tests__/internal.getAssetApy.test.js.map +1 -0
  23. package/dist/__tests__/internal.getAssetRiskParams.test.d.ts +22 -0
  24. package/dist/__tests__/internal.getAssetRiskParams.test.d.ts.map +1 -0
  25. package/dist/__tests__/internal.getAssetRiskParams.test.js +194 -0
  26. package/dist/__tests__/internal.getAssetRiskParams.test.js.map +1 -0
  27. package/dist/__tests__/internal.getPosition.test.d.ts +22 -0
  28. package/dist/__tests__/internal.getPosition.test.d.ts.map +1 -0
  29. package/dist/__tests__/internal.getPosition.test.js +153 -0
  30. package/dist/__tests__/internal.getPosition.test.js.map +1 -0
  31. package/dist/__tests__/leveragePreview.unit.test.d.ts +10 -0
  32. package/dist/__tests__/leveragePreview.unit.test.d.ts.map +1 -0
  33. package/dist/__tests__/leveragePreview.unit.test.js +168 -0
  34. package/dist/__tests__/leveragePreview.unit.test.js.map +1 -0
  35. package/dist/__tests__/leverageRoute.unit.test.d.ts +10 -0
  36. package/dist/__tests__/leverageRoute.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/leverageRoute.unit.test.js +159 -0
  38. package/dist/__tests__/leverageRoute.unit.test.js.map +1 -0
  39. package/dist/__tests__/previewLeverage.test.d.ts +13 -0
  40. package/dist/__tests__/previewLeverage.test.d.ts.map +1 -0
  41. package/dist/__tests__/previewLeverage.test.js +217 -0
  42. package/dist/__tests__/previewLeverage.test.js.map +1 -0
  43. package/dist/__tests__/sdk.bestRoute.test.d.ts +22 -0
  44. package/dist/__tests__/sdk.bestRoute.test.d.ts.map +1 -0
  45. package/dist/__tests__/sdk.bestRoute.test.js +186 -0
  46. package/dist/__tests__/sdk.bestRoute.test.js.map +1 -0
  47. package/dist/__tests__/sdk.bestRoute.unit.test.d.ts +16 -0
  48. package/dist/__tests__/sdk.bestRoute.unit.test.d.ts.map +1 -0
  49. package/dist/__tests__/sdk.bestRoute.unit.test.js +165 -0
  50. package/dist/__tests__/sdk.bestRoute.unit.test.js.map +1 -0
  51. package/dist/__tests__/sdk.deleverage.test.d.ts +21 -0
  52. package/dist/__tests__/sdk.deleverage.test.d.ts.map +1 -0
  53. package/dist/__tests__/sdk.deleverage.test.js +130 -0
  54. package/dist/__tests__/sdk.deleverage.test.js.map +1 -0
  55. package/dist/__tests__/sdk.deleverage.unit.test.d.ts +21 -0
  56. package/dist/__tests__/sdk.deleverage.unit.test.d.ts.map +1 -0
  57. package/dist/__tests__/sdk.deleverage.unit.test.js +141 -0
  58. package/dist/__tests__/sdk.deleverage.unit.test.js.map +1 -0
  59. package/dist/__tests__/sdk.leverage.test.d.ts +19 -0
  60. package/dist/__tests__/sdk.leverage.test.d.ts.map +1 -0
  61. package/dist/__tests__/sdk.leverage.test.js +188 -0
  62. package/dist/__tests__/sdk.leverage.test.js.map +1 -0
  63. package/dist/__tests__/sdk.portfolio.test.d.ts +17 -0
  64. package/dist/__tests__/sdk.portfolio.test.d.ts.map +1 -0
  65. package/dist/__tests__/sdk.portfolio.test.js +162 -0
  66. package/dist/__tests__/sdk.portfolio.test.js.map +1 -0
  67. package/dist/__tests__/sdk.position.test.d.ts +16 -0
  68. package/dist/__tests__/sdk.position.test.d.ts.map +1 -0
  69. package/dist/__tests__/sdk.position.test.js +193 -0
  70. package/dist/__tests__/sdk.position.test.js.map +1 -0
  71. package/dist/__tests__/sdk.preview.test.d.ts +23 -0
  72. package/dist/__tests__/sdk.preview.test.d.ts.map +1 -0
  73. package/dist/__tests__/sdk.preview.test.js +226 -0
  74. package/dist/__tests__/sdk.preview.test.js.map +1 -0
  75. package/dist/__tests__/sdk.preview.unit.test.d.ts +18 -0
  76. package/dist/__tests__/sdk.preview.unit.test.d.ts.map +1 -0
  77. package/dist/__tests__/sdk.preview.unit.test.js +175 -0
  78. package/dist/__tests__/sdk.preview.unit.test.js.map +1 -0
  79. package/dist/__tests__/utils.normalizeCoinType.test.d.ts +7 -0
  80. package/dist/__tests__/utils.normalizeCoinType.test.d.ts.map +1 -0
  81. package/dist/__tests__/utils.normalizeCoinType.test.js +42 -0
  82. package/dist/__tests__/utils.normalizeCoinType.test.js.map +1 -0
  83. package/dist/index.d.ts +19 -11
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +24 -40
  86. package/dist/index.js.map +1 -1
  87. package/dist/protocols/base-adapter.d.ts +42 -75
  88. package/dist/protocols/base-adapter.d.ts.map +1 -1
  89. package/dist/protocols/base-adapter.js +34 -77
  90. package/dist/protocols/base-adapter.js.map +1 -1
  91. package/dist/protocols/navi/adapter.d.ts +22 -2
  92. package/dist/protocols/navi/adapter.d.ts.map +1 -1
  93. package/dist/protocols/navi/adapter.js +145 -11
  94. package/dist/protocols/navi/adapter.js.map +1 -1
  95. package/dist/protocols/scallop/adapter.d.ts +26 -6
  96. package/dist/protocols/scallop/adapter.d.ts.map +1 -1
  97. package/dist/protocols/scallop/adapter.js +206 -43
  98. package/dist/protocols/scallop/adapter.js.map +1 -1
  99. package/dist/protocols/scallop/flash-loan.d.ts +18 -3
  100. package/dist/protocols/scallop/flash-loan.d.ts.map +1 -1
  101. package/dist/protocols/scallop/flash-loan.js +79 -20
  102. package/dist/protocols/scallop/flash-loan.js.map +1 -1
  103. package/dist/protocols/scallop/types.d.ts.map +1 -1
  104. package/dist/protocols/scallop/types.js +4 -1
  105. package/dist/protocols/scallop/types.js.map +1 -1
  106. package/dist/protocols/suilend/adapter.d.ts +19 -1
  107. package/dist/protocols/suilend/adapter.d.ts.map +1 -1
  108. package/dist/protocols/suilend/adapter.js +196 -51
  109. package/dist/protocols/suilend/adapter.js.map +1 -1
  110. package/dist/sdk.d.ts +107 -148
  111. package/dist/sdk.d.ts.map +1 -1
  112. package/dist/sdk.js +171 -523
  113. package/dist/sdk.js.map +1 -1
  114. package/dist/strategies/common.d.ts +42 -0
  115. package/dist/strategies/common.d.ts.map +1 -0
  116. package/dist/strategies/common.js +81 -0
  117. package/dist/strategies/common.js.map +1 -0
  118. package/dist/strategies/deleverage.d.ts.map +1 -1
  119. package/dist/strategies/deleverage.js +44 -62
  120. package/dist/strategies/deleverage.js.map +1 -1
  121. package/dist/strategies/index.d.ts +9 -1
  122. package/dist/strategies/index.d.ts.map +1 -1
  123. package/dist/strategies/index.js +11 -2
  124. package/dist/strategies/index.js.map +1 -1
  125. package/dist/strategies/leverage-preview.d.ts +27 -0
  126. package/dist/strategies/leverage-preview.d.ts.map +1 -0
  127. package/dist/strategies/leverage-preview.js +120 -0
  128. package/dist/strategies/leverage-preview.js.map +1 -0
  129. package/dist/strategies/leverage-route.d.ts +29 -0
  130. package/dist/strategies/leverage-route.d.ts.map +1 -0
  131. package/dist/strategies/leverage-route.js +112 -0
  132. package/dist/strategies/leverage-route.js.map +1 -0
  133. package/dist/strategies/leverage.d.ts +4 -44
  134. package/dist/strategies/leverage.d.ts.map +1 -1
  135. package/dist/strategies/leverage.js +43 -112
  136. package/dist/strategies/leverage.js.map +1 -1
  137. package/dist/strategies/scallop-leverage.d.ts +34 -0
  138. package/dist/strategies/scallop-leverage.d.ts.map +1 -0
  139. package/dist/strategies/scallop-leverage.js +143 -0
  140. package/dist/strategies/scallop-leverage.js.map +1 -0
  141. package/dist/types/config.d.ts +0 -7
  142. package/dist/types/config.d.ts.map +1 -1
  143. package/dist/types/constants.d.ts +8 -0
  144. package/dist/types/constants.d.ts.map +1 -1
  145. package/dist/types/constants.js +9 -1
  146. package/dist/types/constants.js.map +1 -1
  147. package/dist/types/index.d.ts +3 -3
  148. package/dist/types/index.d.ts.map +1 -1
  149. package/dist/types/index.js +2 -1
  150. package/dist/types/index.js.map +1 -1
  151. package/dist/types/position.d.ts +7 -3
  152. package/dist/types/position.d.ts.map +1 -1
  153. package/dist/types/protocol.d.ts +101 -0
  154. package/dist/types/protocol.d.ts.map +1 -1
  155. package/dist/types/strategy.d.ts +82 -38
  156. package/dist/types/strategy.d.ts.map +1 -1
  157. package/dist/utils/calculations.d.ts +10 -137
  158. package/dist/utils/calculations.d.ts.map +1 -1
  159. package/dist/utils/calculations.js +11 -162
  160. package/dist/utils/calculations.js.map +1 -1
  161. package/dist/utils/coin.d.ts +16 -7
  162. package/dist/utils/coin.d.ts.map +1 -1
  163. package/dist/utils/coin.js +32 -25
  164. package/dist/utils/coin.js.map +1 -1
  165. package/dist/utils/errors.d.ts +0 -18
  166. package/dist/utils/errors.d.ts.map +1 -1
  167. package/dist/utils/errors.js +2 -40
  168. package/dist/utils/errors.js.map +1 -1
  169. package/dist/utils/execution.d.ts +38 -0
  170. package/dist/utils/execution.d.ts.map +1 -0
  171. package/dist/utils/execution.js +110 -0
  172. package/dist/utils/execution.js.map +1 -0
  173. package/dist/utils/gas.d.ts +0 -37
  174. package/dist/utils/gas.d.ts.map +1 -1
  175. package/dist/utils/gas.js +2 -60
  176. package/dist/utils/gas.js.map +1 -1
  177. package/dist/utils/index.d.ts +1 -1
  178. package/dist/utils/index.d.ts.map +1 -1
  179. package/dist/utils/index.js +1 -1
  180. package/dist/utils/index.js.map +1 -1
  181. package/package.json +15 -45
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Internal: protocol.getAssetApy() [Integration]
5
+ *
6
+ * Tests each protocol adapter's APY data against live mainnet.
7
+ * This is an internal dependency of sdk.previewLeverage().
8
+ *
9
+ * Used by:
10
+ * - sdk.previewLeverage() → supply/borrow APY for net APY calculation
11
+ * - sdk.findBestLeverageRoute() → via previewLeverage
12
+ *
13
+ * NOTE: Live RPC calls to mainnet, may be slow (~10s each).
14
+ * Run: npx vitest run src/__tests__/internal.getAssetApy.test.ts
15
+ *
16
+ * ──────────────────────────────────────────────────────────────────────────────
17
+ * CONSTRAINT 1) Cross-protocol APY sanity check (Suilend USDC reference values)
18
+ * ──────────────────────────────────────────────────────────────────────────────
19
+ * Asset: USDC in Suilend (2026-02-26)
20
+ *
21
+ * Supply side:
22
+ * Interest (base supply APR) : 2.65%
23
+ * Reward (sSUI reward APR) : 0.49%
24
+ * ─────────────────────────────────────
25
+ * Deposit APR (total) : 3.13% ← totalSupplyApy should match this
26
+ *
27
+ * Borrow side:
28
+ * Interest (gross borrow APR): 5.83%
29
+ * Reward (sSUI borrow rebate): 2.00% (reduces net cost)
30
+ * ─────────────────────────────────────
31
+ * Borrow APR (gross) : 3.83% ← borrowApy should match this
32
+ *
33
+ * ──────────────────────────────────────────────────────────────────────────────
34
+ * CONSTRAINT 2) Wrapped BTC assets
35
+ * ──────────────────────────────────────────────────────────────────────────────
36
+ * TODO: Add LBTC and XBTC supply APY checks.
37
+ * These wrapped BTC assets are important for SDK completeness on Sui.
38
+ */
39
+ const vitest_1 = require("vitest");
40
+ const client_1 = require("@mysten/sui/client");
41
+ const adapter_1 = require("../protocols/suilend/adapter");
42
+ const adapter_2 = require("../protocols/navi/adapter");
43
+ const adapter_3 = require("../protocols/scallop/adapter");
44
+ const types_1 = require("../types");
45
+ /** Pretty-print APY results in the Suilend USDC style (see CONSTRAINT 1) */
46
+ function printApy(protocol, asset, apy) {
47
+ const pct = (v) => `${(v * 100).toFixed(3)}%`;
48
+ console.log([
49
+ `\n┌─ [${protocol}] ${asset} APY ─────────────────────────`,
50
+ `│ Supply side:`,
51
+ `│ Interest (base) : ${pct(apy.supplyApy)}`,
52
+ `│ Reward : ${pct(apy.rewardApy)}`,
53
+ `│ ─────────────────────────────────`,
54
+ `│ Total supply : ${pct(apy.totalSupplyApy)}`,
55
+ `│`,
56
+ `│ Borrow side:`,
57
+ `│ Gross borrow APR: ${pct(apy.borrowApy + apy.borrowRewardApy)}`,
58
+ `│ Reward (rebate) : ${pct(apy.borrowRewardApy)}`,
59
+ `│ ─────────────────────────────────`,
60
+ `│ Net borrow APR : ${pct(apy.borrowApy)}`,
61
+ `└─────────────────────────────────────────────────`,
62
+ ].join("\n"));
63
+ }
64
+ (0, vitest_1.describe)("Protocol getAssetApy", () => {
65
+ let suiClient;
66
+ (0, vitest_1.beforeAll)(() => {
67
+ suiClient = new client_1.SuiClient({ url: (0, client_1.getFullnodeUrl)("mainnet") });
68
+ });
69
+ // ── Suilend ─────────────────────────────────────────────────────────────────
70
+ (0, vitest_1.describe)("Suilend", () => {
71
+ let adapter;
72
+ (0, vitest_1.beforeAll)(async () => {
73
+ adapter = new adapter_1.SuilendAdapter();
74
+ await adapter.initialize(suiClient);
75
+ }, 30000);
76
+ (0, vitest_1.it)("should return valid APY for SUI", async () => {
77
+ const apy = await adapter.getAssetApy(types_1.COIN_TYPES.SUI);
78
+ printApy("Suilend", "SUI", apy);
79
+ (0, vitest_1.expect)(apy.supplyApy).toBeGreaterThanOrEqual(0);
80
+ (0, vitest_1.expect)(apy.borrowApy).toBeGreaterThanOrEqual(0);
81
+ (0, vitest_1.expect)(apy.rewardApy).toBeGreaterThanOrEqual(0);
82
+ (0, vitest_1.expect)(apy.totalSupplyApy).toBeCloseTo(apy.supplyApy + apy.rewardApy, 10);
83
+ }, 30000);
84
+ (0, vitest_1.it)("should return valid APY for USDC (CONSTRAINT 1: total supply ≈ 3.13%)", async () => {
85
+ const apy = await adapter.getAssetApy(types_1.COIN_TYPES.USDC);
86
+ printApy("Suilend", "USDC", apy);
87
+ (0, vitest_1.expect)(apy.supplyApy).toBeGreaterThan(0);
88
+ (0, vitest_1.expect)(apy.borrowApy).toBeGreaterThan(0);
89
+ // Deposit APR (total) = Interest + Reward ≥ base APR
90
+ // Reference: ~3.13% (2.65% interest + 0.49% sSUI reward)
91
+ (0, vitest_1.expect)(apy.totalSupplyApy).toBeGreaterThanOrEqual(apy.supplyApy);
92
+ (0, vitest_1.expect)(apy.totalSupplyApy).toBeCloseTo(apy.supplyApy + apy.rewardApy, 10);
93
+ }, 30000);
94
+ });
95
+ // ── Navi ────────────────────────────────────────────────────────────────────
96
+ (0, vitest_1.describe)("Navi", () => {
97
+ let adapter;
98
+ (0, vitest_1.beforeAll)(async () => {
99
+ adapter = new adapter_2.NaviAdapter();
100
+ await adapter.initialize(suiClient);
101
+ }, 30000);
102
+ (0, vitest_1.it)("should return valid APY for SUI", async () => {
103
+ const apy = await adapter.getAssetApy(types_1.COIN_TYPES.SUI);
104
+ printApy("Navi", "SUI", apy);
105
+ (0, vitest_1.expect)(apy.supplyApy).toBeGreaterThan(0);
106
+ (0, vitest_1.expect)(apy.borrowApy).toBeGreaterThan(0);
107
+ (0, vitest_1.expect)(apy.rewardApy).toBeGreaterThanOrEqual(0);
108
+ (0, vitest_1.expect)(apy.totalSupplyApy).toBeCloseTo(apy.supplyApy + apy.rewardApy, 10);
109
+ }, 30000);
110
+ (0, vitest_1.it)("should return valid APY for USDC", async () => {
111
+ const apy = await adapter.getAssetApy(types_1.COIN_TYPES.USDC);
112
+ printApy("Navi", "USDC", apy);
113
+ (0, vitest_1.expect)(apy.supplyApy).toBeGreaterThan(0);
114
+ (0, vitest_1.expect)(apy.borrowApy).toBeGreaterThan(0);
115
+ }, 30000);
116
+ });
117
+ // ── Scallop ─────────────────────────────────────────────────────────────────
118
+ (0, vitest_1.describe)("Scallop", () => {
119
+ let adapter;
120
+ (0, vitest_1.beforeAll)(async () => {
121
+ adapter = new adapter_3.ScallopAdapter();
122
+ await adapter.initialize(suiClient);
123
+ }, 30000);
124
+ (0, vitest_1.it)("should return valid APY for SUI", async () => {
125
+ const apy = await adapter.getAssetApy(types_1.COIN_TYPES.SUI);
126
+ printApy("Scallop", "SUI", apy);
127
+ (0, vitest_1.expect)(apy.supplyApy).toBeGreaterThan(0);
128
+ (0, vitest_1.expect)(apy.borrowApy).toBeGreaterThan(0);
129
+ (0, vitest_1.expect)(apy.rewardApy).toBeGreaterThanOrEqual(0);
130
+ (0, vitest_1.expect)(apy.totalSupplyApy).toBeCloseTo(apy.supplyApy + apy.rewardApy, 10);
131
+ }, 30000);
132
+ (0, vitest_1.it)("should return valid APY for USDC", async () => {
133
+ const apy = await adapter.getAssetApy(types_1.COIN_TYPES.USDC);
134
+ printApy("Scallop", "USDC", apy);
135
+ (0, vitest_1.expect)(apy.supplyApy).toBeGreaterThan(0);
136
+ (0, vitest_1.expect)(apy.borrowApy).toBeGreaterThan(0);
137
+ }, 30000);
138
+ });
139
+ });
140
+ //# sourceMappingURL=internal.getAssetApy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.getAssetApy.test.js","sourceRoot":"","sources":["../../src/__tests__/internal.getAssetApy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Internal: protocol.getAssetRiskParams() [Integration]
3
+ *
4
+ * Tests each protocol adapter's on-chain LTV query for all SUPPORTED_COIN_TYPES.
5
+ * This is an internal dependency of sdk.previewLeverage().
6
+ *
7
+ * Used by:
8
+ * - sdk.previewLeverage() → ltv, liquidationThreshold, maxMultiplier
9
+ * - sdk.findBestLeverageRoute() → maxMultiplier for safe multiplier calc
10
+ *
11
+ * Validated fields:
12
+ * - ltv (0 < ltv < 1)
13
+ * - liquidationThreshold (0 < threshold <= 1)
14
+ * - liquidationBonus (0 < bonus < 1)
15
+ * - maxMultiplier = 1 / (1 - ltv)
16
+ *
17
+ * Requires: .env with SUI_FULLNODE_URL (or defaults to public mainnet)
18
+ *
19
+ * Run: npx vitest run src/__tests__/internal.getAssetRiskParams.test.ts
20
+ */
21
+ import "dotenv/config";
22
+ //# sourceMappingURL=internal.getAssetRiskParams.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.getAssetRiskParams.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/internal.getAssetRiskParams.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,eAAe,CAAC"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * Internal: protocol.getAssetRiskParams() [Integration]
4
+ *
5
+ * Tests each protocol adapter's on-chain LTV query for all SUPPORTED_COIN_TYPES.
6
+ * This is an internal dependency of sdk.previewLeverage().
7
+ *
8
+ * Used by:
9
+ * - sdk.previewLeverage() → ltv, liquidationThreshold, maxMultiplier
10
+ * - sdk.findBestLeverageRoute() → maxMultiplier for safe multiplier calc
11
+ *
12
+ * Validated fields:
13
+ * - ltv (0 < ltv < 1)
14
+ * - liquidationThreshold (0 < threshold <= 1)
15
+ * - liquidationBonus (0 < bonus < 1)
16
+ * - maxMultiplier = 1 / (1 - ltv)
17
+ *
18
+ * Requires: .env with SUI_FULLNODE_URL (or defaults to public mainnet)
19
+ *
20
+ * Run: npx vitest run src/__tests__/internal.getAssetRiskParams.test.ts
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ require("dotenv/config");
24
+ const vitest_1 = require("vitest");
25
+ const client_1 = require("@mysten/sui/client");
26
+ const adapter_1 = require("../protocols/suilend/adapter");
27
+ const adapter_2 = require("../protocols/navi/adapter");
28
+ const adapter_3 = require("../protocols/scallop/adapter");
29
+ const constants_1 = require("../types/constants");
30
+ const SUI_FULLNODE_URL = process.env.SUI_FULLNODE_URL || (0, client_1.getFullnodeUrl)("mainnet");
31
+ const COIN_LABELS = {
32
+ [constants_1.COIN_TYPES.SUI]: "SUI",
33
+ [constants_1.COIN_TYPES.LBTC]: "LBTC",
34
+ [constants_1.COIN_TYPES.XBTC]: "XBTC",
35
+ };
36
+ const FALLBACK = {
37
+ ltv: 0.5,
38
+ liquidationThreshold: 0.6,
39
+ liquidationBonus: 0.05,
40
+ maxMultiplier: 2.0,
41
+ };
42
+ function isFallback(p) {
43
+ return (p.ltv === FALLBACK.ltv &&
44
+ p.liquidationThreshold === FALLBACK.liquidationThreshold &&
45
+ p.liquidationBonus === FALLBACK.liquidationBonus &&
46
+ p.maxMultiplier === FALLBACK.maxMultiplier);
47
+ }
48
+ // ─── Pretty-print helper ────────────────────────────────────────────
49
+ function printRiskParams(protocol, asset, params) {
50
+ const pct = (v) => `${(v * 100).toFixed(2)}%`;
51
+ const fb = isFallback(params) ? " (FALLBACK)" : "";
52
+ console.log([
53
+ `\n┌─ [${protocol}] ${asset} Risk Params${fb} ──────────────`,
54
+ `│ LTV (borrow limit) : ${pct(params.ltv)}`,
55
+ `│ Liquidation Threshold : ${pct(params.liquidationThreshold)}`,
56
+ `│ Liquidation Bonus : ${pct(params.liquidationBonus)}`,
57
+ `│ Max Multiplier : ${params.maxMultiplier.toFixed(2)}x`,
58
+ `└──────────────────────────────────────────────────`,
59
+ ].join("\n"));
60
+ }
61
+ // ─── Shared assertion helpers ────────────────────────────────────────
62
+ function assertValidRiskParams(params) {
63
+ // LTV: 0 < ltv < 1
64
+ (0, vitest_1.expect)(params.ltv).toBeGreaterThan(0);
65
+ (0, vitest_1.expect)(params.ltv).toBeLessThan(1);
66
+ // Liquidation threshold: 0 < threshold <= 1
67
+ // NOTE: Not all protocols guarantee threshold >= LTV.
68
+ // Navi defines liquidationThreshold independently (can be < ltv).
69
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeGreaterThan(0);
70
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeLessThanOrEqual(1);
71
+ // Liquidation bonus: 0 < bonus < 1
72
+ (0, vitest_1.expect)(params.liquidationBonus).toBeGreaterThan(0);
73
+ (0, vitest_1.expect)(params.liquidationBonus).toBeLessThan(1);
74
+ // Max multiplier = 1 / (1 - ltv), tolerance 0.01
75
+ const expected = 1 / (1 - params.ltv);
76
+ (0, vitest_1.expect)(params.maxMultiplier).toBeCloseTo(expected, 2);
77
+ // Max multiplier must be > 1
78
+ (0, vitest_1.expect)(params.maxMultiplier).toBeGreaterThan(1);
79
+ }
80
+ // ─── Test suites ─────────────────────────────────────────────────────
81
+ (0, vitest_1.describe)("getAssetRiskParams", () => {
82
+ let suiClient;
83
+ (0, vitest_1.beforeAll)(() => {
84
+ suiClient = new client_1.SuiClient({ url: SUI_FULLNODE_URL });
85
+ });
86
+ // ── Suilend ──────────────────────────────────────────────────────
87
+ (0, vitest_1.describe)("Suilend", () => {
88
+ let adapter;
89
+ (0, vitest_1.beforeAll)(async () => {
90
+ adapter = new adapter_1.SuilendAdapter();
91
+ await adapter.initialize(suiClient);
92
+ });
93
+ vitest_1.it.each(constants_1.SUPPORTED_COIN_TYPES.map((ct) => [COIN_LABELS[ct], ct]))("%s — returns valid risk params", async (label, coinType) => {
94
+ const params = await adapter.getAssetRiskParams(coinType);
95
+ printRiskParams("Suilend", label, params);
96
+ assertValidRiskParams(params);
97
+ });
98
+ (0, vitest_1.it)("SUI — returns real on-chain LTV, not fallback", async () => {
99
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.SUI);
100
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
101
+ // Suilend SUI LTV is known to be ~70%
102
+ (0, vitest_1.expect)(params.ltv).toBeGreaterThanOrEqual(0.5);
103
+ (0, vitest_1.expect)(params.ltv).toBeLessThanOrEqual(0.85);
104
+ });
105
+ (0, vitest_1.it)("SUI — liquidationThreshold >= LTV", async () => {
106
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.SUI);
107
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeGreaterThanOrEqual(params.ltv);
108
+ });
109
+ (0, vitest_1.it)("LBTC — returns real on-chain LTV, not fallback", async () => {
110
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.LBTC);
111
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
112
+ (0, vitest_1.expect)(params.ltv).toBeGreaterThanOrEqual(0.4);
113
+ (0, vitest_1.expect)(params.ltv).toBeLessThanOrEqual(0.8);
114
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeGreaterThanOrEqual(params.ltv);
115
+ });
116
+ (0, vitest_1.it)("XBTC — returns real on-chain LTV, not fallback", async () => {
117
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.XBTC);
118
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
119
+ (0, vitest_1.expect)(params.ltv).toBeGreaterThanOrEqual(0.4);
120
+ (0, vitest_1.expect)(params.ltv).toBeLessThanOrEqual(0.8);
121
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeGreaterThanOrEqual(params.ltv);
122
+ });
123
+ });
124
+ // ── Navi ─────────────────────────────────────────────────────────
125
+ (0, vitest_1.describe)("Navi", () => {
126
+ let adapter;
127
+ (0, vitest_1.beforeAll)(async () => {
128
+ adapter = new adapter_2.NaviAdapter();
129
+ await adapter.initialize(suiClient);
130
+ });
131
+ vitest_1.it.each(constants_1.SUPPORTED_COIN_TYPES.map((ct) => [COIN_LABELS[ct], ct]))("%s — returns valid risk params", async (label, coinType) => {
132
+ const params = await adapter.getAssetRiskParams(coinType);
133
+ printRiskParams("Navi", label, params);
134
+ assertValidRiskParams(params);
135
+ });
136
+ (0, vitest_1.it)("SUI — returns real on-chain LTV, not fallback", async () => {
137
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.SUI);
138
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
139
+ (0, vitest_1.expect)(params.ltv).toBeGreaterThanOrEqual(0.5);
140
+ (0, vitest_1.expect)(params.ltv).toBeLessThanOrEqual(0.85);
141
+ });
142
+ (0, vitest_1.it)("SUI — liquidationThreshold is within valid range", async () => {
143
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.SUI);
144
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeGreaterThan(0.5);
145
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeLessThan(1);
146
+ });
147
+ (0, vitest_1.it)("LBTC — LTV ~55%, LT ~70%", async () => {
148
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.LBTC);
149
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
150
+ (0, vitest_1.expect)(params.ltv).toBeCloseTo(0.55, 1);
151
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeCloseTo(0.70, 1);
152
+ });
153
+ (0, vitest_1.it)("XBTC — LTV ~67%, LT ~70%", async () => {
154
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.XBTC);
155
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
156
+ (0, vitest_1.expect)(params.ltv).toBeCloseTo(0.67, 1);
157
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeCloseTo(0.70, 1);
158
+ });
159
+ });
160
+ // ── Scallop ──────────────────────────────────────────────────────
161
+ (0, vitest_1.describe)("Scallop", () => {
162
+ let adapter;
163
+ (0, vitest_1.beforeAll)(async () => {
164
+ adapter = new adapter_3.ScallopAdapter();
165
+ await adapter.initialize(suiClient);
166
+ });
167
+ vitest_1.it.each(constants_1.SUPPORTED_COIN_TYPES.map((ct) => [COIN_LABELS[ct], ct]))("%s — returns valid risk params (may be fallback)", async (label, coinType) => {
168
+ const params = await adapter.getAssetRiskParams(coinType);
169
+ printRiskParams("Scallop", label, params);
170
+ assertValidRiskParams(params);
171
+ });
172
+ (0, vitest_1.it)("SUI — returns real on-chain LTV via direct contract query", async () => {
173
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.SUI);
174
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
175
+ // Scallop SUI: LTV ~85%, LT ~90%
176
+ (0, vitest_1.expect)(params.ltv).toBeGreaterThanOrEqual(0.7);
177
+ (0, vitest_1.expect)(params.ltv).toBeLessThanOrEqual(0.9);
178
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeGreaterThanOrEqual(params.ltv);
179
+ });
180
+ (0, vitest_1.it)("LBTC — returns fallback (not a Scallop collateral)", async () => {
181
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.LBTC);
182
+ (0, vitest_1.expect)(isFallback(params)).toBe(true);
183
+ });
184
+ (0, vitest_1.it)("XBTC — returns real on-chain LTV", async () => {
185
+ const params = await adapter.getAssetRiskParams(constants_1.COIN_TYPES.XBTC);
186
+ (0, vitest_1.expect)(isFallback(params)).toBe(false);
187
+ // Scallop XBTC: LTV ~75%, LT ~80%
188
+ (0, vitest_1.expect)(params.ltv).toBeGreaterThanOrEqual(0.6);
189
+ (0, vitest_1.expect)(params.ltv).toBeLessThanOrEqual(0.85);
190
+ (0, vitest_1.expect)(params.liquidationThreshold).toBeGreaterThanOrEqual(params.ltv);
191
+ });
192
+ });
193
+ });
194
+ //# sourceMappingURL=internal.getAssetRiskParams.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.getAssetRiskParams.test.js","sourceRoot":"","sources":["../../src/__tests__/internal.getAssetRiskParams.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Internal: protocol.getPosition() [Integration]
3
+ *
4
+ * Tests each protocol adapter's on-chain position query directly.
5
+ * This is an internal dependency of sdk.getPosition() and sdk.getOpenPositions().
6
+ *
7
+ * Used by:
8
+ * - sdk.getPosition() → single protocol position query
9
+ * - sdk.getOpenPositions() → all protocols position scan
10
+ * - sdk.buildDeleverageTransaction() → position data for deleverage
11
+ *
12
+ * Validated fields:
13
+ * - collateral: amount >= 0, symbol, coinType, decimals, valueUsd
14
+ * - debt: amount >= 0, symbol, coinType, decimals, valueUsd
15
+ * - netValueUsd = collateral.valueUsd - debt.valueUsd
16
+ *
17
+ * Requires: .env with SECRET_KEY and SUI_FULLNODE_URL
18
+ *
19
+ * Run: npx vitest run src/__tests__/internal.getPosition.test.ts
20
+ */
21
+ import "dotenv/config";
22
+ //# sourceMappingURL=internal.getPosition.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.getPosition.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/internal.getPosition.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,eAAe,CAAC"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /**
3
+ * Internal: protocol.getPosition() [Integration]
4
+ *
5
+ * Tests each protocol adapter's on-chain position query directly.
6
+ * This is an internal dependency of sdk.getPosition() and sdk.getOpenPositions().
7
+ *
8
+ * Used by:
9
+ * - sdk.getPosition() → single protocol position query
10
+ * - sdk.getOpenPositions() → all protocols position scan
11
+ * - sdk.buildDeleverageTransaction() → position data for deleverage
12
+ *
13
+ * Validated fields:
14
+ * - collateral: amount >= 0, symbol, coinType, decimals, valueUsd
15
+ * - debt: amount >= 0, symbol, coinType, decimals, valueUsd
16
+ * - netValueUsd = collateral.valueUsd - debt.valueUsd
17
+ *
18
+ * Requires: .env with SECRET_KEY and SUI_FULLNODE_URL
19
+ *
20
+ * Run: npx vitest run src/__tests__/internal.getPosition.test.ts
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ require("dotenv/config");
24
+ const vitest_1 = require("vitest");
25
+ const client_1 = require("@mysten/sui/client");
26
+ const ed25519_1 = require("@mysten/sui/keypairs/ed25519");
27
+ const adapter_1 = require("../protocols/suilend/adapter");
28
+ const adapter_2 = require("../protocols/navi/adapter");
29
+ const adapter_3 = require("../protocols/scallop/adapter");
30
+ const SUI_FULLNODE_URL = process.env.SUI_FULLNODE_URL || (0, client_1.getFullnodeUrl)("mainnet");
31
+ // ─── Pretty-print helper ────────────────────────────────────────────
32
+ function printPosition(protocol, position) {
33
+ if (!position) {
34
+ console.log(`\n┌─ [${protocol}] No position found ──────────`);
35
+ console.log(`└──────────────────────────────────────────────`);
36
+ return;
37
+ }
38
+ const usd = (v) => `$${v.toFixed(4)}`;
39
+ const lines = [
40
+ `\n┌─ [${protocol}] Position ──────────────────────────────────`,
41
+ `│ Supplies (${position.supplies.length}):`,
42
+ ];
43
+ for (const s of position.supplies) {
44
+ lines.push(`│ ${s.symbol.padEnd(8)} ${s.amount.toString().padStart(15)} (${usd(s.valueUsd)})`);
45
+ }
46
+ lines.push(`│ Borrows (${position.borrows.length}):`);
47
+ for (const b of position.borrows) {
48
+ lines.push(`│ ${b.symbol.padEnd(8)} ${b.amount.toString().padStart(15)} (${usd(b.valueUsd)})`);
49
+ }
50
+ if (position.borrows.length === 0) {
51
+ lines.push(`│ (none)`);
52
+ }
53
+ lines.push(`│`, `│ Primary collateral : ${position.collateral.symbol} (${usd(position.collateral.valueUsd)})`, `│ Primary debt : ${position.debt.symbol} (${usd(position.debt.valueUsd)})`, `│ Net Value USD : ${usd(position.netValueUsd)}`, `└──────────────────────────────────────────────────────────`);
54
+ console.log(lines.join("\n"));
55
+ }
56
+ // ─── Shared assertion helpers ────────────────────────────────────────
57
+ function assertValidPosition(position) {
58
+ // supplies / borrows arrays
59
+ (0, vitest_1.expect)(Array.isArray(position.supplies)).toBe(true);
60
+ (0, vitest_1.expect)(Array.isArray(position.borrows)).toBe(true);
61
+ (0, vitest_1.expect)(position.supplies.length).toBeGreaterThan(0);
62
+ for (const s of position.supplies) {
63
+ (0, vitest_1.expect)(s.symbol).toBeTruthy();
64
+ (0, vitest_1.expect)(s.coinType).toContain("::");
65
+ (0, vitest_1.expect)(s.amount).toBeGreaterThanOrEqual(0n);
66
+ }
67
+ for (const b of position.borrows) {
68
+ (0, vitest_1.expect)(b.symbol).toBeTruthy();
69
+ (0, vitest_1.expect)(b.coinType).toContain("::");
70
+ (0, vitest_1.expect)(b.amount).toBeGreaterThanOrEqual(0n);
71
+ }
72
+ // Primary collateral = largest supply by USD
73
+ const maxSupply = [...position.supplies].sort((a, b) => b.valueUsd - a.valueUsd)[0];
74
+ (0, vitest_1.expect)(position.collateral.coinType).toBe(maxSupply.coinType);
75
+ // Primary debt = largest borrow by USD (or default USDC if none)
76
+ if (position.borrows.length > 0) {
77
+ const maxBorrow = [...position.borrows].sort((a, b) => b.valueUsd - a.valueUsd)[0];
78
+ (0, vitest_1.expect)(position.debt.coinType).toBe(maxBorrow.coinType);
79
+ }
80
+ // Net value = total supplies - total borrows
81
+ const totalSupplyUsd = position.supplies.reduce((s, p) => s + p.valueUsd, 0);
82
+ const totalDebtUsd = position.borrows.reduce((s, p) => s + p.valueUsd, 0);
83
+ (0, vitest_1.expect)(position.netValueUsd).toBeCloseTo(totalSupplyUsd - totalDebtUsd, 2);
84
+ }
85
+ // ─── Test suites ─────────────────────────────────────────────────────
86
+ (0, vitest_1.describe)("getPosition (adapter-level)", () => {
87
+ let suiClient;
88
+ let userAddress;
89
+ (0, vitest_1.beforeAll)(() => {
90
+ const secretKey = process.env.SECRET_KEY || process.env.SUI_SECRET_KEY;
91
+ if (!secretKey)
92
+ throw new Error("SECRET_KEY env is required");
93
+ const keypair = ed25519_1.Ed25519Keypair.fromSecretKey(secretKey);
94
+ userAddress = keypair.getPublicKey().toSuiAddress();
95
+ suiClient = new client_1.SuiClient({ url: SUI_FULLNODE_URL });
96
+ console.log(`\nWallet: ${userAddress}\n`);
97
+ });
98
+ // ── Suilend ──────────────────────────────────────────────────────
99
+ (0, vitest_1.describe)("Suilend", () => {
100
+ let adapter;
101
+ (0, vitest_1.beforeAll)(async () => {
102
+ adapter = new adapter_1.SuilendAdapter();
103
+ await adapter.initialize(suiClient);
104
+ }, 30000);
105
+ (0, vitest_1.it)("returns null or valid PositionInfo", async () => {
106
+ const position = await adapter.getPosition(userAddress);
107
+ printPosition("Suilend", position);
108
+ if (position) {
109
+ assertValidPosition(position);
110
+ }
111
+ else {
112
+ (0, vitest_1.expect)(position).toBeNull();
113
+ }
114
+ }, 30000);
115
+ });
116
+ // ── Navi ─────────────────────────────────────────────────────────
117
+ (0, vitest_1.describe)("Navi", () => {
118
+ let adapter;
119
+ (0, vitest_1.beforeAll)(async () => {
120
+ adapter = new adapter_2.NaviAdapter();
121
+ await adapter.initialize(suiClient);
122
+ }, 30000);
123
+ (0, vitest_1.it)("returns null or valid PositionInfo", async () => {
124
+ const position = await adapter.getPosition(userAddress);
125
+ printPosition("Navi", position);
126
+ if (position) {
127
+ assertValidPosition(position);
128
+ }
129
+ else {
130
+ (0, vitest_1.expect)(position).toBeNull();
131
+ }
132
+ }, 30000);
133
+ });
134
+ // ── Scallop ──────────────────────────────────────────────────────
135
+ (0, vitest_1.describe)("Scallop", () => {
136
+ let adapter;
137
+ (0, vitest_1.beforeAll)(async () => {
138
+ adapter = new adapter_3.ScallopAdapter();
139
+ await adapter.initialize(suiClient);
140
+ }, 30000);
141
+ (0, vitest_1.it)("returns null or valid PositionInfo", async () => {
142
+ const position = await adapter.getPosition(userAddress);
143
+ printPosition("Scallop", position);
144
+ if (position) {
145
+ assertValidPosition(position);
146
+ }
147
+ else {
148
+ (0, vitest_1.expect)(position).toBeNull();
149
+ }
150
+ }, 30000);
151
+ });
152
+ });
153
+ //# sourceMappingURL=internal.getPosition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.getPosition.test.js","sourceRoot":"","sources":["../../src/__tests__/internal.getPosition.test.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAEH,yBAAuB;AACvB,mCAAyD;AACzD,+CAA+D;AAC/D,0DAA8D;AAC9D,0DAA8D;AAC9D,uDAAwD;AACxD,0DAA8D;AAG9D,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAA,uBAAc,EAAC,SAAS,CAAC,CAAC;AAE5D,uEAAuE;AAEvE,SAAS,aAAa,CACpB,QAAgB,EAChB,QAA6B;IAE7B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,gCAAgC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG;QACZ,SAAS,QAAQ,+CAA+C;QAChE,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI;KAC7C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,IAAI,CACR,GAAG,EACH,2BAA2B,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAC9F,2BAA2B,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAClF,2BAA2B,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EACtD,6DAA6D,CAC9D,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,wEAAwE;AAExE,SAAS,mBAAmB,CAAC,QAAsB;IACjD,4BAA4B;IAC5B,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,IAAA,eAAM,EAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,IAAA,eAAM,EAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAEpD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAA,eAAM,EAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjC,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;QAC9B,IAAA,eAAM,EAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,6CAA6C;IAC7C,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,IAAA,eAAM,EAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE9D,iEAAiE;IACjE,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,IAAA,eAAM,EAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,6CAA6C;IAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1E,IAAA,eAAM,EAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,cAAc,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,wEAAwE;AAExE,IAAA,iBAAQ,EAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,SAAoB,CAAC;IACzB,IAAI,WAAmB,CAAC;IAExB,IAAA,kBAAS,EAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACvE,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,wBAAc,CAAC,aAAa,CAAC,SAAgB,CAAC,CAAC;QAC/D,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC;QACpD,SAAS,GAAG,IAAI,kBAAS,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,IAAA,iBAAQ,EAAC,SAAS,EAAE,GAAG,EAAE;QACvB,IAAI,OAAuB,CAAC;QAE5B,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;YACnB,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,EAAE,KAAM,CAAC,CAAC;QAEX,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACxD,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEnC,IAAI,QAAQ,EAAE,CAAC;gBACb,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC,EAAE,KAAM,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;QACpB,IAAI,OAAoB,CAAC;QAEzB,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;YACnB,OAAO,GAAG,IAAI,qBAAW,EAAE,CAAC;YAC5B,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,EAAE,KAAM,CAAC,CAAC;QAEX,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACxD,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEhC,IAAI,QAAQ,EAAE,CAAC;gBACb,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC,EAAE,KAAM,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,oEAAoE;IAEpE,IAAA,iBAAQ,EAAC,SAAS,EAAE,GAAG,EAAE;QACvB,IAAI,OAAuB,CAAC;QAE5B,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;YACnB,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC,EAAE,KAAM,CAAC,CAAC;QAEX,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACxD,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEnC,IAAI,QAAQ,EAAE,CAAC;gBACb,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC,EAAE,KAAM,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Unit Tests: previewLeverage (extracted module)
3
+ *
4
+ * Tests the standalone previewLeverage function with mocked dependencies.
5
+ * No mainnet RPC required.
6
+ *
7
+ * Run: npx vitest run src/__tests__/leveragePreview.unit.test.ts
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=leveragePreview.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leveragePreview.unit.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/leveragePreview.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}