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
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 curg'13
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ DefiDash SDK is a **DeFi Saver-like toolkit** for Sui blockchain. It abstracts c
|
|
|
40
40
|
│ │
|
|
41
41
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
42
42
|
│ │ 1. Flash Loan │───▶│ 2. Swap │───▶│ 3. Lending │ │
|
|
43
|
-
│ │ (Scallop) │ │ (7k Protocol) │ │ (
|
|
43
|
+
│ │ (Scallop) │ │ (7k Protocol) │ │ (Multi-proto) │ │
|
|
44
44
|
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
45
45
|
│ │ │ │
|
|
46
46
|
│ └────────────── Borrow to Repay ◀──────────────┘ │
|
|
@@ -51,14 +51,24 @@ DefiDash SDK is a **DeFi Saver-like toolkit** for Sui blockchain. It abstracts c
|
|
|
51
51
|
**How it works:**
|
|
52
52
|
|
|
53
53
|
1. **Flash Loan** — Borrow USDC from Scallop (no collateral needed)
|
|
54
|
-
2. **Swap** — Convert USDC to collateral asset (
|
|
55
|
-
3. **Deposit** — Deposit collateral into lending protocol
|
|
54
|
+
2. **Swap** — Convert USDC to collateral asset (XBTC, SUI, etc.) via 7k Aggregator
|
|
55
|
+
3. **Deposit** — Deposit collateral into lending protocol
|
|
56
56
|
4. **Borrow** — Borrow USDC against collateral to repay flash loan
|
|
57
57
|
|
|
58
58
|
All steps execute atomically in a single Sui Programmable Transaction Block (PTB).
|
|
59
59
|
|
|
60
60
|
---
|
|
61
61
|
|
|
62
|
+
## Supported Protocols
|
|
63
|
+
|
|
64
|
+
| Component | Protocols |
|
|
65
|
+
| ------------------- | ---------------------- |
|
|
66
|
+
| **Flash Loan** | Scallop |
|
|
67
|
+
| **Swap Aggregator** | 7k Protocol |
|
|
68
|
+
| **Lending** | Suilend, Navi, Scallop |
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
62
72
|
## Installation
|
|
63
73
|
|
|
64
74
|
```bash
|
|
@@ -67,75 +77,61 @@ npm install defi-dash-sdk
|
|
|
67
77
|
|
|
68
78
|
## Quick Start
|
|
69
79
|
|
|
80
|
+
### Node.js
|
|
81
|
+
|
|
70
82
|
```typescript
|
|
71
83
|
import { SuiClient, getFullnodeUrl } from "@mysten/sui/client";
|
|
72
84
|
import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
|
|
85
|
+
import { Transaction } from "@mysten/sui/transactions";
|
|
73
86
|
import { DefiDashSDK, LendingProtocol } from "defi-dash-sdk";
|
|
74
87
|
|
|
75
88
|
// Initialize
|
|
76
89
|
const suiClient = new SuiClient({ url: getFullnodeUrl("mainnet") });
|
|
77
90
|
const keypair = Ed25519Keypair.fromSecretKey(YOUR_SECRET_KEY);
|
|
91
|
+
const sdk = await DefiDashSDK.create(suiClient, keypair);
|
|
78
92
|
|
|
79
|
-
|
|
80
|
-
|
|
93
|
+
// Build + Execute 2x leverage on XBTC
|
|
94
|
+
const tx = new Transaction();
|
|
95
|
+
tx.setSender(keypair.getPublicKey().toSuiAddress());
|
|
81
96
|
|
|
82
|
-
|
|
83
|
-
const result = await sdk.leverage({
|
|
97
|
+
await sdk.buildLeverageTransaction(tx, {
|
|
84
98
|
protocol: LendingProtocol.Suilend,
|
|
85
|
-
depositAsset: "
|
|
86
|
-
|
|
99
|
+
depositAsset: "XBTC",
|
|
100
|
+
depositValueUsd: 100,
|
|
87
101
|
multiplier: 2.0,
|
|
88
|
-
dryRun: false, // Set true to simulate
|
|
89
102
|
});
|
|
90
103
|
|
|
91
|
-
|
|
104
|
+
const result = await sdk.execute(tx); // or sdk.dryRun(tx) to simulate
|
|
105
|
+
console.log(result.txDigest);
|
|
92
106
|
|
|
93
107
|
// Close position
|
|
94
|
-
|
|
108
|
+
const tx2 = new Transaction();
|
|
109
|
+
tx2.setSender(keypair.getPublicKey().toSuiAddress());
|
|
110
|
+
await sdk.buildDeleverageTransaction(tx2, {
|
|
95
111
|
protocol: LendingProtocol.Suilend,
|
|
96
|
-
dryRun: false,
|
|
97
112
|
});
|
|
113
|
+
await sdk.execute(tx2);
|
|
98
114
|
```
|
|
99
115
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
## Supported Protocols
|
|
116
|
+
### Browser
|
|
103
117
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
| **Swap Aggregator** | 7k Protocol |
|
|
108
|
-
| **Lending** | Suilend, Navi |
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Examples
|
|
113
|
-
|
|
114
|
-
See `examples/` folder for full working examples:
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
# Setup environment
|
|
118
|
-
cp .env.example .env.test
|
|
119
|
-
# Edit .env.test with your secret key
|
|
118
|
+
```typescript
|
|
119
|
+
// No keypair needed — pass wallet address
|
|
120
|
+
const sdk = await DefiDashSDK.create(suiClient, walletAddress);
|
|
120
121
|
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
const tx = new Transaction();
|
|
123
|
+
tx.setSender(walletAddress);
|
|
124
|
+
await sdk.buildLeverageTransaction(tx, {
|
|
125
|
+
protocol: LendingProtocol.Suilend,
|
|
126
|
+
depositAsset: "XBTC",
|
|
127
|
+
depositValueUsd: 100,
|
|
128
|
+
multiplier: 2.0,
|
|
129
|
+
});
|
|
123
130
|
|
|
124
|
-
|
|
125
|
-
|
|
131
|
+
// Sign with wallet adapter (e.g., @mysten/dapp-kit)
|
|
132
|
+
await signAndExecute({ transaction: tx });
|
|
126
133
|
```
|
|
127
134
|
|
|
128
|
-
### Environment Variables
|
|
129
|
-
|
|
130
|
-
| Variable | Description | Default |
|
|
131
|
-
| ---------------------------- | ------------------------------ | --------- |
|
|
132
|
-
| `SECRET_KEY` | Sui wallet secret key (base64) | Required |
|
|
133
|
-
| `LEVERAGE_PROTOCOL` | `suilend` or `navi` | `suilend` |
|
|
134
|
-
| `LEVERAGE_DEPOSIT_COIN_TYPE` | Asset symbol or coin type | `LBTC` |
|
|
135
|
-
| `LEVERAGE_DEPOSIT_AMOUNT` | Amount in raw units | `1000` |
|
|
136
|
-
| `LEVERAGE_MULTIPLIER` | Leverage multiplier | `2` |
|
|
137
|
-
| `TX_MODE` | `dryrun` or `exec` | `dryrun` |
|
|
138
|
-
|
|
139
135
|
---
|
|
140
136
|
|
|
141
137
|
## API Reference
|
|
@@ -144,37 +140,56 @@ npm run example:deleverage
|
|
|
144
140
|
|
|
145
141
|
```typescript
|
|
146
142
|
class DefiDashSDK {
|
|
147
|
-
// Initialize
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
143
|
+
// Initialize (static factory — no constructor)
|
|
144
|
+
static create(
|
|
145
|
+
suiClient: SuiClient,
|
|
146
|
+
keypairOrAddress: Ed25519Keypair | string,
|
|
147
|
+
options?: SDKOptions,
|
|
148
|
+
): Promise<DefiDashSDK>;
|
|
149
|
+
|
|
150
|
+
// Build transactions (browser & Node.js)
|
|
151
|
+
buildLeverageTransaction(tx: Transaction, params: BrowserLeverageParams): Promise<void>;
|
|
152
|
+
buildDeleverageTransaction(tx: Transaction, params: BrowserDeleverageParams): Promise<void>;
|
|
153
|
+
|
|
154
|
+
// Preview & Route finding
|
|
155
|
+
previewLeverage(params: PreviewLeverageParams): Promise<LeveragePreview>;
|
|
156
|
+
findBestLeverageRoute(params: FindBestRouteParams): Promise<LeverageRouteResult>;
|
|
157
|
+
|
|
158
|
+
// Position queries
|
|
157
159
|
getPosition(protocol: LendingProtocol): Promise<PositionInfo | null>;
|
|
160
|
+
getOpenPositions(): Promise<Array<{ protocol: LendingProtocol; position: PositionInfo }>>;
|
|
161
|
+
getAggregatedPortfolio(): Promise<AccountPortfolio[]>;
|
|
158
162
|
|
|
159
|
-
//
|
|
160
|
-
|
|
163
|
+
// Utilities
|
|
164
|
+
getTokenPrice(asset: string): Promise<number>;
|
|
165
|
+
getSuiClient(): SuiClient;
|
|
166
|
+
getUserAddress(): string;
|
|
167
|
+
|
|
168
|
+
// Execute (Node.js only, requires keypair)
|
|
169
|
+
dryRun(tx: Transaction): Promise<StrategyResult>;
|
|
170
|
+
execute(tx: Transaction): Promise<StrategyResult>;
|
|
161
171
|
}
|
|
162
172
|
```
|
|
163
173
|
|
|
164
|
-
### Types
|
|
174
|
+
### Key Types
|
|
165
175
|
|
|
166
176
|
```typescript
|
|
167
177
|
enum LendingProtocol {
|
|
168
178
|
Suilend = "suilend",
|
|
169
179
|
Navi = "navi",
|
|
180
|
+
Scallop = "scallop",
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
interface BrowserLeverageParams {
|
|
184
|
+
protocol: LendingProtocol;
|
|
185
|
+
depositAsset: string; // "XBTC", "SUI", or full coin type
|
|
186
|
+
depositAmount?: string; // Raw amount (e.g., "100000") — either this or depositValueUsd
|
|
187
|
+
depositValueUsd?: number; // USD value (e.g., 100) — either this or depositAmount
|
|
188
|
+
multiplier: number; // 1.5, 2.0, 3.0, etc.
|
|
170
189
|
}
|
|
171
190
|
|
|
172
|
-
interface
|
|
191
|
+
interface BrowserDeleverageParams {
|
|
173
192
|
protocol: LendingProtocol;
|
|
174
|
-
depositAsset: string; // "LBTC" or full coin type
|
|
175
|
-
depositAmount: string; // Human-readable, e.g., "0.001"
|
|
176
|
-
multiplier: number; // 1.5, 2.0, 3.0, etc.
|
|
177
|
-
dryRun?: boolean;
|
|
178
193
|
}
|
|
179
194
|
|
|
180
195
|
interface StrategyResult {
|
|
@@ -185,29 +200,94 @@ interface StrategyResult {
|
|
|
185
200
|
}
|
|
186
201
|
```
|
|
187
202
|
|
|
203
|
+
### Preview & Route Finding
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
// Compare all protocols for a given asset
|
|
207
|
+
const route = await sdk.findBestLeverageRoute({
|
|
208
|
+
depositAsset: "XBTC",
|
|
209
|
+
depositValueUsd: 100,
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
console.log(route.safeMultiplier); // e.g., 2.00
|
|
213
|
+
console.log(route.bestMaxMultiplier.protocol); // e.g., "scallop"
|
|
214
|
+
console.log(route.bestApy.protocol); // e.g., "suilend"
|
|
215
|
+
|
|
216
|
+
// Preview a specific protocol
|
|
217
|
+
const preview = await sdk.previewLeverage({
|
|
218
|
+
protocol: LendingProtocol.Suilend,
|
|
219
|
+
depositAsset: "XBTC",
|
|
220
|
+
depositValueUsd: 100,
|
|
221
|
+
multiplier: 2.0,
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
console.log(preview.totalPositionUsd); // $200
|
|
225
|
+
console.log(preview.maxMultiplier); // 2.50x
|
|
226
|
+
console.log(preview.liquidationPrice); // $51,244
|
|
227
|
+
console.log(preview.netApy); // 0.04 (4%)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Position Queries
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
// Single protocol position
|
|
234
|
+
const position = await sdk.getPosition(LendingProtocol.Suilend);
|
|
235
|
+
|
|
236
|
+
// All open positions (for strategy operations)
|
|
237
|
+
const positions = await sdk.getOpenPositions();
|
|
238
|
+
for (const { protocol, position } of positions) {
|
|
239
|
+
console.log(`[${protocol}] Net: $${position.netValueUsd}`);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Full portfolio with APY data (for dashboards)
|
|
243
|
+
const portfolios = await sdk.getAggregatedPortfolio();
|
|
244
|
+
for (const p of portfolios) {
|
|
245
|
+
console.log(`[${p.protocol}] HF: ${p.healthFactor} | Net: $${p.netValueUsd}`);
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
188
249
|
---
|
|
189
250
|
|
|
190
|
-
##
|
|
251
|
+
## Examples
|
|
252
|
+
|
|
253
|
+
See [`examples/`](examples/) for full working examples:
|
|
191
254
|
|
|
192
|
-
|
|
255
|
+
| File | Description |
|
|
256
|
+
|------|-------------|
|
|
257
|
+
| `leverage.ts` | Build and execute a leverage position |
|
|
258
|
+
| `deleverage.ts` | Close a leverage position |
|
|
259
|
+
| `preview_leverage.ts` | Preview leverage parameters before executing |
|
|
260
|
+
| `find_best_route.ts` | Compare protocols and find optimal route |
|
|
261
|
+
| `get_portfolio.ts` | Query positions and portfolio across protocols |
|
|
193
262
|
|
|
194
263
|
```bash
|
|
195
|
-
# Setup
|
|
196
|
-
cp .env.
|
|
264
|
+
# Setup environment
|
|
265
|
+
cp .env.example .env
|
|
266
|
+
# Edit .env with your secret key
|
|
267
|
+
|
|
268
|
+
# Run examples
|
|
269
|
+
npm run example:leverage
|
|
270
|
+
npm run example:deleverage
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
197
274
|
|
|
198
|
-
|
|
199
|
-
npm run script:suilend-leverage
|
|
200
|
-
npm run script:suilend-deleverage
|
|
275
|
+
## E2E Testing
|
|
201
276
|
|
|
202
|
-
|
|
203
|
-
npm run script:navi-leverage
|
|
204
|
-
npm run script:navi-deleverage
|
|
277
|
+
Full cycle test across all protocols: Preview → Leverage → Portfolio → Deleverage
|
|
205
278
|
|
|
206
|
-
|
|
207
|
-
|
|
279
|
+
```bash
|
|
280
|
+
# Dry run (simulation only)
|
|
281
|
+
npm run e2e
|
|
282
|
+
|
|
283
|
+
# Execute on-chain (real transactions, gas costs apply)
|
|
284
|
+
npm run e2e:execute
|
|
208
285
|
|
|
209
|
-
#
|
|
210
|
-
npm run
|
|
286
|
+
# Partial runs
|
|
287
|
+
npm run e2e:leverage # leverage only (dryrun)
|
|
288
|
+
npm run e2e:leverage:execute # leverage only (execute)
|
|
289
|
+
npm run e2e:deleverage # deleverage only (dryrun)
|
|
290
|
+
npm run e2e:deleverage:execute # deleverage only (execute)
|
|
211
291
|
```
|
|
212
292
|
|
|
213
293
|
---
|
|
@@ -217,28 +297,50 @@ npm run script:swap
|
|
|
217
297
|
```
|
|
218
298
|
defi-dash-sdk/
|
|
219
299
|
├── src/
|
|
220
|
-
│ ├── index.ts
|
|
221
|
-
│ ├── sdk.ts
|
|
222
|
-
│ ├── types
|
|
223
|
-
│ ├── protocols/
|
|
224
|
-
│ │ ├──
|
|
225
|
-
│ │
|
|
226
|
-
│ ├──
|
|
300
|
+
│ ├── index.ts # Public API exports
|
|
301
|
+
│ ├── sdk.ts # DefiDashSDK class
|
|
302
|
+
│ ├── types/ # TypeScript types & constants
|
|
303
|
+
│ ├── protocols/ # Protocol adapters
|
|
304
|
+
│ │ ├── base-adapter.ts # Abstract base (compile-time enforcement)
|
|
305
|
+
│ │ ├── suilend/
|
|
306
|
+
│ │ ├── navi/
|
|
307
|
+
│ │ └── scallop/
|
|
308
|
+
│ ├── strategies/ # Strategy builders
|
|
227
309
|
│ │ ├── leverage.ts
|
|
228
|
-
│ │
|
|
229
|
-
│
|
|
230
|
-
|
|
231
|
-
│ ├──
|
|
232
|
-
│ └──
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
├──
|
|
237
|
-
└──
|
|
310
|
+
│ │ ├── deleverage.ts
|
|
311
|
+
│ │ ├── leverage-preview.ts
|
|
312
|
+
│ │ └── leverage-route.ts
|
|
313
|
+
│ ├── utils/ # Internal utilities
|
|
314
|
+
│ └── __tests__/ # Unit & integration tests
|
|
315
|
+
├── examples/ # SDK usage examples
|
|
316
|
+
├── scripts/ # E2E test scripts
|
|
317
|
+
└── docs/ # SDK documentation
|
|
318
|
+
├── sdk-methods/ # Method-level docs
|
|
319
|
+
└── adding-new-protocol.md
|
|
238
320
|
```
|
|
239
321
|
|
|
322
|
+
### Adding New Protocols
|
|
323
|
+
|
|
324
|
+
New lending protocols can be added by extending `BaseProtocolAdapter`. The abstract class enforces compile-time method implementation — missing any required method produces a TypeScript build error.
|
|
325
|
+
|
|
326
|
+
See [`docs/adding-new-protocol.md`](docs/adding-new-protocol.md) for the full guide.
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Environment Variables
|
|
331
|
+
|
|
332
|
+
| Variable | Description | Default |
|
|
333
|
+
| ---------------------------- | ------------------------------ | --------- |
|
|
334
|
+
| `SECRET_KEY` | Sui wallet secret key (base64) | Required |
|
|
335
|
+
| `SUI_FULLNODE_URL` | Custom RPC endpoint | Mainnet |
|
|
336
|
+
| `LEVERAGE_PROTOCOL` | `suilend`, `navi`, or `scallop`| `suilend` |
|
|
337
|
+
| `LEVERAGE_DEPOSIT_COIN_TYPE` | Asset symbol or coin type | `XBTC` |
|
|
338
|
+
| `LEVERAGE_DEPOSIT_AMOUNT` | Amount in raw units | `1000` |
|
|
339
|
+
| `LEVERAGE_MULTIPLIER` | Leverage multiplier | `2` |
|
|
340
|
+
| `TX_MODE` | `dryrun` or `exec` | `dryrun` |
|
|
341
|
+
|
|
240
342
|
---
|
|
241
343
|
|
|
242
344
|
## License
|
|
243
345
|
|
|
244
|
-
MIT
|
|
346
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit Tests: calculateDeleverageEstimate
|
|
3
|
+
*
|
|
4
|
+
* Tests the deleverage estimate calculation with mocked swap quotes.
|
|
5
|
+
* No mainnet RPC required.
|
|
6
|
+
*
|
|
7
|
+
* Run: npx vitest run src/__tests__/deleverageEstimate.unit.test.ts
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=deleverageEstimate.unit.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleverageEstimate.unit.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/deleverageEstimate.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unit Tests: calculateDeleverageEstimate
|
|
4
|
+
*
|
|
5
|
+
* Tests the deleverage estimate calculation with mocked swap quotes.
|
|
6
|
+
* No mainnet RPC required.
|
|
7
|
+
*
|
|
8
|
+
* Run: npx vitest run src/__tests__/deleverageEstimate.unit.test.ts
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const vitest_1 = require("vitest");
|
|
12
|
+
const deleverage_1 = require("../strategies/deleverage");
|
|
13
|
+
const types_1 = require("../types");
|
|
14
|
+
// Mock external dependencies
|
|
15
|
+
vitest_1.vi.mock("@7kprotocol/sdk-ts", () => ({
|
|
16
|
+
MetaAg: vitest_1.vi.fn(),
|
|
17
|
+
getTokenPrice: vitest_1.vi.fn().mockResolvedValue(3.5), // SUI at $3.50
|
|
18
|
+
}));
|
|
19
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
20
|
+
function createMockParams(overrides = {}) {
|
|
21
|
+
const debtAmount = overrides.debtAmount ?? 100000000n; // 100 USDC
|
|
22
|
+
const collateralAmount = overrides.collateralAmount ?? 100000000000n; // 100 SUI
|
|
23
|
+
const swapAmountOut = overrides.swapAmountOut ?? "120000000"; // 120 USDC out for full collateral
|
|
24
|
+
const mockSwapClient = {
|
|
25
|
+
quote: vitest_1.vi.fn().mockResolvedValue([
|
|
26
|
+
{
|
|
27
|
+
amountOut: swapAmountOut,
|
|
28
|
+
amountIn: collateralAmount.toString(),
|
|
29
|
+
route: [],
|
|
30
|
+
},
|
|
31
|
+
]),
|
|
32
|
+
};
|
|
33
|
+
const mockProtocol = {
|
|
34
|
+
name: "suilend",
|
|
35
|
+
consumesRepaymentCoin: false,
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
protocol: mockProtocol,
|
|
39
|
+
flashLoanClient: {},
|
|
40
|
+
swapClient: mockSwapClient,
|
|
41
|
+
suiClient: {},
|
|
42
|
+
userAddress: "0xtest",
|
|
43
|
+
position: {
|
|
44
|
+
collateral: {
|
|
45
|
+
coinType: types_1.COIN_TYPES.SUI,
|
|
46
|
+
symbol: "SUI",
|
|
47
|
+
decimals: 9,
|
|
48
|
+
amount: collateralAmount,
|
|
49
|
+
valueUsd: 350,
|
|
50
|
+
},
|
|
51
|
+
debt: {
|
|
52
|
+
coinType: types_1.COIN_TYPES.USDC,
|
|
53
|
+
symbol: "USDC",
|
|
54
|
+
decimals: 6,
|
|
55
|
+
amount: debtAmount,
|
|
56
|
+
valueUsd: 100,
|
|
57
|
+
},
|
|
58
|
+
healthFactor: 2.0,
|
|
59
|
+
netValueUsd: 250,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
64
|
+
(0, vitest_1.describe)("calculateDeleverageEstimate (unit)", () => {
|
|
65
|
+
(0, vitest_1.it)("calculates flash loan with small buffer", async () => {
|
|
66
|
+
const params = createMockParams();
|
|
67
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
68
|
+
// Flash loan = debt * 1001/1000 (0.1% buffer)
|
|
69
|
+
const expectedFlashLoan = (100000000n * 1001n) / 1000n;
|
|
70
|
+
(0, vitest_1.expect)(estimate.flashLoanUsdc).toBe(expectedFlashLoan);
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.it)("calculates flash loan fee", async () => {
|
|
73
|
+
const params = createMockParams();
|
|
74
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
75
|
+
// Fee should be non-negative
|
|
76
|
+
(0, vitest_1.expect)(estimate.flashLoanFee).toBeGreaterThanOrEqual(0n);
|
|
77
|
+
// Total repayment = flash loan + fee
|
|
78
|
+
(0, vitest_1.expect)(estimate.totalRepayment).toBe(estimate.flashLoanUsdc + estimate.flashLoanFee);
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.it)("calculates swap amount to cover repayment", async () => {
|
|
81
|
+
const params = createMockParams();
|
|
82
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
83
|
+
// swapAmount should be positive and <= total collateral
|
|
84
|
+
(0, vitest_1.expect)(estimate.swapAmount).toBeGreaterThan(0n);
|
|
85
|
+
(0, vitest_1.expect)(estimate.swapAmount).toBeLessThanOrEqual(100000000000n);
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)("calculates keepCollateral correctly", async () => {
|
|
88
|
+
const params = createMockParams();
|
|
89
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
90
|
+
// keepCollateral = withdrawAmount - swapAmount
|
|
91
|
+
(0, vitest_1.expect)(estimate.keepCollateral).toBe(100000000000n - estimate.swapAmount);
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.it)("total profit includes kept collateral and USDC surplus", async () => {
|
|
94
|
+
const params = createMockParams();
|
|
95
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
96
|
+
// Total profit should be positive when collateral value > debt
|
|
97
|
+
(0, vitest_1.expect)(estimate.totalProfitUsd).toBeGreaterThan(0);
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)("caps swap amount at full collateral when needed", async () => {
|
|
100
|
+
// Scenario: swap rate is bad, need all collateral
|
|
101
|
+
const params = createMockParams({
|
|
102
|
+
debtAmount: 500000000n, // 500 USDC debt
|
|
103
|
+
collateralAmount: 100000000000n, // 100 SUI
|
|
104
|
+
swapAmountOut: "200000000", // Only get 200 USDC for full collateral
|
|
105
|
+
});
|
|
106
|
+
const estimate = await (0, deleverage_1.calculateDeleverageEstimate)(params);
|
|
107
|
+
// swapAmount should not exceed collateral
|
|
108
|
+
(0, vitest_1.expect)(estimate.swapAmount).toBeLessThanOrEqual(100000000000n);
|
|
109
|
+
});
|
|
110
|
+
(0, vitest_1.it)("throws when no swap quotes available", async () => {
|
|
111
|
+
const params = createMockParams();
|
|
112
|
+
params.swapClient.quote.mockResolvedValue([]);
|
|
113
|
+
await (0, vitest_1.expect)((0, deleverage_1.calculateDeleverageEstimate)(params)).rejects.toThrow("No swap quotes found");
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=deleverageEstimate.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleverageEstimate.unit.test.js","sourceRoot":"","sources":["../../src/__tests__/deleverageEstimate.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration Tests: findBestLeverageRoute
|
|
3
|
+
*
|
|
4
|
+
* Verifies the best-route-finding logic across all protocols:
|
|
5
|
+
* - Returns two distinct routes (bestMaxMultiplier, bestApy)
|
|
6
|
+
* - Safe multiplier is correctly calculated
|
|
7
|
+
* - Graceful degradation when a protocol fails
|
|
8
|
+
*
|
|
9
|
+
* Run: npx vitest run src/__tests__/findBestLeverageRoute.test.ts
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=findBestLeverageRoute.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findBestLeverageRoute.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/findBestLeverageRoute.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|