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,175 @@
1
+ "use strict";
2
+ /**
3
+ * SDK Method: sdk.previewLeverage() [Unit]
4
+ *
5
+ * Tests previewLeverage() with mocked dependencies. No mainnet RPC.
6
+ *
7
+ * Mocked internal dependencies:
8
+ * - protocol.getAssetRiskParams() → returns { ltv: 0.75, maxMultiplier: 4.0 }
9
+ * - protocol.getAssetApy() → returns mock supply/borrow APY
10
+ * - ScallopFlashLoanClient → returns 0% fee
11
+ * - 7k Protocol swap quote → returns mock swap output
12
+ * - getTokenPrice() → returns $3.50
13
+ *
14
+ * Integration test counterpart: sdk.preview.test.ts
15
+ *
16
+ * Run: npx vitest run src/__tests__/sdk.preview.unit.test.ts
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ const vitest_1 = require("vitest");
20
+ const leverage_preview_1 = require("../strategies/leverage-preview");
21
+ const types_1 = require("../types");
22
+ // ── Mock helpers ─────────────────────────────────────────────────────────────
23
+ function createMockDeps(overrides = {}) {
24
+ const mockProtocol = {
25
+ name: "mock",
26
+ consumesRepaymentCoin: false,
27
+ getAssetRiskParams: vitest_1.vi.fn().mockResolvedValue({
28
+ ltv: 0.75,
29
+ liquidationThreshold: 0.80,
30
+ liquidationBonus: 0.05,
31
+ maxMultiplier: 4.0,
32
+ }),
33
+ getAssetApy: vitest_1.vi.fn().mockImplementation(async (coinType) => {
34
+ if (coinType === types_1.COIN_TYPES.USDC) {
35
+ return {
36
+ supplyApy: 0.03,
37
+ rewardApy: 0,
38
+ totalSupplyApy: 0.03,
39
+ borrowApy: 0.05,
40
+ borrowRewardApy: 0.01,
41
+ };
42
+ }
43
+ return {
44
+ supplyApy: 0.02,
45
+ rewardApy: 0.01,
46
+ totalSupplyApy: 0.03,
47
+ borrowApy: 0,
48
+ borrowRewardApy: 0,
49
+ };
50
+ }),
51
+ initialize: vitest_1.vi.fn(),
52
+ getPosition: vitest_1.vi.fn(),
53
+ deposit: vitest_1.vi.fn(),
54
+ withdraw: vitest_1.vi.fn(),
55
+ borrow: vitest_1.vi.fn(),
56
+ repay: vitest_1.vi.fn(),
57
+ refreshOracles: vitest_1.vi.fn(),
58
+ getAccountPortfolio: vitest_1.vi.fn(),
59
+ };
60
+ const mockSwapClient = {
61
+ quote: vitest_1.vi.fn().mockResolvedValue([
62
+ { amountOut: "4500000000", amountIn: "100000000", route: [] }, // 4.5 SUI for $100
63
+ ]),
64
+ };
65
+ return {
66
+ protocol: mockProtocol,
67
+ swapClient: mockSwapClient,
68
+ suiClient: {},
69
+ ...overrides,
70
+ };
71
+ }
72
+ // Mock external dependencies
73
+ vitest_1.vi.mock("@7kprotocol/sdk-ts", () => ({
74
+ MetaAg: vitest_1.vi.fn(),
75
+ getTokenPrice: vitest_1.vi.fn().mockResolvedValue(3.5), // SUI at $3.50
76
+ }));
77
+ vitest_1.vi.mock("../protocols/scallop/flash-loan", () => ({
78
+ ScallopFlashLoanClient: {
79
+ fetchFlashLoanFeeRate: vitest_1.vi.fn().mockResolvedValue(0), // 0% flash loan fee
80
+ calculateFee: vitest_1.vi.fn().mockReturnValue(0n),
81
+ },
82
+ }));
83
+ vitest_1.vi.mock("../utils/coin", async (importOriginal) => {
84
+ const actual = await importOriginal();
85
+ return {
86
+ ...actual,
87
+ getDecimals: vitest_1.vi.fn().mockReturnValue(9),
88
+ };
89
+ });
90
+ // ── Tests ────────────────────────────────────────────────────────────────────
91
+ (0, vitest_1.describe)("previewLeverage (unit)", () => {
92
+ (0, vitest_1.it)("calculates correct position metrics for 2x leverage", async () => {
93
+ const deps = createMockDeps();
94
+ const result = await (0, leverage_preview_1.previewLeverage)({
95
+ coinType: types_1.COIN_TYPES.SUI,
96
+ depositValueUsd: 100,
97
+ multiplier: 2.0,
98
+ }, deps);
99
+ // Basic sanity
100
+ (0, vitest_1.expect)(result.initialEquityUsd).toBeGreaterThan(0);
101
+ (0, vitest_1.expect)(result.totalPositionUsd).toBeCloseTo(result.initialEquityUsd * 2.0, 0);
102
+ (0, vitest_1.expect)(result.debtUsd).toBeGreaterThan(0);
103
+ (0, vitest_1.expect)(result.flashLoanUsdc).toBeGreaterThan(0n);
104
+ // Risk params from mock
105
+ (0, vitest_1.expect)(result.assetLtv).toBe(0.75);
106
+ (0, vitest_1.expect)(result.maxMultiplier).toBe(4.0);
107
+ (0, vitest_1.expect)(result.liquidationThreshold).toBe(0.80);
108
+ // LTV should be reasonable
109
+ (0, vitest_1.expect)(result.ltvPercent).toBeGreaterThan(0);
110
+ (0, vitest_1.expect)(result.ltvPercent).toBeLessThan(100);
111
+ // Liquidation price should be positive and below current price
112
+ (0, vitest_1.expect)(result.liquidationPrice).toBeGreaterThan(0);
113
+ (0, vitest_1.expect)(result.priceDropBuffer).toBeGreaterThan(0);
114
+ });
115
+ (0, vitest_1.it)("flash loan amount scales with multiplier", async () => {
116
+ const deps = createMockDeps();
117
+ const preview2x = await (0, leverage_preview_1.previewLeverage)({ coinType: types_1.COIN_TYPES.SUI, depositValueUsd: 100, multiplier: 2.0 }, deps);
118
+ const preview3x = await (0, leverage_preview_1.previewLeverage)({ coinType: types_1.COIN_TYPES.SUI, depositValueUsd: 100, multiplier: 3.0 }, deps);
119
+ // 3x needs 2x the flash loan of 2x (since flashLoanUsd = equity * (mult - 1))
120
+ const flashLoan2x = Number(preview2x.flashLoanUsdc);
121
+ const flashLoan3x = Number(preview3x.flashLoanUsdc);
122
+ (0, vitest_1.expect)(flashLoan3x / flashLoan2x).toBeCloseTo(2.0, 1);
123
+ });
124
+ (0, vitest_1.it)("APY breakdown is computed correctly", async () => {
125
+ const deps = createMockDeps();
126
+ const result = await (0, leverage_preview_1.previewLeverage)({ coinType: types_1.COIN_TYPES.SUI, depositValueUsd: 100, multiplier: 2.0 }, deps);
127
+ // Supply APY from mock
128
+ (0, vitest_1.expect)(result.supplyApyBreakdown.base).toBe(0.02);
129
+ (0, vitest_1.expect)(result.supplyApyBreakdown.reward).toBe(0.01);
130
+ (0, vitest_1.expect)(result.supplyApyBreakdown.total).toBe(0.03);
131
+ // Borrow APY from mock
132
+ (0, vitest_1.expect)(result.borrowApyBreakdown.net).toBe(0.05);
133
+ (0, vitest_1.expect)(result.borrowApyBreakdown.rebate).toBe(0.01);
134
+ // Net APY = (position * supplyApy - debt * borrowApy) / equity
135
+ const expectedNetApy = (result.totalPositionUsd * result.supplyApyBreakdown.total -
136
+ result.debtUsd * result.borrowApyBreakdown.net) /
137
+ result.initialEquityUsd;
138
+ (0, vitest_1.expect)(result.netApy).toBeCloseTo(expectedNetApy, 5);
139
+ });
140
+ (0, vitest_1.it)("throws on multiplier exceeding max", async () => {
141
+ const deps = createMockDeps();
142
+ await (0, vitest_1.expect)((0, leverage_preview_1.previewLeverage)({ coinType: types_1.COIN_TYPES.SUI, depositValueUsd: 100, multiplier: 5.0 }, deps)).rejects.toThrow("exceeds protocol max");
143
+ });
144
+ (0, vitest_1.it)("throws if neither depositAmount nor depositValueUsd provided", async () => {
145
+ const deps = createMockDeps();
146
+ await (0, vitest_1.expect)((0, leverage_preview_1.previewLeverage)({ coinType: types_1.COIN_TYPES.SUI, multiplier: 2.0 }, deps)).rejects.toThrow("Either depositAmount or depositValueUsd");
147
+ });
148
+ (0, vitest_1.it)("throws if both depositAmount and depositValueUsd provided", async () => {
149
+ const deps = createMockDeps();
150
+ await (0, vitest_1.expect)((0, leverage_preview_1.previewLeverage)({
151
+ coinType: types_1.COIN_TYPES.SUI,
152
+ depositAmount: "10",
153
+ depositValueUsd: 100,
154
+ multiplier: 2.0,
155
+ }, deps)).rejects.toThrow("Cannot provide both");
156
+ });
157
+ (0, vitest_1.it)("throws on swap quote failure", async () => {
158
+ const deps = createMockDeps({
159
+ swapClient: {
160
+ quote: vitest_1.vi.fn().mockRejectedValue(new Error("Quote failed")),
161
+ },
162
+ });
163
+ await (0, vitest_1.expect)((0, leverage_preview_1.previewLeverage)({ coinType: types_1.COIN_TYPES.SUI, depositValueUsd: 100, multiplier: 2.0 }, deps)).rejects.toThrow("Quote failed");
164
+ });
165
+ (0, vitest_1.it)("calculates swap slippage from quote", async () => {
166
+ // Mock a swap that returns slightly less than theoretical (0.5% slippage)
167
+ const deps = createMockDeps();
168
+ const result = await (0, leverage_preview_1.previewLeverage)({ coinType: types_1.COIN_TYPES.SUI, depositValueUsd: 100, multiplier: 2.0 }, deps);
169
+ // With the mock returning 4.5 SUI, slippage should be calculable
170
+ (0, vitest_1.expect)(result.swapSlippagePct).toBeGreaterThanOrEqual(0);
171
+ // effectiveMultiplier should differ from requested due to slippage
172
+ (0, vitest_1.expect)(result.effectiveMultiplier).toBeGreaterThan(1);
173
+ });
174
+ });
175
+ //# sourceMappingURL=sdk.preview.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.preview.unit.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.preview.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for normalizeCoinType utility function
3
+ *
4
+ * Migrated from scripts/tests/test_normalize_coin_type.ts
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=utils.normalizeCoinType.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.normalizeCoinType.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/utils.normalizeCoinType.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Unit tests for normalizeCoinType utility function
4
+ *
5
+ * Migrated from scripts/tests/test_normalize_coin_type.ts
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const vitest_1 = require("vitest");
9
+ const coin_1 = require("../utils/coin");
10
+ const errors_1 = require("../utils/errors");
11
+ const constants_1 = require("../types/constants");
12
+ (0, vitest_1.describe)("normalizeCoinType", () => {
13
+ (0, vitest_1.it)("pads short SUI address to 64 chars", () => {
14
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)("0x2::sui::SUI")).toBe("0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI");
15
+ });
16
+ (0, vitest_1.it)("keeps full SUI address unchanged", () => {
17
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)(constants_1.COIN_TYPES.SUI)).toBe(constants_1.COIN_TYPES.SUI);
18
+ });
19
+ (0, vitest_1.it)("keeps full LBTC address unchanged", () => {
20
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)(constants_1.COIN_TYPES.LBTC)).toBe(constants_1.COIN_TYPES.LBTC);
21
+ });
22
+ (0, vitest_1.it)("keeps already-normalized LBTC unchanged", () => {
23
+ const normalized = "0x3e8e9423d80e1774a7ca128fccd8bf5f1f7753be658c5e645929037f7c819040::lbtc::LBTC";
24
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)(normalized)).toBe(normalized);
25
+ });
26
+ (0, vitest_1.it)("keeps full XBTC address unchanged", () => {
27
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)(constants_1.COIN_TYPES.XBTC)).toBe(constants_1.COIN_TYPES.XBTC);
28
+ });
29
+ (0, vitest_1.it)("keeps full USDC address unchanged", () => {
30
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)(constants_1.COIN_TYPES.USDC)).toBe(constants_1.COIN_TYPES.USDC);
31
+ });
32
+ (0, vitest_1.it)("keeps full ETH address unchanged", () => {
33
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)(constants_1.COIN_TYPES.ETH)).toBe(constants_1.COIN_TYPES.ETH);
34
+ });
35
+ (0, vitest_1.it)("throws InvalidCoinTypeError on invalid format", () => {
36
+ (0, vitest_1.expect)(() => (0, coin_1.normalizeCoinType)("invalid")).toThrow(errors_1.InvalidCoinTypeError);
37
+ });
38
+ (0, vitest_1.it)("pads short hex address", () => {
39
+ (0, vitest_1.expect)((0, coin_1.normalizeCoinType)("0xabc::module::Type")).toBe("0x0000000000000000000000000000000000000000000000000000000000000abc::module::Type");
40
+ });
41
+ });
42
+ //# sourceMappingURL=utils.normalizeCoinType.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.normalizeCoinType.test.js","sourceRoot":"","sources":["../../src/__tests__/utils.normalizeCoinType.test.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAEH,mCAA8C;AAC9C,wCAAkD;AAClD,4CAAuD;AACvD,kDAAgD;AAEhD,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAC7C,8EAA8E,CAC/E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,sBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAU,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,sBAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAU,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,UAAU,GACd,gFAAgF,CAAC;QACnF,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,sBAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAU,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,sBAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAU,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,sBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAU,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,wBAAiB,EAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,6BAAoB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,IAAA,eAAM,EAAC,IAAA,wBAAiB,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CACnD,kFAAkF,CACnF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -10,23 +10,31 @@
10
10
  * ```typescript
11
11
  * import { DefiDashSDK, LendingProtocol } from 'defi-dash-sdk';
12
12
  *
13
- * const sdk = new DefiDashSDK();
14
- * await sdk.initialize(suiClient, keypair);
13
+ * const sdk = await DefiDashSDK.create(suiClient, keypair);
15
14
  *
16
- * // Leverage strategy
17
- * const result = await sdk.leverage({
15
+ * // Build leverage transaction
16
+ * const tx = new Transaction();
17
+ * tx.setSender(address);
18
+ * await sdk.buildLeverageTransaction(tx, {
18
19
  * protocol: LendingProtocol.Suilend,
19
20
  * depositAsset: 'LBTC',
20
21
  * depositAmount: '0.001',
21
22
  * multiplier: 2.0,
22
- * dryRun: true
23
23
  * });
24
+ *
25
+ * // Node.js: execute via SDK
26
+ * const result = await sdk.execute(tx);
27
+ *
28
+ * // Browser: execute via wallet adapter
29
+ * await signAndExecute({ transaction: tx });
24
30
  * ```
25
31
  */
