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 @@
1
+ {"version":3,"file":"sdk.bestRoute.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.bestRoute.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ /**
3
+ * SDK Method: sdk.findBestLeverageRoute() [Integration]
4
+ *
5
+ * Verifies best-route-finding across all protocols with live mainnet data.
6
+ *
7
+ * Internal dependencies:
8
+ * - sdk.previewLeverage() → see sdk.preview.test.ts
9
+ * - protocol.getAssetRiskParams() → see internal.getAssetRiskParams.test.ts
10
+ * - LEVERAGE_MULTIPLIER_BUFFER → constant for safe multiplier calc
11
+ *
12
+ * Verified behavior:
13
+ * - Returns bestMaxMultiplier and bestApy routes
14
+ * - Safe multiplier = min(maxMultipliers) - buffer
15
+ * - Graceful degradation when a protocol fails
16
+ * - Dryrun with best route succeeds on-chain
17
+ *
18
+ * Unit test counterpart: sdk.bestRoute.unit.test.ts
19
+ *
20
+ * Run: npx vitest run src/__tests__/sdk.bestRoute.test.ts
21
+ */
22
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ var desc = Object.getOwnPropertyDescriptor(m, k);
25
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
26
+ desc = { enumerable: true, get: function() { return m[k]; } };
27
+ }
28
+ Object.defineProperty(o, k2, desc);
29
+ }) : (function(o, m, k, k2) {
30
+ if (k2 === undefined) k2 = k;
31
+ o[k2] = m[k];
32
+ }));
33
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
34
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
35
+ }) : function(o, v) {
36
+ o["default"] = v;
37
+ });
38
+ var __importStar = (this && this.__importStar) || (function () {
39
+ var ownKeys = function(o) {
40
+ ownKeys = Object.getOwnPropertyNames || function (o) {
41
+ var ar = [];
42
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
43
+ return ar;
44
+ };
45
+ return ownKeys(o);
46
+ };
47
+ return function (mod) {
48
+ if (mod && mod.__esModule) return mod;
49
+ var result = {};
50
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
51
+ __setModuleDefault(result, mod);
52
+ return result;
53
+ };
54
+ })();
55
+ Object.defineProperty(exports, "__esModule", { value: true });
56
+ const vitest_1 = require("vitest");
57
+ const dotenv = __importStar(require("dotenv"));
58
+ dotenv.config({ path: '.env' });
59
+ const __1 = require("..");
60
+ const types_1 = require("../types");
61
+ const client_1 = require("@mysten/sui/client");
62
+ const ed25519_1 = require("@mysten/sui/keypairs/ed25519");
63
+ const transactions_1 = require("@mysten/sui/transactions");
64
+ // ── Print helper ──────────────────────────────────────────────────────────────
65
+ function printRouteResult(asset, result) {
66
+ const pct = (v) => `${(v * 100).toFixed(3)}%`;
67
+ const usd = (v) => `$${v.toFixed(2)}`;
68
+ console.log([
69
+ `\n┌─ Best Routes for ${asset} ──────────────────────────────────────`,
70
+ `│ Safe Multiplier : ${result.safeMultiplier.toFixed(2)}x`,
71
+ `│ Protocols OK : ${result.allPreviews.length}`,
72
+ `│ Protocols Failed: ${result.failedProtocols.length}${result.failedProtocols.length > 0 ? ` (${result.failedProtocols.map((f) => f.protocol).join(', ')})` : ''}`,
73
+ `│`,
74
+ `│ ── Best Max Multiplier ──────────────────────────────`,
75
+ `│ Protocol : ${result.bestMaxMultiplier.protocol}`,
76
+ `│ Max Multiplier : ${result.bestMaxMultiplier.preview.maxMultiplier.toFixed(2)}x`,
77
+ `│ Used Multiplier: ${result.bestMaxMultiplier.multiplier.toFixed(2)}x`,
78
+ `│ Net APY : ${pct(result.bestMaxMultiplier.preview.netApy)}`,
79
+ `│ Annual Earnings: ${usd(result.bestMaxMultiplier.preview.annualNetEarningsUsd)}`,
80
+ `│`,
81
+ `│ ── Best APY (at safe mult) ──────────────────────────`,
82
+ `│ Protocol : ${result.bestApy.protocol}`,
83
+ `│ Multiplier : ${result.bestApy.multiplier.toFixed(2)}x`,
84
+ `│ Net APY : ${pct(result.bestApy.preview.netApy)}`,
85
+ `│ Annual Earnings: ${usd(result.bestApy.preview.annualNetEarningsUsd)}`,
86
+ `│`,
87
+ `│ ── All Previews (at safe mult) ──────────────────────`,
88
+ ...result.allPreviews.map((p) => `│ ${p.protocol.padEnd(8)} → Net APY: ${pct(p.preview.netApy)}, Max: ${p.preview.maxMultiplier.toFixed(2)}x`),
89
+ `└──────────────────────────────────────────────────────────────────`,
90
+ ].join('\n'));
91
+ }
92
+ // ── Shared assertions ─────────────────────────────────────────────────────────
93
+ function assertValidRoute(route) {
94
+ (0, vitest_1.expect)(Object.values(__1.LendingProtocol)).toContain(route.protocol);
95
+ (0, vitest_1.expect)(route.multiplier).toBeGreaterThan(1);
96
+ (0, vitest_1.expect)(route.preview.maxMultiplier).toBeGreaterThan(1);
97
+ (0, vitest_1.expect)(route.preview.initialEquityUsd).toBeGreaterThan(0);
98
+ (0, vitest_1.expect)(route.preview.totalPositionUsd).toBeGreaterThan(0);
99
+ (0, vitest_1.expect)(route.preview.netApy).toBeDefined();
100
+ }
101
+ // ── SDK Setup ─────────────────────────────────────────────────────────────────
102
+ let sdk;
103
+ const SECRET_KEY = process.env.SECRET_KEY || process.env.SUI_SECRET_KEY;
104
+ (0, vitest_1.beforeAll)(async () => {
105
+ if (!SECRET_KEY)
106
+ throw new Error('SECRET_KEY env is required');
107
+ const suiClient = new client_1.SuiClient({
108
+ url: process.env.SUI_FULLNODE_URL || (0, client_1.getFullnodeUrl)('mainnet'),
109
+ });
110
+ const keypair = ed25519_1.Ed25519Keypair.fromSecretKey(SECRET_KEY);
111
+ sdk = await __1.DefiDashSDK.create(suiClient, keypair);
112
+ }, 60000);
113
+ // ── Tests ─────────────────────────────────────────────────────────────────────
114
+ (0, vitest_1.describe)('findBestLeverageRoute Integration', () => {
115
+ (0, vitest_1.it)('SUI $100 – returns two valid routes', async () => {
116
+ const result = await sdk.findBestLeverageRoute({
117
+ depositAsset: 'SUI',
118
+ depositValueUsd: 100,
119
+ });
120
+ printRouteResult('SUI', result);
121
+ assertValidRoute(result.bestMaxMultiplier);
122
+ assertValidRoute(result.bestApy);
123
+ // Safe multiplier = min(maxMults) - buffer
124
+ const minMax = Math.min(...result.allPreviews.map((p) => p.preview.maxMultiplier));
125
+ (0, vitest_1.expect)(result.safeMultiplier).toBeCloseTo(Math.max(1.1, minMax - types_1.LEVERAGE_MULTIPLIER_BUFFER), 1);
126
+ // bestMaxMultiplier should have the highest maxMultiplier
127
+ for (const p of result.allPreviews) {
128
+ (0, vitest_1.expect)(result.bestMaxMultiplier.preview.maxMultiplier).toBeGreaterThanOrEqual(p.preview.maxMultiplier);
129
+ }
130
+ // bestApy should have the highest netApy among all safe previews
131
+ for (const p of result.allPreviews) {
132
+ (0, vitest_1.expect)(result.bestApy.preview.netApy).toBeGreaterThanOrEqual(p.preview.netApy);
133
+ }
134
+ }, 120000);
135
+ (0, vitest_1.it)('XBTC $100 – valid routes for BTC leverage', async () => {
136
+ const result = await sdk.findBestLeverageRoute({
137
+ depositAsset: 'XBTC',
138
+ depositValueUsd: 100,
139
+ });
140
+ printRouteResult('XBTC', result);
141
+ assertValidRoute(result.bestMaxMultiplier);
142
+ assertValidRoute(result.bestApy);
143
+ // At least 2 protocols should succeed for XBTC
144
+ (0, vitest_1.expect)(result.allPreviews.length).toBeGreaterThanOrEqual(2);
145
+ }, 120000);
146
+ (0, vitest_1.it)('bestApy multiplier equals safeMultiplier', async () => {
147
+ const result = await sdk.findBestLeverageRoute({
148
+ depositAsset: 'SUI',
149
+ depositValueUsd: 100,
150
+ });
151
+ (0, vitest_1.expect)(result.bestApy.multiplier).toBe(result.safeMultiplier);
152
+ }, 120000);
153
+ // ── Dryrun: verify best APY route builds a valid transaction on-chain ──────
154
+ (0, vitest_1.it)('SUI $1 – dryrun leverage with best APY route succeeds', async () => {
155
+ const route = await sdk.findBestLeverageRoute({
156
+ depositAsset: 'SUI',
157
+ depositValueUsd: 1,
158
+ });
159
+ const tx = new transactions_1.Transaction();
160
+ tx.setSender(sdk.getUserAddress());
161
+ await sdk.buildLeverageTransaction(tx, {
162
+ protocol: route.bestApy.protocol,
163
+ depositAsset: 'SUI',
164
+ depositValueUsd: 1,
165
+ multiplier: route.bestApy.multiplier,
166
+ });
167
+ const result = await sdk.dryRun(tx);
168
+ console.log(`\n Dryrun: ${route.bestApy.protocol} SUI ${route.bestApy.multiplier.toFixed(2)}x → ` +
169
+ `${result.success ? 'SUCCESS' : 'FAILED: ' + result.error}` +
170
+ `${result.gasUsed ? ` (gas: ${(Number(result.gasUsed) / 1e9).toFixed(4)} SUI)` : ''}`);
171
+ (0, vitest_1.expect)(result.success).toBe(true);
172
+ (0, vitest_1.expect)(result.gasUsed).toBeDefined();
173
+ (0, vitest_1.expect)(result.gasUsed).toBeGreaterThan(0n);
174
+ }, 180000);
175
+ // ── Error cases ──────────────────────────────────────────────────────────────
176
+ (0, vitest_1.it)('rejects when neither depositAmount nor depositValueUsd provided', async () => {
177
+ await (0, vitest_1.expect)(sdk.findBestLeverageRoute({ depositAsset: 'SUI' })).rejects.toThrow('Either depositAmount or depositValueUsd must be provided');
178
+ });
179
+ (0, vitest_1.it)('rejects unknown asset', async () => {
180
+ await (0, vitest_1.expect)(sdk.findBestLeverageRoute({
181
+ depositAsset: 'FAKECOIN',
182
+ depositValueUsd: 100,
183
+ })).rejects.toThrow();
184
+ });
185
+ });
186
+ //# sourceMappingURL=sdk.bestRoute.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.bestRoute.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.bestRoute.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SDK Method: sdk.findBestLeverageRoute() [Unit]
3
+ *
4
+ * Tests findBestLeverageRoute() with mocked dependencies. No mainnet RPC.
5
+ *
6
+ * Mocked internal dependencies:
7
+ * - previewFn() → returns mock LeveragePreview per protocol
8
+ * - protocol.getAssetRiskParams() → returns mock risk params (ltv, maxMultiplier)
9
+ * - resolveCoinType() → returns COIN_TYPES.SUI
10
+ *
11
+ * Integration test counterpart: sdk.bestRoute.test.ts
12
+ *
13
+ * Run: npx vitest run src/__tests__/sdk.bestRoute.unit.test.ts
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=sdk.bestRoute.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.bestRoute.unit.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.bestRoute.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * SDK Method: sdk.findBestLeverageRoute() [Unit]
4
+ *
5
+ * Tests findBestLeverageRoute() with mocked dependencies. No mainnet RPC.
6
+ *
7
+ * Mocked internal dependencies:
8
+ * - previewFn() → returns mock LeveragePreview per protocol
9
+ * - protocol.getAssetRiskParams() → returns mock risk params (ltv, maxMultiplier)
10
+ * - resolveCoinType() → returns COIN_TYPES.SUI
11
+ *
12
+ * Integration test counterpart: sdk.bestRoute.test.ts
13
+ *
14
+ * Run: npx vitest run src/__tests__/sdk.bestRoute.unit.test.ts
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const vitest_1 = require("vitest");
18
+ const leverage_route_1 = require("../strategies/leverage-route");
19
+ const types_1 = require("../types");
20
+ // ── Mock helpers ─────────────────────────────────────────────────────────────
21
+ function makeMockProtocol(name, ltv, maxMultiplier) {
22
+ return {
23
+ name,
24
+ consumesRepaymentCoin: false,
25
+ getAssetRiskParams: vitest_1.vi.fn().mockResolvedValue({
26
+ ltv,
27
+ liquidationThreshold: ltv + 0.05,
28
+ liquidationBonus: 0.05,
29
+ maxMultiplier,
30
+ }),
31
+ getAssetApy: vitest_1.vi.fn(),
32
+ initialize: vitest_1.vi.fn(),
33
+ getPosition: vitest_1.vi.fn(),
34
+ deposit: vitest_1.vi.fn(),
35
+ withdraw: vitest_1.vi.fn(),
36
+ borrow: vitest_1.vi.fn(),
37
+ repay: vitest_1.vi.fn(),
38
+ refreshOracles: vitest_1.vi.fn(),
39
+ getAccountPortfolio: vitest_1.vi.fn(),
40
+ };
41
+ }
42
+ function makePreview(netApy, maxMultiplier = 3.0) {
43
+ return {
44
+ initialEquityUsd: 100,
45
+ flashLoanUsdc: 100000000n,
46
+ flashLoanFeeUsd: 0,
47
+ totalPositionUsd: 200,
48
+ debtUsd: 100,
49
+ effectiveMultiplier: 2.0,
50
+ maxMultiplier,
51
+ assetLtv: 0.65,
52
+ ltvPercent: 50,
53
+ liquidationThreshold: 0.70,
54
+ liquidationPrice: 1.0,
55
+ priceDropBuffer: 30,
56
+ supplyApyBreakdown: { base: 0.03, reward: 0, total: 0.03 },
57
+ borrowApyBreakdown: { gross: 0.05, rebate: 0, net: 0.05 },
58
+ netApy,
59
+ annualNetEarningsUsd: netApy * 100,
60
+ swapSlippagePct: 0.5,
61
+ };
62
+ }
63
+ function createMockDeps(protocolMap, previewResults) {
64
+ return {
65
+ protocols: protocolMap,
66
+ previewFn: vitest_1.vi.fn().mockImplementation(async (protocol) => {
67
+ const preview = previewResults.get(protocol);
68
+ if (!preview)
69
+ throw new Error(`No preview for ${protocol}`);
70
+ return preview;
71
+ }),
72
+ resolveCoinType: vitest_1.vi.fn().mockReturnValue(types_1.COIN_TYPES.SUI),
73
+ };
74
+ }
75
+ // ── Tests ────────────────────────────────────────────────────────────────────
76
+ (0, vitest_1.describe)("findBestLeverageRoute (unit)", () => {
77
+ (0, vitest_1.it)("selects protocol with highest maxMultiplier for bestMaxMultiplier", async () => {
78
+ const protocols = new Map([
79
+ [types_1.LendingProtocol.Suilend, makeMockProtocol("suilend", 0.65, 2.86)],
80
+ [types_1.LendingProtocol.Scallop, makeMockProtocol("scallop", 0.85, 6.67)],
81
+ [types_1.LendingProtocol.Navi, makeMockProtocol("navi", 0.75, 4.0)],
82
+ ]);
83
+ const previews = new Map([
84
+ [types_1.LendingProtocol.Suilend, makePreview(0.05, 2.86)],
85
+ [types_1.LendingProtocol.Scallop, makePreview(0.03, 6.67)],
86
+ [types_1.LendingProtocol.Navi, makePreview(0.04, 4.0)],
87
+ ]);
88
+ const deps = createMockDeps(protocols, previews);
89
+ const result = await (0, leverage_route_1.findBestLeverageRoute)({ depositAsset: "SUI", depositValueUsd: 100 }, deps);
90
+ (0, vitest_1.expect)(result.bestMaxMultiplier.protocol).toBe(types_1.LendingProtocol.Scallop);
91
+ });
92
+ (0, vitest_1.it)("selects protocol with highest netApy for bestApy", async () => {
93
+ const protocols = new Map([
94
+ [types_1.LendingProtocol.Suilend, makeMockProtocol("suilend", 0.65, 2.86)],
95
+ [types_1.LendingProtocol.Scallop, makeMockProtocol("scallop", 0.85, 6.67)],
96
+ [types_1.LendingProtocol.Navi, makeMockProtocol("navi", 0.75, 4.0)],
97
+ ]);
98
+ const previews = new Map([
99
+ [types_1.LendingProtocol.Suilend, makePreview(0.08)], // Best APY
100
+ [types_1.LendingProtocol.Scallop, makePreview(0.03)],
101
+ [types_1.LendingProtocol.Navi, makePreview(0.04)],
102
+ ]);
103
+ const deps = createMockDeps(protocols, previews);
104
+ const result = await (0, leverage_route_1.findBestLeverageRoute)({ depositAsset: "SUI", depositValueUsd: 100 }, deps);
105
+ (0, vitest_1.expect)(result.bestApy.protocol).toBe(types_1.LendingProtocol.Suilend);
106
+ (0, vitest_1.expect)(result.bestApy.preview.netApy).toBe(0.08);
107
+ });
108
+ (0, vitest_1.it)("calculates safeMultiplier as min(maxMultipliers) - buffer", async () => {
109
+ const protocols = new Map([
110
+ [types_1.LendingProtocol.Suilend, makeMockProtocol("suilend", 0.65, 2.86)],
111
+ [types_1.LendingProtocol.Navi, makeMockProtocol("navi", 0.75, 4.0)],
112
+ ]);
113
+ const previews = new Map([
114
+ [types_1.LendingProtocol.Suilend, makePreview(0.05)],
115
+ [types_1.LendingProtocol.Navi, makePreview(0.04)],
116
+ ]);
117
+ const deps = createMockDeps(protocols, previews);
118
+ const result = await (0, leverage_route_1.findBestLeverageRoute)({ depositAsset: "SUI", depositValueUsd: 100 }, deps);
119
+ // safeMultiplier = min(2.86, 4.0) - 0.5 = 2.36
120
+ (0, vitest_1.expect)(result.safeMultiplier).toBeCloseTo(2.36, 1);
121
+ });
122
+ (0, vitest_1.it)("floors safeMultiplier at 1.1", async () => {
123
+ const protocols = new Map([
124
+ [types_1.LendingProtocol.Suilend, makeMockProtocol("suilend", 0.30, 1.43)],
125
+ ]);
126
+ const previews = new Map([
127
+ [types_1.LendingProtocol.Suilend, makePreview(0.02)],
128
+ ]);
129
+ const deps = createMockDeps(protocols, previews);
130
+ const result = await (0, leverage_route_1.findBestLeverageRoute)({ depositAsset: "SUI", depositValueUsd: 100 }, deps);
131
+ // safeMultiplier = max(1.1, 1.43 - 0.5) = max(1.1, 0.93) = 1.1
132
+ (0, vitest_1.expect)(result.safeMultiplier).toBe(1.1);
133
+ });
134
+ (0, vitest_1.it)("includes allPreviews and failedProtocols", async () => {
135
+ const failingProtocol = makeMockProtocol("navi", 0.75, 4.0);
136
+ failingProtocol.getAssetRiskParams.mockRejectedValue(new Error("Asset not supported"));
137
+ const protocols = new Map([
138
+ [types_1.LendingProtocol.Suilend, makeMockProtocol("suilend", 0.65, 2.86)],
139
+ [types_1.LendingProtocol.Navi, failingProtocol],
140
+ ]);
141
+ const previews = new Map([
142
+ [types_1.LendingProtocol.Suilend, makePreview(0.05)],
143
+ ]);
144
+ const deps = createMockDeps(protocols, previews);
145
+ const result = await (0, leverage_route_1.findBestLeverageRoute)({ depositAsset: "SUI", depositValueUsd: 100 }, deps);
146
+ (0, vitest_1.expect)(result.allPreviews).toHaveLength(1);
147
+ (0, vitest_1.expect)(result.failedProtocols).toHaveLength(1);
148
+ (0, vitest_1.expect)(result.failedProtocols[0].protocol).toBe(types_1.LendingProtocol.Navi);
149
+ });
150
+ (0, vitest_1.it)("throws if no protocol supports the asset", async () => {
151
+ const failing = makeMockProtocol("suilend", 0, 0);
152
+ failing.getAssetRiskParams.mockRejectedValue(new Error("Not supported"));
153
+ const protocols = new Map([
154
+ [types_1.LendingProtocol.Suilend, failing],
155
+ ]);
156
+ const deps = createMockDeps(protocols, new Map());
157
+ await (0, vitest_1.expect)((0, leverage_route_1.findBestLeverageRoute)({ depositAsset: "SUI", depositValueUsd: 100 }, deps)).rejects.toThrow("No protocol supports asset");
158
+ });
159
+ (0, vitest_1.it)("throws if neither depositAmount nor depositValueUsd provided", async () => {
160
+ const protocols = new Map();
161
+ const deps = createMockDeps(protocols, new Map());
162
+ await (0, vitest_1.expect)((0, leverage_route_1.findBestLeverageRoute)({ depositAsset: "SUI" }, deps)).rejects.toThrow("Either depositAmount or depositValueUsd");
163
+ });
164
+ });
165
+ //# sourceMappingURL=sdk.bestRoute.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.bestRoute.unit.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.bestRoute.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SDK Method: sdk.buildDeleverageTransaction() + sdk.dryRun() [Integration]
3
+ *
4
+ * Verifies that buildDeleverageTransaction builds a valid PTB
5
+ * and dryRun successfully simulates it on mainnet.
6
+ *
7
+ * Internal dependencies (tested separately):
8
+ * - calculateDeleverageEstimate() → strategies/deleverage.ts
9
+ * - ScallopFlashLoanClient → flash loan borrow/repay
10
+ * - 7k Protocol swap → collateral → USDC swap
11
+ * - protocol.withdraw() → lending withdrawal
12
+ * - protocol.repay() → debt repayment
13
+ * - protocol.refreshOracles() → oracle price update
14
+ *
15
+ * NOTE: These tests require an active leveraged position on the target protocol.
16
+ * If no position exists, the test is skipped gracefully.
17
+ *
18
+ * Run: npx vitest run src/__tests__/sdk.deleverage.test.ts
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=sdk.deleverage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.deleverage.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.deleverage.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * SDK Method: sdk.buildDeleverageTransaction() + sdk.dryRun() [Integration]
4
+ *
5
+ * Verifies that buildDeleverageTransaction builds a valid PTB
6
+ * and dryRun successfully simulates it on mainnet.
7
+ *
8
+ * Internal dependencies (tested separately):
9
+ * - calculateDeleverageEstimate() → strategies/deleverage.ts
10
+ * - ScallopFlashLoanClient → flash loan borrow/repay
11
+ * - 7k Protocol swap → collateral → USDC swap
12
+ * - protocol.withdraw() → lending withdrawal
13
+ * - protocol.repay() → debt repayment
14
+ * - protocol.refreshOracles() → oracle price update
15
+ *
16
+ * NOTE: These tests require an active leveraged position on the target protocol.
17
+ * If no position exists, the test is skipped gracefully.
18
+ *
19
+ * Run: npx vitest run src/__tests__/sdk.deleverage.test.ts
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ const vitest_1 = require("vitest");
56
+ const dotenv = __importStar(require("dotenv"));
57
+ dotenv.config({ path: ".env" });
58
+ const __1 = require("..");
59
+ const client_1 = require("@mysten/sui/client");
60
+ const ed25519_1 = require("@mysten/sui/keypairs/ed25519");
61
+ const transactions_1 = require("@mysten/sui/transactions");
62
+ // ── SDK Setup ────────────────────────────────────────────────────────────────
63
+ let sdk;
64
+ let address;
65
+ const SECRET_KEY = process.env.SECRET_KEY || process.env.SUI_SECRET_KEY;
66
+ (0, vitest_1.beforeAll)(async () => {
67
+ if (!SECRET_KEY)
68
+ throw new Error("SECRET_KEY env is required");
69
+ const suiClient = new client_1.SuiClient({
70
+ url: process.env.SUI_FULLNODE_URL || (0, client_1.getFullnodeUrl)("mainnet"),
71
+ });
72
+ const keypair = ed25519_1.Ed25519Keypair.fromSecretKey(SECRET_KEY);
73
+ address = keypair.getPublicKey().toSuiAddress();
74
+ sdk = await __1.DefiDashSDK.create(suiClient, keypair);
75
+ console.log(`\nWallet: ${address}\n`);
76
+ }, 60000);
77
+ // ── Helper ───────────────────────────────────────────────────────────────────
78
+ function printPosition(protocol, position) {
79
+ const usd = (v) => `$${v.toFixed(4)}`;
80
+ console.log(` [${protocol}] Collateral: ${position.collateral.symbol} ${usd(position.collateral.valueUsd)}` +
81
+ ` | Debt: ${position.debt.symbol} ${usd(position.debt.valueUsd)}` +
82
+ ` | Net: ${usd(position.netValueUsd)}`);
83
+ }
84
+ // ── Tests: buildDeleverageTransaction + dryRun ──────────────────────────────
85
+ (0, vitest_1.describe)("sdk.buildDeleverageTransaction + dryRun", () => {
86
+ vitest_1.it.each([
87
+ [__1.LendingProtocol.Suilend, "Suilend"],
88
+ [__1.LendingProtocol.Navi, "Navi"],
89
+ [__1.LendingProtocol.Scallop, "Scallop"],
90
+ ])("%s — builds and dryruns deleverage (or skips if no position)", async (protocol, label) => {
91
+ // Check if there's an active position with debt
92
+ const position = await sdk.getPosition(protocol);
93
+ if (!position || position.debt.amount === 0n) {
94
+ console.log(` [${label}] Skipped — no active debt position`);
95
+ return; // Skip gracefully
96
+ }
97
+ printPosition(label, position);
98
+ const tx = new transactions_1.Transaction();
99
+ tx.setSender(address);
100
+ await sdk.buildDeleverageTransaction(tx, { protocol });
101
+ const result = await sdk.dryRun(tx);
102
+ console.log(` [${label}] dryRun → ${result.success ? "SUCCESS" : "FAILED: " + result.error}` +
103
+ `${result.gasUsed ? ` (gas: ${(Number(result.gasUsed) / 1e9).toFixed(4)} SUI)` : ""}`);
104
+ // Build succeeded; dryRun may fail due to oracle timing or swap liquidity
105
+ (0, vitest_1.expect)(result).toBeDefined();
106
+ }, 120000);
107
+ });
108
+ // ── Tests: error cases ──────────────────────────────────────────────────────
109
+ (0, vitest_1.describe)("sdk.buildDeleverageTransaction — error cases", () => {
110
+ (0, vitest_1.it)("throws PositionNotFoundError for protocol with no position", async () => {
111
+ // Find a protocol with no active position
112
+ const positions = await sdk.getOpenPositions();
113
+ const activeProtocols = new Set(positions.map((p) => p.protocol));
114
+ const allProtocols = [
115
+ __1.LendingProtocol.Suilend,
116
+ __1.LendingProtocol.Navi,
117
+ __1.LendingProtocol.Scallop,
118
+ ];
119
+ const emptyProtocol = allProtocols.find((p) => !activeProtocols.has(p));
120
+ if (!emptyProtocol) {
121
+ console.log(" Skipped — all protocols have active positions");
122
+ return;
123
+ }
124
+ const tx = new transactions_1.Transaction();
125
+ tx.setSender(address);
126
+ await (0, vitest_1.expect)(sdk.buildDeleverageTransaction(tx, { protocol: emptyProtocol })).rejects.toThrow();
127
+ console.log(` [${emptyProtocol}] Correctly threw error for no position`);
128
+ }, 60000);
129
+ });
130
+ //# sourceMappingURL=sdk.deleverage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.deleverage.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.deleverage.test.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,mCAAyD;AACzD,+CAAiC;AACjC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAEhC,0BAAkD;AAGlD,+CAA+D;AAC/D,0DAA8D;AAC9D,2DAAuD;AAEvD,gFAAgF;AAEhF,IAAI,GAAgB,CAAC;AACrB,IAAI,OAAe,CAAC;AAEpB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAExE,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;IACnB,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,kBAAS,CAAC;QAC9B,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAA,uBAAc,EAAC,SAAS,CAAC;KAC/D,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,wBAAc,CAAC,aAAa,CAAC,UAAiB,CAAC,CAAC;IAChE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,CAAC;IAChD,GAAG,GAAG,MAAM,eAAW,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEnD,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,IAAI,CAAC,CAAC;AACxC,CAAC,EAAE,KAAM,CAAC,CAAC;AAEX,gFAAgF;AAEhF,SAAS,aAAa,CAAC,QAAgB,EAAE,QAAsB;IAC7D,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,OAAO,CAAC,GAAG,CACT,MAAM,QAAQ,iBAAiB,QAAQ,CAAC,UAAU,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC9F,YAAY,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACjE,WAAW,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CACzC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,IAAA,iBAAQ,EAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,WAAE,CAAC,IAAI,CAAC;QACN,CAAC,mBAAe,CAAC,OAAO,EAAE,SAAS,CAAC;QACpC,CAAC,mBAAe,CAAC,IAAI,EAAE,MAAM,CAAC;QAC9B,CAAC,mBAAe,CAAC,OAAO,EAAE,SAAS,CAAC;KACrC,CAAC,CACA,8DAA8D,EAC9D,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QACxB,gDAAgD;QAChD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,qCAAqC,CAAC,CAAC;YAC9D,OAAO,CAAC,kBAAkB;QAC5B,CAAC;QAED,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE/B,MAAM,EAAE,GAAG,IAAI,0BAAW,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEtB,MAAM,GAAG,CAAC,0BAA0B,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,CACT,MAAM,KAAK,cAAc,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE;YAC/E,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACxF,CAAC;QAEF,0EAA0E;QAC1E,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,EACD,MAAO,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAE/E,IAAA,iBAAQ,EAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,IAAA,WAAE,EAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,0CAA0C;QAC1C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG;YACnB,mBAAe,CAAC,OAAO;YACvB,mBAAe,CAAC,IAAI;YACpB,mBAAe,CAAC,OAAO;SACxB,CAAC;QAEF,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAExE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,0BAAW,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEtB,MAAM,IAAA,eAAM,EACV,GAAG,CAAC,0BAA0B,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAChE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAEpB,OAAO,CAAC,GAAG,CACT,MAAM,aAAa,yCAAyC,CAC7D,CAAC;IACJ,CAAC,EAAE,KAAM,CAAC,CAAC;AACb,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SDK Method: sdk.buildDeleverageTransaction() [Unit]
3
+ *
4
+ * Tests calculateDeleverageEstimate() with mocked swap quotes. No mainnet RPC.
5
+ *
6
+ * Internal dependencies (mocked):
7
+ * - ScallopFlashLoanClient.calculateFee() → flash loan fee calculation
8
+ * - swapClient.quote() → swap rate for collateral → USDC
9
+ * - getTokenPrice() → collateral price for profit calc
10
+ *
11
+ * Verified behavior:
12
+ * - Flash loan amount includes 0.1% buffer
13
+ * - Flash loan fee correctly computed
14
+ * - Swap amount covers repayment + 2% buffer
15
+ * - keepCollateral = total - swapped
16
+ * - Profit = kept collateral value + USDC surplus
17
+ *
18
+ * Run: npx vitest run src/__tests__/sdk.deleverage.unit.test.ts
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=sdk.deleverage.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.deleverage.unit.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.deleverage.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}