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.
- package/LICENSE +7 -0
- package/README.md +199 -97
- package/dist/__tests__/deleverageEstimate.unit.test.d.ts +10 -0
- package/dist/__tests__/deleverageEstimate.unit.test.d.ts.map +1 -0
- package/dist/__tests__/deleverageEstimate.unit.test.js +116 -0
- package/dist/__tests__/deleverageEstimate.unit.test.js.map +1 -0
- package/dist/__tests__/findBestLeverageRoute.test.d.ts +12 -0
- package/dist/__tests__/findBestLeverageRoute.test.d.ts.map +1 -0
- package/dist/__tests__/findBestLeverageRoute.test.js +177 -0
- package/dist/__tests__/findBestLeverageRoute.test.js.map +1 -0
- package/dist/__tests__/getAssetApy.test.d.ts +2 -0
- package/dist/__tests__/getAssetApy.test.d.ts.map +1 -0
- package/dist/__tests__/getAssetApy.test.js +133 -0
- package/dist/__tests__/getAssetApy.test.js.map +1 -0
- package/dist/__tests__/getAssetRiskParams.test.d.ts +11 -0
- package/dist/__tests__/getAssetRiskParams.test.d.ts.map +1 -0
- package/dist/__tests__/getAssetRiskParams.test.js +183 -0
- package/dist/__tests__/getAssetRiskParams.test.js.map +1 -0
- package/dist/__tests__/internal.getAssetApy.test.d.ts +2 -0
- package/dist/__tests__/internal.getAssetApy.test.d.ts.map +1 -0
- package/dist/__tests__/internal.getAssetApy.test.js +140 -0
- package/dist/__tests__/internal.getAssetApy.test.js.map +1 -0
- package/dist/__tests__/internal.getAssetRiskParams.test.d.ts +22 -0
- package/dist/__tests__/internal.getAssetRiskParams.test.d.ts.map +1 -0
- package/dist/__tests__/internal.getAssetRiskParams.test.js +194 -0
- package/dist/__tests__/internal.getAssetRiskParams.test.js.map +1 -0
- package/dist/__tests__/internal.getPosition.test.d.ts +22 -0
- package/dist/__tests__/internal.getPosition.test.d.ts.map +1 -0
- package/dist/__tests__/internal.getPosition.test.js +153 -0
- package/dist/__tests__/internal.getPosition.test.js.map +1 -0
- package/dist/__tests__/leveragePreview.unit.test.d.ts +10 -0
- package/dist/__tests__/leveragePreview.unit.test.d.ts.map +1 -0
- package/dist/__tests__/leveragePreview.unit.test.js +168 -0
- package/dist/__tests__/leveragePreview.unit.test.js.map +1 -0
- package/dist/__tests__/leverageRoute.unit.test.d.ts +10 -0
- package/dist/__tests__/leverageRoute.unit.test.d.ts.map +1 -0
- package/dist/__tests__/leverageRoute.unit.test.js +159 -0
- package/dist/__tests__/leverageRoute.unit.test.js.map +1 -0
- package/dist/__tests__/previewLeverage.test.d.ts +13 -0
- package/dist/__tests__/previewLeverage.test.d.ts.map +1 -0
- package/dist/__tests__/previewLeverage.test.js +217 -0
- package/dist/__tests__/previewLeverage.test.js.map +1 -0
- package/dist/__tests__/sdk.bestRoute.test.d.ts +22 -0
- package/dist/__tests__/sdk.bestRoute.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.bestRoute.test.js +186 -0
- package/dist/__tests__/sdk.bestRoute.test.js.map +1 -0
- package/dist/__tests__/sdk.bestRoute.unit.test.d.ts +16 -0
- package/dist/__tests__/sdk.bestRoute.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.bestRoute.unit.test.js +165 -0
- package/dist/__tests__/sdk.bestRoute.unit.test.js.map +1 -0
- package/dist/__tests__/sdk.deleverage.test.d.ts +21 -0
- package/dist/__tests__/sdk.deleverage.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.deleverage.test.js +130 -0
- package/dist/__tests__/sdk.deleverage.test.js.map +1 -0
- package/dist/__tests__/sdk.deleverage.unit.test.d.ts +21 -0
- package/dist/__tests__/sdk.deleverage.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.deleverage.unit.test.js +141 -0
- package/dist/__tests__/sdk.deleverage.unit.test.js.map +1 -0
- package/dist/__tests__/sdk.leverage.test.d.ts +19 -0
- package/dist/__tests__/sdk.leverage.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.leverage.test.js +188 -0
- package/dist/__tests__/sdk.leverage.test.js.map +1 -0
- package/dist/__tests__/sdk.portfolio.test.d.ts +17 -0
- package/dist/__tests__/sdk.portfolio.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.portfolio.test.js +162 -0
- package/dist/__tests__/sdk.portfolio.test.js.map +1 -0
- package/dist/__tests__/sdk.position.test.d.ts +16 -0
- package/dist/__tests__/sdk.position.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.position.test.js +193 -0
- package/dist/__tests__/sdk.position.test.js.map +1 -0
- package/dist/__tests__/sdk.preview.test.d.ts +23 -0
- package/dist/__tests__/sdk.preview.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.preview.test.js +226 -0
- package/dist/__tests__/sdk.preview.test.js.map +1 -0
- package/dist/__tests__/sdk.preview.unit.test.d.ts +18 -0
- package/dist/__tests__/sdk.preview.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.preview.unit.test.js +175 -0
- package/dist/__tests__/sdk.preview.unit.test.js.map +1 -0
- package/dist/__tests__/utils.normalizeCoinType.test.d.ts +7 -0
- package/dist/__tests__/utils.normalizeCoinType.test.d.ts.map +1 -0
- package/dist/__tests__/utils.normalizeCoinType.test.js +42 -0
- package/dist/__tests__/utils.normalizeCoinType.test.js.map +1 -0
- package/dist/index.d.ts +19 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -40
- package/dist/index.js.map +1 -1
- package/dist/protocols/base-adapter.d.ts +42 -75
- package/dist/protocols/base-adapter.d.ts.map +1 -1
- package/dist/protocols/base-adapter.js +34 -77
- package/dist/protocols/base-adapter.js.map +1 -1
- package/dist/protocols/navi/adapter.d.ts +22 -2
- package/dist/protocols/navi/adapter.d.ts.map +1 -1
- package/dist/protocols/navi/adapter.js +145 -11
- package/dist/protocols/navi/adapter.js.map +1 -1
- package/dist/protocols/scallop/adapter.d.ts +26 -6
- package/dist/protocols/scallop/adapter.d.ts.map +1 -1
- package/dist/protocols/scallop/adapter.js +206 -43
- package/dist/protocols/scallop/adapter.js.map +1 -1
- package/dist/protocols/scallop/flash-loan.d.ts +18 -3
- package/dist/protocols/scallop/flash-loan.d.ts.map +1 -1
- package/dist/protocols/scallop/flash-loan.js +79 -20
- package/dist/protocols/scallop/flash-loan.js.map +1 -1
- package/dist/protocols/scallop/types.d.ts.map +1 -1
- package/dist/protocols/scallop/types.js +4 -1
- package/dist/protocols/scallop/types.js.map +1 -1
- package/dist/protocols/suilend/adapter.d.ts +19 -1
- package/dist/protocols/suilend/adapter.d.ts.map +1 -1
- package/dist/protocols/suilend/adapter.js +196 -51
- package/dist/protocols/suilend/adapter.js.map +1 -1
- package/dist/sdk.d.ts +107 -148
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +171 -523
- package/dist/sdk.js.map +1 -1
- package/dist/strategies/common.d.ts +42 -0
- package/dist/strategies/common.d.ts.map +1 -0
- package/dist/strategies/common.js +81 -0
- package/dist/strategies/common.js.map +1 -0
- package/dist/strategies/deleverage.d.ts.map +1 -1
- package/dist/strategies/deleverage.js +44 -62
- package/dist/strategies/deleverage.js.map +1 -1
- package/dist/strategies/index.d.ts +9 -1
- package/dist/strategies/index.d.ts.map +1 -1
- package/dist/strategies/index.js +11 -2
- package/dist/strategies/index.js.map +1 -1
- package/dist/strategies/leverage-preview.d.ts +27 -0
- package/dist/strategies/leverage-preview.d.ts.map +1 -0
- package/dist/strategies/leverage-preview.js +120 -0
- package/dist/strategies/leverage-preview.js.map +1 -0
- package/dist/strategies/leverage-route.d.ts +29 -0
- package/dist/strategies/leverage-route.d.ts.map +1 -0
- package/dist/strategies/leverage-route.js +112 -0
- package/dist/strategies/leverage-route.js.map +1 -0
- package/dist/strategies/leverage.d.ts +4 -44
- package/dist/strategies/leverage.d.ts.map +1 -1
- package/dist/strategies/leverage.js +43 -112
- package/dist/strategies/leverage.js.map +1 -1
- package/dist/strategies/scallop-leverage.d.ts +34 -0
- package/dist/strategies/scallop-leverage.d.ts.map +1 -0
- package/dist/strategies/scallop-leverage.js +143 -0
- package/dist/strategies/scallop-leverage.js.map +1 -0
- package/dist/types/config.d.ts +0 -7
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/constants.d.ts +8 -0
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/constants.js +9 -1
- package/dist/types/constants.js.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/position.d.ts +7 -3
- package/dist/types/position.d.ts.map +1 -1
- package/dist/types/protocol.d.ts +101 -0
- package/dist/types/protocol.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +82 -38
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/utils/calculations.d.ts +10 -137
- package/dist/utils/calculations.d.ts.map +1 -1
- package/dist/utils/calculations.js +11 -162
- package/dist/utils/calculations.js.map +1 -1
- package/dist/utils/coin.d.ts +16 -7
- package/dist/utils/coin.d.ts.map +1 -1
- package/dist/utils/coin.js +32 -25
- package/dist/utils/coin.js.map +1 -1
- package/dist/utils/errors.d.ts +0 -18
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +2 -40
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/execution.d.ts +38 -0
- package/dist/utils/execution.d.ts.map +1 -0
- package/dist/utils/execution.js +110 -0
- package/dist/utils/execution.js.map +1 -0
- package/dist/utils/gas.d.ts +0 -37
- package/dist/utils/gas.d.ts.map +1 -1
- package/dist/utils/gas.js +2 -60
- package/dist/utils/gas.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +15 -45
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SDK Method: sdk.buildDeleverageTransaction() [Unit]
|
|
4
|
+
*
|
|
5
|
+
* Tests calculateDeleverageEstimate() with mocked swap quotes. No mainnet RPC.
|
|
6
|
+
*
|
|
7
|
+
* Internal dependencies (mocked):
|
|
8
|
+
* - ScallopFlashLoanClient.calculateFee() → flash loan fee calculation
|
|
9
|
+
* - swapClient.quote() → swap rate for collateral → USDC
|
|
10
|
+
* - getTokenPrice() → collateral price for profit calc
|
|
11
|
+
*
|
|
12
|
+
* Verified behavior:
|
|
13
|
+
* - Flash loan amount includes 0.1% buffer
|
|
14
|
+
* - Flash loan fee correctly computed
|
|
15
|
+
* - Swap amount covers repayment + 2% buffer
|
|
16
|
+
* - keepCollateral = total - swapped
|
|
17
|
+
* - Profit = kept collateral value + USDC surplus
|
|
18
|
+
*
|
|
19
|
+
* Run: npx vitest run src/__tests__/sdk.deleverage.unit.test.ts
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
const vitest_1 = require("vitest");
|
|
23
|
+
const deleverage_1 = require("../strategies/deleverage");
|
|
24
|
+
const types_1 = require("../types");
|
|
25
|
+
// Mock external dependencies
|
|
26
|
+
vitest_1.vi.mock("@7kprotocol/sdk-ts", () => ({
|
|
27
|
+
MetaAg: vitest_1.vi.fn(),
|
|
28
|
+
getTokenPrice: vitest_1.vi.fn().mockResolvedValue(3.5), // SUI at $3.50
|
|
29
|
+
}));
|
|
30
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
31
|
+
function createMockParams(overrides = {}) {
|
|
32
|
+
const debtAmount = overrides.debtAmount ?? 100000000n; // 100 USDC
|
|
33
|
+
const collateralAmount = overrides.collateralAmount ?? 100000000000n; // 100 SUI
|
|
34
|
+
const swapAmountOut = overrides.swapAmountOut ?? "120000000"; // 120 USDC out for full collateral
|
|
35
|
+
const mockSwapClient = {
|
|
36
|
+
quote: vitest_1.vi.fn().mockResolvedValue([
|
|
37
|
+
{
|
|
38
|
+
amountOut: swapAmountOut,
|
|
39
|
+
amountIn: collateralAmount.toString(),
|
|
40
|
+
route: [],
|
|
41
|
+
},
|
|
42
|
+
]),
|
|
43
|
+
};
|
|
44
|
+
const mockProtocol = {
|
|
45
|
+
name: "suilend",
|
|
46
|
+
consumesRepaymentCoin: false,
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
protocol: mockProtocol,
|
|
50
|
+
flashLoanClient: {},
|
|
51
|
+
swapClient: mockSwapClient,
|
|
52
|
+
suiClient: {},
|
|
53
|
+
userAddress: "0xtest",
|
|
54
|
+
position: {
|
|
55
|
+
collateral: {
|
|
56
|
+
coinType: types_1.COIN_TYPES.SUI,
|
|
57
|
+
symbol: "SUI",
|
|
58
|
+
decimals: 9,
|
|
59
|
+
amount: collateralAmount,
|
|
60
|
+
valueUsd: 350,
|
|
61
|
+
},
|
|
62
|
+
debt: {
|
|
63
|
+
coinType: types_1.COIN_TYPES.USDC,
|
|
64
|
+
symbol: "USDC",
|
|
65
|
+
decimals: 6,
|
|
66
|
+
amount: debtAmount,
|
|
67
|
+
valueUsd: 100,
|
|
68
|
+
},
|
|
69
|
+
supplies: [{
|
|
70
|
+
coinType: types_1.COIN_TYPES.SUI,
|
|
71
|
+
symbol: "SUI",
|
|
72
|
+
decimals: 9,
|
|
73
|
+
amount: collateralAmount,
|
|
74
|
+
valueUsd: 350,
|
|
75
|
+
}],
|
|
76
|
+
borrows: [{
|
|
77
|
+
coinType: types_1.COIN_TYPES.USDC,
|
|
78
|
+
symbol: "USDC",
|
|
79
|
+
decimals: 6,
|
|
80
|
+
amount: debtAmount,
|
|
81
|
+
valueUsd: 100,
|
|
82
|
+
}],
|
|
83
|
+
healthFactor: 2.0,
|
|
84
|
+
netValueUsd: 250,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
89
|
+
(0, vitest_1.describe)("calculateDeleverageEstimate (unit)", () => {
|
|
90
|
+
(0, vitest_1.it)("calculates flash loan with small buffer", async () => {
|
|
91
|
+
const params = createMockParams();
|
|
92
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
93
|
+
// Flash loan = debt * 1001/1000 (0.1% buffer)
|
|
94
|
+
const expectedFlashLoan = (100000000n * 1001n) / 1000n;
|
|
95
|
+
(0, vitest_1.expect)(estimate.flashLoanUsdc).toBe(expectedFlashLoan);
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.it)("calculates flash loan fee", async () => {
|
|
98
|
+
const params = createMockParams();
|
|
99
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
100
|
+
// Fee should be non-negative
|
|
101
|
+
(0, vitest_1.expect)(estimate.flashLoanFee).toBeGreaterThanOrEqual(0n);
|
|
102
|
+
// Total repayment = flash loan + fee
|
|
103
|
+
(0, vitest_1.expect)(estimate.totalRepayment).toBe(estimate.flashLoanUsdc + estimate.flashLoanFee);
|
|
104
|
+
});
|
|
105
|
+
(0, vitest_1.it)("calculates swap amount to cover repayment", async () => {
|
|
106
|
+
const params = createMockParams();
|
|
107
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
108
|
+
// swapAmount should be positive and <= total collateral
|
|
109
|
+
(0, vitest_1.expect)(estimate.swapAmount).toBeGreaterThan(0n);
|
|
110
|
+
(0, vitest_1.expect)(estimate.swapAmount).toBeLessThanOrEqual(100000000000n);
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)("calculates keepCollateral correctly", async () => {
|
|
113
|
+
const params = createMockParams();
|
|
114
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
115
|
+
// keepCollateral = withdrawAmount - swapAmount
|
|
116
|
+
(0, vitest_1.expect)(estimate.keepCollateral).toBe(100000000000n - estimate.swapAmount);
|
|
117
|
+
});
|
|
118
|
+
(0, vitest_1.it)("total profit includes kept collateral and USDC surplus", async () => {
|
|
119
|
+
const params = createMockParams();
|
|
120
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
121
|
+
// Total profit should be positive when collateral value > debt
|
|
122
|
+
(0, vitest_1.expect)(estimate.totalProfitUsd).toBeGreaterThan(0);
|
|
123
|
+
});
|
|
124
|
+
(0, vitest_1.it)("caps swap amount at full collateral when needed", async () => {
|
|
125
|
+
// Scenario: swap rate is bad, need all collateral
|
|
126
|
+
const params = createMockParams({
|
|
127
|
+
debtAmount: 500000000n, // 500 USDC debt
|
|
128
|
+
collateralAmount: 100000000000n, // 100 SUI
|
|
129
|
+
swapAmountOut: "200000000", // Only get 200 USDC for full collateral
|
|
130
|
+
});
|
|
131
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
132
|
+
// swapAmount should not exceed collateral
|
|
133
|
+
(0, vitest_1.expect)(estimate.swapAmount).toBeLessThanOrEqual(100000000000n);
|
|
134
|
+
});
|
|
135
|
+
(0, vitest_1.it)("throws when no swap quotes available", async () => {
|
|
136
|
+
const params = createMockParams();
|
|
137
|
+
params.swapClient.quote.mockResolvedValue([]);
|
|
138
|
+
await (0, vitest_1.expect)((0, deleverage_1.calculateDeleverageEstimate)(params)).rejects.toThrow("No swap quotes found");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=sdk.deleverage.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.deleverage.unit.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.deleverage.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Method: sdk.buildLeverageTransaction() + sdk.dryRun() [Integration]
|
|
3
|
+
*
|
|
4
|
+
* Verifies that buildLeverageTransaction builds a valid PTB
|
|
5
|
+
* and dryRun successfully simulates it on mainnet.
|
|
6
|
+
*
|
|
7
|
+
* Internal dependencies:
|
|
8
|
+
* - buildLeverageTransaction() → strategies/leverage.ts
|
|
9
|
+
* - calculateLeveragePreview() → flash loan amount calculation
|
|
10
|
+
* - ScallopFlashLoanClient → flash loan borrow/repay
|
|
11
|
+
* - 7k Protocol swap → USDC → collateral swap
|
|
12
|
+
* - protocol.deposit() → lending deposit
|
|
13
|
+
* - protocol.borrow() → USDC borrow for repayment
|
|
14
|
+
* - protocol.refreshOracles() → oracle price update
|
|
15
|
+
*
|
|
16
|
+
* Run: npx vitest run src/__tests__/sdk.leverage.test.ts
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=sdk.leverage.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.leverage.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.leverage.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SDK Method: sdk.buildLeverageTransaction() + sdk.dryRun() [Integration]
|
|
4
|
+
*
|
|
5
|
+
* Verifies that buildLeverageTransaction builds a valid PTB
|
|
6
|
+
* and dryRun successfully simulates it on mainnet.
|
|
7
|
+
*
|
|
8
|
+
* Internal dependencies:
|
|
9
|
+
* - buildLeverageTransaction() → strategies/leverage.ts
|
|
10
|
+
* - calculateLeveragePreview() → flash loan amount calculation
|
|
11
|
+
* - ScallopFlashLoanClient → flash loan borrow/repay
|
|
12
|
+
* - 7k Protocol swap → USDC → collateral swap
|
|
13
|
+
* - protocol.deposit() → lending deposit
|
|
14
|
+
* - protocol.borrow() → USDC borrow for repayment
|
|
15
|
+
* - protocol.refreshOracles() → oracle price update
|
|
16
|
+
*
|
|
17
|
+
* Run: npx vitest run src/__tests__/sdk.leverage.test.ts
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
const vitest_1 = require("vitest");
|
|
54
|
+
const dotenv = __importStar(require("dotenv"));
|
|
55
|
+
dotenv.config({ path: '.env' });
|
|
56
|
+
const __1 = require("..");
|
|
57
|
+
const client_1 = require("@mysten/sui/client");
|
|
58
|
+
const ed25519_1 = require("@mysten/sui/keypairs/ed25519");
|
|
59
|
+
const transactions_1 = require("@mysten/sui/transactions");
|
|
60
|
+
// ── SDK Setup ─────────────────────────────────────────────────────────────────
|
|
61
|
+
let sdk;
|
|
62
|
+
let address;
|
|
63
|
+
const SECRET_KEY = process.env.SECRET_KEY || process.env.SUI_SECRET_KEY;
|
|
64
|
+
(0, vitest_1.beforeAll)(async () => {
|
|
65
|
+
if (!SECRET_KEY)
|
|
66
|
+
throw new Error('SECRET_KEY env is required');
|
|
67
|
+
const suiClient = new client_1.SuiClient({
|
|
68
|
+
url: process.env.SUI_FULLNODE_URL || (0, client_1.getFullnodeUrl)('mainnet'),
|
|
69
|
+
});
|
|
70
|
+
const keypair = ed25519_1.Ed25519Keypair.fromSecretKey(SECRET_KEY);
|
|
71
|
+
address = keypair.getPublicKey().toSuiAddress();
|
|
72
|
+
sdk = await __1.DefiDashSDK.create(suiClient, keypair);
|
|
73
|
+
}, 60000);
|
|
74
|
+
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
75
|
+
(0, vitest_1.describe)('sdk.buildLeverageTransaction + dryRun', () => {
|
|
76
|
+
(0, vitest_1.it)('Suilend SUI $1 2x — dryRun succeeds', async () => {
|
|
77
|
+
const tx = new transactions_1.Transaction();
|
|
78
|
+
tx.setSender(address);
|
|
79
|
+
await sdk.buildLeverageTransaction(tx, {
|
|
80
|
+
protocol: __1.LendingProtocol.Suilend,
|
|
81
|
+
depositAsset: 'SUI',
|
|
82
|
+
depositValueUsd: 1,
|
|
83
|
+
multiplier: 2.0,
|
|
84
|
+
});
|
|
85
|
+
const result = await sdk.dryRun(tx);
|
|
86
|
+
console.log(` Suilend SUI 2x → ${result.success ? 'SUCCESS' : 'FAILED: ' + result.error}` +
|
|
87
|
+
`${result.gasUsed ? ` (gas: ${(Number(result.gasUsed) / 1e9).toFixed(4)} SUI)` : ''}`);
|
|
88
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
89
|
+
(0, vitest_1.expect)(result.gasUsed).toBeDefined();
|
|
90
|
+
(0, vitest_1.expect)(result.gasUsed).toBeGreaterThan(0n);
|
|
91
|
+
}, 120000);
|
|
92
|
+
(0, vitest_1.it)('Navi SUI $1 2x — builds transaction', async () => {
|
|
93
|
+
const tx = new transactions_1.Transaction();
|
|
94
|
+
tx.setSender(address);
|
|
95
|
+
// Navi may fail dryRun due to oracle timing issues;
|
|
96
|
+
// we verify the transaction builds without throwing
|
|
97
|
+
await sdk.buildLeverageTransaction(tx, {
|
|
98
|
+
protocol: __1.LendingProtocol.Navi,
|
|
99
|
+
depositAsset: 'SUI',
|
|
100
|
+
depositValueUsd: 1,
|
|
101
|
+
multiplier: 2.0,
|
|
102
|
+
});
|
|
103
|
+
const result = await sdk.dryRun(tx);
|
|
104
|
+
console.log(` Navi SUI 2x → ${result.success ? 'SUCCESS' : 'FAILED: ' + result.error}` +
|
|
105
|
+
`${result.gasUsed ? ` (gas: ${(Number(result.gasUsed) / 1e9).toFixed(4)} SUI)` : ''}`);
|
|
106
|
+
// Build succeeded (dryRun may fail due to oracle staleness)
|
|
107
|
+
(0, vitest_1.expect)(result).toBeDefined();
|
|
108
|
+
}, 120000);
|
|
109
|
+
(0, vitest_1.it)('Scallop SUI $1 2x — builds transaction', async () => {
|
|
110
|
+
const tx = new transactions_1.Transaction();
|
|
111
|
+
tx.setSender(address);
|
|
112
|
+
// Scallop requires updateAssetPricesQuick via its SDK builder for oracle updates.
|
|
113
|
+
// The generic buildLeverageTransaction path may fail dryRun with
|
|
114
|
+
// MoveAbort in price::get_price if oracles are stale.
|
|
115
|
+
await sdk.buildLeverageTransaction(tx, {
|
|
116
|
+
protocol: __1.LendingProtocol.Scallop,
|
|
117
|
+
depositAsset: 'SUI',
|
|
118
|
+
depositValueUsd: 1,
|
|
119
|
+
multiplier: 2.0,
|
|
120
|
+
});
|
|
121
|
+
const result = await sdk.dryRun(tx);
|
|
122
|
+
console.log(` Scallop SUI 2x → ${result.success ? 'SUCCESS' : 'FAILED: ' + result.error}` +
|
|
123
|
+
`${result.gasUsed ? ` (gas: ${(Number(result.gasUsed) / 1e9).toFixed(4)} SUI)` : ''}`);
|
|
124
|
+
// Build succeeded (dryRun may fail due to Scallop oracle requirements)
|
|
125
|
+
(0, vitest_1.expect)(result).toBeDefined();
|
|
126
|
+
}, 120000);
|
|
127
|
+
(0, vitest_1.it)('rejects depositAmount with depositValueUsd simultaneously', async () => {
|
|
128
|
+
const tx = new transactions_1.Transaction();
|
|
129
|
+
tx.setSender(address);
|
|
130
|
+
await (0, vitest_1.expect)(sdk.buildLeverageTransaction(tx, {
|
|
131
|
+
protocol: __1.LendingProtocol.Suilend,
|
|
132
|
+
depositAsset: 'SUI',
|
|
133
|
+
depositAmount: '1',
|
|
134
|
+
depositValueUsd: 1,
|
|
135
|
+
multiplier: 2.0,
|
|
136
|
+
})).rejects.toThrow('Cannot provide both');
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('rejects when neither depositAmount nor depositValueUsd provided', async () => {
|
|
139
|
+
const tx = new transactions_1.Transaction();
|
|
140
|
+
tx.setSender(address);
|
|
141
|
+
await (0, vitest_1.expect)(sdk.buildLeverageTransaction(tx, {
|
|
142
|
+
protocol: __1.LendingProtocol.Suilend,
|
|
143
|
+
depositAsset: 'SUI',
|
|
144
|
+
multiplier: 2.0,
|
|
145
|
+
})).rejects.toThrow('Either depositAmount or depositValueUsd');
|
|
146
|
+
});
|
|
147
|
+
(0, vitest_1.it)('rejects multiplier <= 1', async () => {
|
|
148
|
+
const tx = new transactions_1.Transaction();
|
|
149
|
+
tx.setSender(address);
|
|
150
|
+
await (0, vitest_1.expect)(sdk.buildLeverageTransaction(tx, {
|
|
151
|
+
protocol: __1.LendingProtocol.Suilend,
|
|
152
|
+
depositAsset: 'SUI',
|
|
153
|
+
depositValueUsd: 1,
|
|
154
|
+
multiplier: 1.0,
|
|
155
|
+
})).rejects.toThrow('Multiplier must be greater than 1');
|
|
156
|
+
});
|
|
157
|
+
(0, vitest_1.it)('rejects multiplier > protocol max', async () => {
|
|
158
|
+
const tx = new transactions_1.Transaction();
|
|
159
|
+
tx.setSender(address);
|
|
160
|
+
await (0, vitest_1.expect)(sdk.buildLeverageTransaction(tx, {
|
|
161
|
+
protocol: __1.LendingProtocol.Suilend,
|
|
162
|
+
depositAsset: 'SUI',
|
|
163
|
+
depositValueUsd: 1,
|
|
164
|
+
multiplier: 99.0,
|
|
165
|
+
})).rejects.toThrow('exceeds protocol max');
|
|
166
|
+
}, 60000);
|
|
167
|
+
(0, vitest_1.it)('rejects depositValueUsd = 0', async () => {
|
|
168
|
+
const tx = new transactions_1.Transaction();
|
|
169
|
+
tx.setSender(address);
|
|
170
|
+
await (0, vitest_1.expect)(sdk.buildLeverageTransaction(tx, {
|
|
171
|
+
protocol: __1.LendingProtocol.Suilend,
|
|
172
|
+
depositAsset: 'SUI',
|
|
173
|
+
depositValueUsd: 0,
|
|
174
|
+
multiplier: 2.0,
|
|
175
|
+
})).rejects.toThrow('depositValueUsd must be positive');
|
|
176
|
+
});
|
|
177
|
+
(0, vitest_1.it)('rejects negative depositAmount', async () => {
|
|
178
|
+
const tx = new transactions_1.Transaction();
|
|
179
|
+
tx.setSender(address);
|
|
180
|
+
await (0, vitest_1.expect)(sdk.buildLeverageTransaction(tx, {
|
|
181
|
+
protocol: __1.LendingProtocol.Suilend,
|
|
182
|
+
depositAsset: 'SUI',
|
|
183
|
+
depositAmount: '-1',
|
|
184
|
+
multiplier: 2.0,
|
|
185
|
+
})).rejects.toThrow('depositAmount must be positive');
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=sdk.leverage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.leverage.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.leverage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Method: sdk.getAggregatedPortfolio() [Integration]
|
|
3
|
+
*
|
|
4
|
+
* Verifies the public portfolio aggregation method with live mainnet data.
|
|
5
|
+
*
|
|
6
|
+
* Internal dependencies (tested separately):
|
|
7
|
+
* - protocol.getAccountPortfolio() → each adapter's portfolio query
|
|
8
|
+
*
|
|
9
|
+
* Verified output fields:
|
|
10
|
+
* - Returns AccountPortfolio[] for all 3 protocols (Suilend, Navi, Scallop)
|
|
11
|
+
* - Each portfolio has valid healthFactor, netValueUsd, totalCollateralUsd, totalDebtUsd
|
|
12
|
+
* - positions[] entries have correct side, amount, apy
|
|
13
|
+
*
|
|
14
|
+
* Run: npx vitest run src/__tests__/sdk.portfolio.test.ts
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=sdk.portfolio.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.portfolio.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.portfolio.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SDK Method: sdk.getAggregatedPortfolio() [Integration]
|
|
4
|
+
*
|
|
5
|
+
* Verifies the public portfolio aggregation method with live mainnet data.
|
|
6
|
+
*
|
|
7
|
+
* Internal dependencies (tested separately):
|
|
8
|
+
* - protocol.getAccountPortfolio() → each adapter's portfolio query
|
|
9
|
+
*
|
|
10
|
+
* Verified output fields:
|
|
11
|
+
* - Returns AccountPortfolio[] for all 3 protocols (Suilend, Navi, Scallop)
|
|
12
|
+
* - Each portfolio has valid healthFactor, netValueUsd, totalCollateralUsd, totalDebtUsd
|
|
13
|
+
* - positions[] entries have correct side, amount, apy
|
|
14
|
+
*
|
|
15
|
+
* Run: npx vitest run src/__tests__/sdk.portfolio.test.ts
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
const vitest_1 = require("vitest");
|
|
52
|
+
const dotenv = __importStar(require("dotenv"));
|
|
53
|
+
dotenv.config({ path: ".env" });
|
|
54
|
+
const __1 = require("..");
|
|
55
|
+
const client_1 = require("@mysten/sui/client");
|
|
56
|
+
const ed25519_1 = require("@mysten/sui/keypairs/ed25519");
|
|
57
|
+
// ── Print helpers ────────────────────────────────────────────────────────────
|
|
58
|
+
function printPortfolio(portfolio) {
|
|
59
|
+
const usd = (v) => `$${v.toFixed(4)}`;
|
|
60
|
+
const pct = (v) => `${(v * 100).toFixed(2)}%`;
|
|
61
|
+
const lines = [
|
|
62
|
+
`\n┌─ [${portfolio.protocol}] Portfolio ──────────────────────────────`,
|
|
63
|
+
`│ Health Factor : ${portfolio.healthFactor === Infinity ? "∞ (no debt)" : portfolio.healthFactor.toFixed(4)}`,
|
|
64
|
+
`│ Net Value USD : ${usd(portfolio.netValueUsd)}`,
|
|
65
|
+
`│ Total Collateral : ${usd(portfolio.totalCollateralUsd)}`,
|
|
66
|
+
`│ Total Debt : ${usd(portfolio.totalDebtUsd)}`,
|
|
67
|
+
];
|
|
68
|
+
if (portfolio.netApy != null) {
|
|
69
|
+
lines.push(`│ Net APY : ${pct(portfolio.netApy)}`);
|
|
70
|
+
}
|
|
71
|
+
if (portfolio.totalAnnualNetEarningsUsd != null) {
|
|
72
|
+
lines.push(`│ Annual Earnings : ${usd(portfolio.totalAnnualNetEarningsUsd)}`);
|
|
73
|
+
}
|
|
74
|
+
if (portfolio.positions.length === 0) {
|
|
75
|
+
lines.push(`│ Positions : (none)`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
lines.push(`│ Positions (${portfolio.positions.length}):`);
|
|
79
|
+
for (const p of portfolio.positions) {
|
|
80
|
+
lines.push(`│ ${p.side.padEnd(7)} ${p.symbol.padEnd(6)} ${p.amount.toFixed(6)} (${usd(p.valueUsd)}) APY: ${pct(p.apy)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
lines.push(`└──────────────────────────────────────────────────────────\n`);
|
|
84
|
+
console.log(lines.join("\n"));
|
|
85
|
+
}
|
|
86
|
+
// ── SDK Setup ────────────────────────────────────────────────────────────────
|
|
87
|
+
let sdk;
|
|
88
|
+
const SECRET_KEY = process.env.SECRET_KEY || process.env.SUI_SECRET_KEY;
|
|
89
|
+
(0, vitest_1.beforeAll)(async () => {
|
|
90
|
+
if (!SECRET_KEY)
|
|
91
|
+
throw new Error("SECRET_KEY env is required");
|
|
92
|
+
const suiClient = new client_1.SuiClient({
|
|
93
|
+
url: process.env.SUI_FULLNODE_URL || (0, client_1.getFullnodeUrl)("mainnet"),
|
|
94
|
+
});
|
|
95
|
+
const keypair = ed25519_1.Ed25519Keypair.fromSecretKey(SECRET_KEY);
|
|
96
|
+
sdk = await __1.DefiDashSDK.create(suiClient, keypair);
|
|
97
|
+
console.log(`\nWallet: ${keypair.getPublicKey().toSuiAddress()}\n`);
|
|
98
|
+
}, 60000);
|
|
99
|
+
// ── Shared assertions ────────────────────────────────────────────────────────
|
|
100
|
+
function assertValidPortfolio(portfolio) {
|
|
101
|
+
// Must have a valid protocol
|
|
102
|
+
(0, vitest_1.expect)(Object.values(__1.LendingProtocol)).toContain(portfolio.protocol);
|
|
103
|
+
// Address must be non-empty
|
|
104
|
+
(0, vitest_1.expect)(portfolio.address).toBeTruthy();
|
|
105
|
+
// Health factor: positive number or Infinity
|
|
106
|
+
(0, vitest_1.expect)(portfolio.healthFactor).toBeGreaterThan(0);
|
|
107
|
+
// USD values must be non-negative
|
|
108
|
+
(0, vitest_1.expect)(portfolio.netValueUsd).toBeGreaterThanOrEqual(0);
|
|
109
|
+
(0, vitest_1.expect)(portfolio.totalCollateralUsd).toBeGreaterThanOrEqual(0);
|
|
110
|
+
(0, vitest_1.expect)(portfolio.totalDebtUsd).toBeGreaterThanOrEqual(0);
|
|
111
|
+
// Net value = collateral - debt (approximate)
|
|
112
|
+
if (portfolio.totalCollateralUsd > 0 || portfolio.totalDebtUsd > 0) {
|
|
113
|
+
(0, vitest_1.expect)(portfolio.netValueUsd).toBeCloseTo(portfolio.totalCollateralUsd - portfolio.totalDebtUsd, 1);
|
|
114
|
+
}
|
|
115
|
+
// Positions array
|
|
116
|
+
(0, vitest_1.expect)(Array.isArray(portfolio.positions)).toBe(true);
|
|
117
|
+
for (const pos of portfolio.positions) {
|
|
118
|
+
(0, vitest_1.expect)(pos.symbol).toBeTruthy();
|
|
119
|
+
(0, vitest_1.expect)(pos.coinType).toContain("::");
|
|
120
|
+
(0, vitest_1.expect)(["supply", "borrow"]).toContain(pos.side);
|
|
121
|
+
(0, vitest_1.expect)(pos.valueUsd).toBeGreaterThanOrEqual(0);
|
|
122
|
+
(0, vitest_1.expect)(typeof pos.apy).toBe("number");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
126
|
+
(0, vitest_1.describe)("sdk.getAggregatedPortfolio()", () => {
|
|
127
|
+
(0, vitest_1.it)("returns portfolios for all 3 protocols", async () => {
|
|
128
|
+
const portfolios = await sdk.getAggregatedPortfolio();
|
|
129
|
+
(0, vitest_1.expect)(portfolios).toHaveLength(3);
|
|
130
|
+
for (const portfolio of portfolios) {
|
|
131
|
+
printPortfolio(portfolio);
|
|
132
|
+
assertValidPortfolio(portfolio);
|
|
133
|
+
}
|
|
134
|
+
}, 60000);
|
|
135
|
+
(0, vitest_1.it)("always includes all protocols even with no positions", async () => {
|
|
136
|
+
const portfolios = await sdk.getAggregatedPortfolio();
|
|
137
|
+
const protocols = portfolios.map((p) => p.protocol);
|
|
138
|
+
(0, vitest_1.expect)(protocols).toContain(__1.LendingProtocol.Suilend);
|
|
139
|
+
(0, vitest_1.expect)(protocols).toContain(__1.LendingProtocol.Navi);
|
|
140
|
+
(0, vitest_1.expect)(protocols).toContain(__1.LendingProtocol.Scallop);
|
|
141
|
+
}, 60000);
|
|
142
|
+
(0, vitest_1.it)("does not return duplicate protocols", async () => {
|
|
143
|
+
const portfolios = await sdk.getAggregatedPortfolio();
|
|
144
|
+
const protocols = portfolios.map((p) => p.protocol);
|
|
145
|
+
const unique = new Set(protocols);
|
|
146
|
+
(0, vitest_1.expect)(unique.size).toBe(protocols.length);
|
|
147
|
+
}, 60000);
|
|
148
|
+
(0, vitest_1.it)("empty protocol returns safe defaults", async () => {
|
|
149
|
+
const portfolios = await sdk.getAggregatedPortfolio();
|
|
150
|
+
for (const portfolio of portfolios) {
|
|
151
|
+
if (portfolio.positions.length === 0) {
|
|
152
|
+
// Protocol with no positions should have zero values
|
|
153
|
+
(0, vitest_1.expect)(portfolio.totalCollateralUsd).toBe(0);
|
|
154
|
+
(0, vitest_1.expect)(portfolio.totalDebtUsd).toBe(0);
|
|
155
|
+
(0, vitest_1.expect)(portfolio.netValueUsd).toBe(0);
|
|
156
|
+
// Health factor should be Infinity (no debt risk)
|
|
157
|
+
(0, vitest_1.expect)(portfolio.healthFactor).toBe(Infinity);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}, 60000);
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=sdk.portfolio.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.portfolio.test.js","sourceRoot":"","sources":["../../src/__tests__/sdk.portfolio.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Method: sdk.getPosition() / sdk.getOpenPositions() [Integration]
|
|
3
|
+
*
|
|
4
|
+
* Verifies the public position query methods with live mainnet data.
|
|
5
|
+
*
|
|
6
|
+
* Internal dependencies (tested separately):
|
|
7
|
+
* - protocol.getPosition() → see internal.getPosition.test.ts
|
|
8
|
+
*
|
|
9
|
+
* Verified output fields:
|
|
10
|
+
* - getPosition(): PositionInfo | null per protocol
|
|
11
|
+
* - getOpenPositions(): array of { protocol, position } across all protocols
|
|
12
|
+
*
|
|
13
|
+
* Run: npx vitest run src/__tests__/sdk.position.test.ts
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=sdk.position.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.position.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.position.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|