26
- export { DefiDashSDK } from "./sdk";
27
- export { LendingProtocol, type PositionSide, type AssetPosition, type PositionInfo, type Position, type AccountPortfolio, type MarketAsset, type LeverageParams, type DeleverageParams, type StrategyResult, type LeveragePreview, type SDKOptions, type BrowserLeverageParams, type BrowserDeleverageParams, type ILendingProtocol, type MarketReserve, USDC_COIN_TYPE, SUI_COIN_TYPE, DEFAULT_7K_PARTNER, COIN_TYPES, } from "./types";
28
- export { buildLeverageTransaction, calculateLeveragePreview, buildDeleverageTransaction, calculateDeleverageEstimate, } from "./strategies";
29
- export * from "./utils";
30
- export { ScallopFlashLoanClient } from "./protocols/scallop/flash-loan";
31
- export { SUILEND_RESERVES, getReserveByCoinType, getReserveBySymbol, } from "./protocols/suilend/constants";
32
+ export { DefiDashSDK } from './sdk';
33
+ export { LendingProtocol, USDC_COIN_TYPE, SUI_COIN_TYPE, COIN_TYPES, } from './types';
34
+ export type { StrategyResult, LeveragePreview, FindBestRouteParams, LeverageRoute, LeverageRouteResult, } from './types';
35
+ export type { AssetPosition, PositionInfo, Position, AccountPortfolio, MarketAsset, } from './types';
36
+ export type { SDKOptions, BrowserLeverageParams, BrowserDeleverageParams, } from './types';
37
+ export { formatUnits, parseUnits } from './utils/format';
38
+ export { normalizeCoinType } from './utils/coin';
39
+ export { DefiDashError, SDKNotInitializedError, InvalidParameterError, InvalidCoinTypeError, } from './utils/errors';
32
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGpC,OAAO,EAEL,eAAe,EACf,KAAK,YAAY,EAGjB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAGhB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EAGpB,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAG5B,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAGlB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAGtB,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGpC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,UAAU,EACV,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -11,61 +11,45 @@
11
11
  * ```typescript
12
12
  * import { DefiDashSDK, LendingProtocol } from 'defi-dash-sdk';
13
13
  *
14
- * const sdk = new DefiDashSDK();
15
- * await sdk.initialize(suiClient, keypair);
14
+ * const sdk = await DefiDashSDK.create(suiClient, keypair);
16
15
  *
17
- * // Leverage strategy
18
- * const result = await sdk.leverage({
16
+ * // Build leverage transaction
17
+ * const tx = new Transaction();
18
+ * tx.setSender(address);
19
+ * await sdk.buildLeverageTransaction(tx, {
19
20
  * protocol: LendingProtocol.Suilend,
20
21
  * depositAsset: 'LBTC',
21
22
  * depositAmount: '0.001',
22
23
  * multiplier: 2.0,
23
- * dryRun: true
24
24
  * });
25
+ *
26
+ * // Node.js: execute via SDK
27
+ * const result = await sdk.execute(tx);
28
+ *
29
+ * // Browser: execute via wallet adapter
30
+ * await signAndExecute({ transaction: tx });
25
31
  * ```
26
32
  */
27
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
28
- if (k2 === undefined) k2 = k;
29
- var desc = Object.getOwnPropertyDescriptor(m, k);
30
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
31
- desc = { enumerable: true, get: function() { return m[k]; } };
32
- }
33
- Object.defineProperty(o, k2, desc);
34
- }) : (function(o, m, k, k2) {
35
- if (k2 === undefined) k2 = k;
36
- o[k2] = m[k];
37
- }));
38
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
39
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
40
- };
41
33
  Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.getReserveBySymbol = exports.getReserveByCoinType = exports.SUILEND_RESERVES = exports.ScallopFlashLoanClient = exports.calculateDeleverageEstimate = exports.buildDeleverageTransaction = exports.calculateLeveragePreview = exports.buildLeverageTransaction = exports.COIN_TYPES = exports.DEFAULT_7K_PARTNER = exports.SUI_COIN_TYPE = exports.USDC_COIN_TYPE = exports.LendingProtocol = exports.DefiDashSDK = void 0;
34
+ exports.InvalidCoinTypeError = exports.InvalidParameterError = exports.SDKNotInitializedError = exports.DefiDashError = exports.normalizeCoinType = exports.parseUnits = exports.formatUnits = exports.COIN_TYPES = exports.SUI_COIN_TYPE = exports.USDC_COIN_TYPE = exports.LendingProtocol = exports.DefiDashSDK = void 0;
43
35
  // Main SDK
44
36
  var sdk_1 = require("./sdk");
45
37
  Object.defineProperty(exports, "DefiDashSDK", { enumerable: true, get: function () { return sdk_1.DefiDashSDK; } });
46
- // Types, Interfaces, Enums, and Constants
38
+ // Enums & Constants
47
39
  var types_1 = require("./types");
48
- // Enums
49
40
  Object.defineProperty(exports, "LendingProtocol", { enumerable: true, get: function () { return types_1.LendingProtocol; } });
50
- // Constants
51
41
  Object.defineProperty(exports, "USDC_COIN_TYPE", { enumerable: true, get: function () { return types_1.USDC_COIN_TYPE; } });
52
42
  Object.defineProperty(exports, "SUI_COIN_TYPE", { enumerable: true, get: function () { return types_1.SUI_COIN_TYPE; } });
53
- Object.defineProperty(exports, "DEFAULT_7K_PARTNER", { enumerable: true, get: function () { return types_1.DEFAULT_7K_PARTNER; } });
54
43
  Object.defineProperty(exports, "COIN_TYPES", { enumerable: true, get: function () { return types_1.COIN_TYPES; } });
55
- // Strategy Builders (for advanced usage)
56
- var strategies_1 = require("./strategies");
57
- Object.defineProperty(exports, "buildLeverageTransaction", { enumerable: true, get: function () { return strategies_1.buildLeverageTransaction; } });
58
- Object.defineProperty(exports, "calculateLeveragePreview", { enumerable: true, get: function () { return strategies_1.calculateLeveragePreview; } });
59
- Object.defineProperty(exports, "buildDeleverageTransaction", { enumerable: true, get: function () { return strategies_1.buildDeleverageTransaction; } });
60
- Object.defineProperty(exports, "calculateDeleverageEstimate", { enumerable: true, get: function () { return strategies_1.calculateDeleverageEstimate; } });
61
- // Utilities
62
- __exportStar(require("./utils"), exports);
63
- // Flash Loan
64
- var flash_loan_1 = require("./protocols/scallop/flash-loan");
65
- Object.defineProperty(exports, "ScallopFlashLoanClient", { enumerable: true, get: function () { return flash_loan_1.ScallopFlashLoanClient; } });
66
- // Protocol-specific data
67
- var constants_1 = require("./protocols/suilend/constants");
68
- Object.defineProperty(exports, "SUILEND_RESERVES", { enumerable: true, get: function () { return constants_1.SUILEND_RESERVES; } });
69
- Object.defineProperty(exports, "getReserveByCoinType", { enumerable: true, get: function () { return constants_1.getReserveByCoinType; } });
70
- Object.defineProperty(exports, "getReserveBySymbol", { enumerable: true, get: function () { return constants_1.getReserveBySymbol; } });
44
+ // Utilities (frontend-facing only)
45
+ var format_1 = require("./utils/format");
46
+ Object.defineProperty(exports, "formatUnits", { enumerable: true, get: function () { return format_1.formatUnits; } });
47
+ Object.defineProperty(exports, "parseUnits", { enumerable: true, get: function () { return format_1.parseUnits; } });
48
+ var coin_1 = require("./utils/coin");
49
+ Object.defineProperty(exports, "normalizeCoinType", { enumerable: true, get: function () { return coin_1.normalizeCoinType; } });
50
+ var errors_1 = require("./utils/errors");
51
+ Object.defineProperty(exports, "DefiDashError", { enumerable: true, get: function () { return errors_1.DefiDashError; } });
52
+ Object.defineProperty(exports, "SDKNotInitializedError", { enumerable: true, get: function () { return errors_1.SDKNotInitializedError; } });
53
+ Object.defineProperty(exports, "InvalidParameterError", { enumerable: true, get: function () { return errors_1.InvalidParameterError; } });
54
+ Object.defineProperty(exports, "InvalidCoinTypeError", { enumerable: true, get: function () { return errors_1.InvalidCoinTypeError; } });
71
55
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;;;;;;;;;;;;;;;;AAEH,WAAW;AACX,6BAAoC;AAA3B,kGAAA,WAAW,OAAA;AAEpB,0CAA0C;AAC1C,iCAgCiB;AA/Bf,QAAQ;AACR,wGAAA,eAAe,OAAA;AAyBf,YAAY;AACZ,uGAAA,cAAc,OAAA;AACd,sGAAA,aAAa,OAAA;AACb,2GAAA,kBAAkB,OAAA;AAClB,mGAAA,UAAU,OAAA;AAGZ,yCAAyC;AACzC,2CAKsB;AAJpB,sHAAA,wBAAwB,OAAA;AACxB,sHAAA,wBAAwB,OAAA;AACxB,wHAAA,0BAA0B,OAAA;AAC1B,yHAAA,2BAA2B,OAAA;AAG7B,YAAY;AACZ,0CAAwB;AAExB,aAAa;AACb,6DAAwE;AAA/D,oHAAA,sBAAsB,OAAA;AAE/B,yBAAyB;AACzB,2DAIuC;AAHrC,6GAAA,gBAAgB,OAAA;AAChB,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;;AAEH,WAAW;AACX,6BAAoC;AAA3B,kGAAA,WAAW,OAAA;AAEpB,oBAAoB;AACpB,iCAKiB;AAJf,wGAAA,eAAe,OAAA;AACf,uGAAA,cAAc,OAAA;AACd,sGAAA,aAAa,OAAA;AACb,mGAAA,UAAU,OAAA;AA4BZ,mCAAmC;AACnC,yCAAyD;AAAhD,qGAAA,WAAW,OAAA;AAAE,oGAAA,UAAU,OAAA;AAChC,qCAAiD;AAAxC,yGAAA,iBAAiB,OAAA;AAC1B,yCAKwB;AAJtB,uGAAA,aAAa,OAAA;AACb,gHAAA,sBAAsB,OAAA;AACtB,+GAAA,qBAAqB,OAAA;AACrB,8GAAA,oBAAoB,OAAA"}
@@ -1,105 +1,72 @@
1
1
  /**
2
2
  * Base Protocol Adapter
3
3
  *
4
- * Abstract base class providing common functionality for all protocol adapters.
5
- * Reduces code duplication and ensures consistent implementation patterns.
4
+ * Abstract base class for all lending protocol adapters.
5
+ * Implements ILendingProtocol to enforce compile-time method checks.
6
+ *
7
+ * Any class extending this MUST implement all abstract methods,
8
+ * otherwise TypeScript will produce a build error:
9
+ * "Non-abstract class 'XxxAdapter' does not implement inherited abstract member 'methodName'"
10
+ *
11
+ * This is the TypeScript equivalent of Go's interface compliance pattern:
12
+ * var _ ILendingProtocol = (*MyAdapter)(nil)
6
13
  */
7
14
  import { SuiClient } from "@mysten/sui/client";
8
- import { ILendingProtocol } from "../types";
15
+ import { Transaction } from "@mysten/sui/transactions";
16
+ import { ILendingProtocol, PositionInfo, AssetRiskParams, AssetApy, AccountPortfolio } from "../types";
9
17
  /**
10
- * Abstract base class for protocol adapters
18
+ * Abstract base class for protocol adapters.
11
19
  *
12
- * Provides common functionality that all protocol adapters need:
13
- * - SuiClient management
14
- * - Coin type normalization
15
- * - Initialization tracking
20
+ * Provides common utilities (SuiClient management, coin normalization).
21
+ * All ILendingProtocol methods are declared abstract — subclasses MUST implement them.
16
22
  *
17
23
  * @example
18
24
  * ```typescript
19
- * class MyProtocolAdapter extends BaseProtocolAdapter {
20
- * readonly name = "MyProtocol";
25
+ * export class NewProtocolAdapter extends BaseProtocolAdapter {
26
+ * readonly name = "new-protocol";
21
27
  * readonly consumesRepaymentCoin = false;
22
28
  *
23
- * async initialize(client: SuiClient): Promise<void> {
24
- * await super.initialize(client);
25
- * // Protocol-specific initialization
29
+ * async initialize(suiClient: SuiClient): Promise<void> {
30
+ * await super.initialize(suiClient);
31
+ * // protocol-specific init
26
32
  * }
27
33
  *
28
- * async getPosition(address: string): Promise<PositionInfo | null> {
29
- * this.ensureInitialized();
30
- * // Implementation
31
- * }
34
+ * // All abstract methods must be implemented:
35
+ * async getPosition(userAddress: string) { ... }
36
+ * async deposit(tx, coin, coinType, userAddress) { ... }
37
+ * async withdraw(tx, coinType, amount, userAddress) { ... }
38
+ * async borrow(tx, coinType, amount, userAddress) { ... }
39
+ * async repay(tx, coinType, coin, userAddress) { ... }
40
+ * async refreshOracles(tx, coinTypes, userAddress) { ... }
41
+ * async getAccountPortfolio(address) { ... }
42
+ * async getAssetRiskParams(coinType) { ... }
43
+ * async getAssetApy(coinType) { ... }
32
44
  * }
33
45
  * ```
34
46
  */
35
- export declare abstract class BaseProtocolAdapter implements Partial<ILendingProtocol> {
36
- /**
37
- * Sui client instance
38
- * Available after initialization
39
- */
47
+ export declare abstract class BaseProtocolAdapter implements ILendingProtocol {
40
48
  protected suiClient: SuiClient;
41
- /**
42
- * Initialization status
43
- */
44
49
  protected initialized: boolean;
45
- /**
46
- * Protocol name (must be implemented by subclass)
47
- */
48
50
  abstract readonly name: string;
49
- /**
50
- * Whether protocol consumes repayment coin entirely
51
- * (must be implemented by subclass)
52
- */
53
51
  abstract readonly consumesRepaymentCoin: boolean;
54
- /**
55
- * Initialize the protocol adapter
56
- *
57
- * @param suiClient - Sui blockchain client
58
- */
52
+ abstract getPosition(userAddress: string): Promise<PositionInfo | null>;
53
+ abstract deposit(tx: Transaction, coin: any, coinType: string, userAddress: string): Promise<void>;
54
+ abstract withdraw(tx: Transaction, coinType: string, amount: string, userAddress: string): Promise<any>;
55
+ abstract borrow(tx: Transaction, coinType: string, amount: string, userAddress: string, skipOracle?: boolean): Promise<any>;
56
+ abstract repay(tx: Transaction, coinType: string, coin: any, userAddress: string): Promise<void>;
57
+ abstract refreshOracles(tx: Transaction, coinTypes: string[], userAddress: string): Promise<void>;
58
+ abstract getAccountPortfolio(address: string): Promise<AccountPortfolio>;
59
+ abstract getAssetRiskParams(coinType: string): Promise<AssetRiskParams>;
60
+ abstract getAssetApy(coinType: string): Promise<AssetApy>;
59
61
  initialize(suiClient: SuiClient): Promise<void>;
60
62
  /**
61
- * Ensure adapter is initialized before use
62
- *
63
- * @throws Error if not initialized
63
+ * Optional: clear pending state between transactions.
64
+ * Override in subclass if needed (e.g., Scallop obligation tracking).
64
65
  */
66
+ clearPendingState(): void;
65
67
  protected ensureInitialized(): void;
66
- /**
67
- * Normalize coin type to standard format
68
- *
69
- * Utility method for consistent coin type handling.
70
- *
71
- * @param coinType - Raw coin type string
72
- * @returns Normalized coin type with padded address
73
- *
74
- * @example
75
- * ```typescript
76
- * const normalized = this.normalizeCoin("0x2::sui::SUI");
77
- * // "0x0000...0002::sui::SUI"
78
- * ```
79
- */
80
68
  protected normalizeCoin(coinType: string): string;
81
- /**
82
- * Get object by ID with error handling
83
- *
84
- * @param objectId - Object ID to fetch
85
- * @returns Object data or null if not found
86
- */
87
- protected getObject(objectId: string): Promise<any>;
88
- /**
89
- * Format amount from raw units to human-readable
90
- *
91
- * @param amount - Raw amount (bigint)
92
- * @param decimals - Token decimals
93
- * @returns Human-readable number
94
- */
95
69
  protected formatAmount(amount: bigint, decimals: number): number;
96
- /**
97
- * Parse amount from human-readable to raw units
98
- *
99
- * @param amount - Human-readable amount (number or string)
100
- * @param decimals - Token decimals
101
- * @returns Raw amount as bigint
102
- */
103
70
  protected parseAmount(amount: number | string, decimals: number): bigint;
104
71
  }
105
72
  //# sourceMappingURL=base-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../src/protocols/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,8BAAsB,mBAAoB,YAAW,OAAO,CAAC,gBAAgB,CAAC;IAC5E;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAG,SAAS,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,WAAW,UAAS;IAE9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IAEjD;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD;;;;OAIG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;IAMnC;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIjD;;;;;OAKG;cACa,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAgBzD;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIhE;;;;;;OAMG;IACH,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAIzE"}
1
+ {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../src/protocols/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAGlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,8BAAsB,mBAAoB,YAAW,gBAAgB;IACnE,SAAS,CAAC,SAAS,EAAG,SAAS,CAAC;IAChC,SAAS,CAAC,WAAW,UAAS;IAI9B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IAIjD,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAEvE,QAAQ,CAAC,OAAO,CACd,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,QAAQ,CACf,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC;IAEf,QAAQ,CAAC,MAAM,CACb,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,GAAG,CAAC;IAEf,QAAQ,CAAC,KAAK,CACZ,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,cAAc,CACrB,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAExE,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAEvE,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAInD,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAMzB,SAAS,CAAC,iBAAiB,IAAI,IAAI;IAMnC,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIjD,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIhE,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAIzE"}