defi-dash-sdk 0.1.4 → 0.1.5
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/dist/esm/index.js +40 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/protocols/base-adapter.js +78 -0
- package/dist/esm/protocols/base-adapter.js.map +1 -0
- package/dist/esm/protocols/index.js +8 -0
- package/dist/esm/protocols/index.js.map +1 -0
- package/dist/esm/protocols/navi/adapter.js +393 -0
- package/dist/esm/protocols/navi/adapter.js.map +1 -0
- package/dist/{protocols/scallop.js → esm/protocols/scallop/adapter.js} +252 -95
- package/dist/esm/protocols/scallop/adapter.js.map +1 -0
- package/dist/{lib/scallop/flash-loan-client.js → esm/protocols/scallop/flash-loan.js} +63 -8
- package/dist/esm/protocols/scallop/flash-loan.js.map +1 -0
- package/dist/esm/protocols/scallop/index.js +6 -0
- package/dist/esm/protocols/scallop/index.js.map +1 -0
- package/dist/esm/protocols/scallop/types.js +67 -0
- package/dist/esm/protocols/scallop/types.js.map +1 -0
- package/dist/esm/protocols/suilend/adapter.js +464 -0
- package/dist/esm/protocols/suilend/adapter.js.map +1 -0
- package/dist/{lib → esm/protocols}/suilend/calculators.js +41 -51
- package/dist/esm/protocols/suilend/calculators.js.map +1 -0
- package/dist/esm/protocols/suilend/constants.js +159 -0
- package/dist/{lib/suilend/const.js.map → esm/protocols/suilend/constants.js.map} +1 -1
- package/dist/{lib/suilend/suilend.js → esm/protocols/suilend/types.js} +7 -13
- package/dist/esm/protocols/suilend/types.js.map +1 -0
- package/dist/esm/sdk.js +569 -0
- package/dist/esm/sdk.js.map +1 -0
- package/dist/esm/strategies/common.js +75 -0
- package/dist/esm/strategies/common.js.map +1 -0
- package/dist/esm/strategies/deleverage.js +218 -0
- package/dist/esm/strategies/deleverage.js.map +1 -0
- package/dist/esm/strategies/index.js +10 -0
- package/dist/esm/strategies/index.js.map +1 -0
- package/dist/esm/strategies/leverage-preview.js +117 -0
- package/dist/esm/strategies/leverage-preview.js.map +1 -0
- package/dist/esm/strategies/leverage-route.js +109 -0
- package/dist/esm/strategies/leverage-route.js.map +1 -0
- package/dist/esm/strategies/leverage.js +156 -0
- package/dist/esm/strategies/leverage.js.map +1 -0
- package/dist/esm/strategies/scallop-leverage.js +140 -0
- package/dist/esm/strategies/scallop-leverage.js.map +1 -0
- package/dist/esm/types/common.js +13 -0
- package/dist/esm/types/common.js.map +1 -0
- package/dist/esm/types/config.js +5 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/constants.js +128 -0
- package/dist/esm/types/constants.js.map +1 -0
- package/dist/esm/types/index.js +10 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/position.js +5 -0
- package/dist/esm/types/position.js.map +1 -0
- package/dist/esm/types/protocol.js +5 -0
- package/dist/esm/types/protocol.js.map +1 -0
- package/dist/esm/types/strategy.js +5 -0
- package/dist/esm/types/strategy.js.map +1 -0
- package/dist/esm/utils/calculations.js +33 -0
- package/dist/esm/utils/calculations.js.map +1 -0
- package/dist/esm/utils/coin.js +54 -0
- package/dist/esm/utils/coin.js.map +1 -0
- package/dist/esm/utils/errors.js +111 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/execution.js +106 -0
- package/dist/esm/utils/execution.js.map +1 -0
- package/dist/{lib → esm}/utils/format.js +2 -6
- package/dist/esm/utils/format.js.map +1 -0
- package/dist/esm/utils/gas.js +38 -0
- package/dist/esm/utils/gas.js.map +1 -0
- package/dist/esm/utils/index.js +13 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/{lib → esm}/utils/logger.js +17 -31
- package/dist/esm/utils/logger.js.map +1 -0
- package/package.json +11 -2
- package/dist/__tests__/deleverageEstimate.unit.test.d.ts +0 -10
- package/dist/__tests__/deleverageEstimate.unit.test.d.ts.map +0 -1
- package/dist/__tests__/deleverageEstimate.unit.test.js +0 -116
- package/dist/__tests__/deleverageEstimate.unit.test.js.map +0 -1
- package/dist/__tests__/findBestLeverageRoute.test.d.ts +0 -12
- package/dist/__tests__/findBestLeverageRoute.test.d.ts.map +0 -1
- package/dist/__tests__/findBestLeverageRoute.test.js +0 -177
- package/dist/__tests__/findBestLeverageRoute.test.js.map +0 -1
- package/dist/__tests__/getAssetApy.test.d.ts +0 -2
- package/dist/__tests__/getAssetApy.test.d.ts.map +0 -1
- package/dist/__tests__/getAssetApy.test.js +0 -133
- package/dist/__tests__/getAssetApy.test.js.map +0 -1
- package/dist/__tests__/getAssetRiskParams.test.d.ts +0 -11
- package/dist/__tests__/getAssetRiskParams.test.d.ts.map +0 -1
- package/dist/__tests__/getAssetRiskParams.test.js +0 -183
- package/dist/__tests__/getAssetRiskParams.test.js.map +0 -1
- package/dist/__tests__/internal.getAssetApy.test.d.ts +0 -2
- package/dist/__tests__/internal.getAssetApy.test.d.ts.map +0 -1
- package/dist/__tests__/internal.getAssetApy.test.js +0 -140
- package/dist/__tests__/internal.getAssetApy.test.js.map +0 -1
- package/dist/__tests__/internal.getAssetRiskParams.test.d.ts +0 -22
- package/dist/__tests__/internal.getAssetRiskParams.test.d.ts.map +0 -1
- package/dist/__tests__/internal.getAssetRiskParams.test.js +0 -194
- package/dist/__tests__/internal.getAssetRiskParams.test.js.map +0 -1
- package/dist/__tests__/internal.getPosition.test.d.ts +0 -22
- package/dist/__tests__/internal.getPosition.test.d.ts.map +0 -1
- package/dist/__tests__/internal.getPosition.test.js +0 -153
- package/dist/__tests__/internal.getPosition.test.js.map +0 -1
- package/dist/__tests__/leveragePreview.unit.test.d.ts +0 -10
- package/dist/__tests__/leveragePreview.unit.test.d.ts.map +0 -1
- package/dist/__tests__/leveragePreview.unit.test.js +0 -168
- package/dist/__tests__/leveragePreview.unit.test.js.map +0 -1
- package/dist/__tests__/leverageRoute.unit.test.d.ts +0 -10
- package/dist/__tests__/leverageRoute.unit.test.d.ts.map +0 -1
- package/dist/__tests__/leverageRoute.unit.test.js +0 -159
- package/dist/__tests__/leverageRoute.unit.test.js.map +0 -1
- package/dist/__tests__/previewLeverage.test.d.ts +0 -13
- package/dist/__tests__/previewLeverage.test.d.ts.map +0 -1
- package/dist/__tests__/previewLeverage.test.js +0 -217
- package/dist/__tests__/previewLeverage.test.js.map +0 -1
- package/dist/__tests__/sdk.bestRoute.test.d.ts +0 -22
- package/dist/__tests__/sdk.bestRoute.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.bestRoute.test.js +0 -186
- package/dist/__tests__/sdk.bestRoute.test.js.map +0 -1
- package/dist/__tests__/sdk.bestRoute.unit.test.d.ts +0 -16
- package/dist/__tests__/sdk.bestRoute.unit.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.bestRoute.unit.test.js +0 -165
- package/dist/__tests__/sdk.bestRoute.unit.test.js.map +0 -1
- package/dist/__tests__/sdk.deleverage.test.d.ts +0 -21
- package/dist/__tests__/sdk.deleverage.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.deleverage.test.js +0 -130
- package/dist/__tests__/sdk.deleverage.test.js.map +0 -1
- package/dist/__tests__/sdk.deleverage.unit.test.d.ts +0 -21
- package/dist/__tests__/sdk.deleverage.unit.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.deleverage.unit.test.js +0 -141
- package/dist/__tests__/sdk.deleverage.unit.test.js.map +0 -1
- package/dist/__tests__/sdk.leverage.test.d.ts +0 -19
- package/dist/__tests__/sdk.leverage.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.leverage.test.js +0 -188
- package/dist/__tests__/sdk.leverage.test.js.map +0 -1
- package/dist/__tests__/sdk.portfolio.test.d.ts +0 -17
- package/dist/__tests__/sdk.portfolio.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.portfolio.test.js +0 -162
- package/dist/__tests__/sdk.portfolio.test.js.map +0 -1
- package/dist/__tests__/sdk.position.test.d.ts +0 -16
- package/dist/__tests__/sdk.position.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.position.test.js +0 -193
- package/dist/__tests__/sdk.position.test.js.map +0 -1
- package/dist/__tests__/sdk.preview.test.d.ts +0 -23
- package/dist/__tests__/sdk.preview.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.preview.test.js +0 -226
- package/dist/__tests__/sdk.preview.test.js.map +0 -1
- package/dist/__tests__/sdk.preview.unit.test.d.ts +0 -18
- package/dist/__tests__/sdk.preview.unit.test.d.ts.map +0 -1
- package/dist/__tests__/sdk.preview.unit.test.js +0 -175
- package/dist/__tests__/sdk.preview.unit.test.js.map +0 -1
- package/dist/__tests__/utils.normalizeCoinType.test.d.ts +0 -7
- package/dist/__tests__/utils.normalizeCoinType.test.d.ts.map +0 -1
- package/dist/__tests__/utils.normalizeCoinType.test.js +0 -42
- package/dist/__tests__/utils.normalizeCoinType.test.js.map +0 -1
- package/dist/lib/navi_calculations.d.ts +0 -76
- package/dist/lib/navi_calculations.d.ts.map +0 -1
- package/dist/lib/navi_calculations.js +0 -185
- package/dist/lib/navi_calculations.js.map +0 -1
- package/dist/lib/scallop/flash-loan-client.d.ts +0 -88
- package/dist/lib/scallop/flash-loan-client.d.ts.map +0 -1
- package/dist/lib/scallop/flash-loan-client.js.map +0 -1
- package/dist/lib/scallop/flash-loan.d.ts +0 -30
- package/dist/lib/scallop/flash-loan.d.ts.map +0 -1
- package/dist/lib/scallop/flash-loan.js +0 -61
- package/dist/lib/scallop/flash-loan.js.map +0 -1
- package/dist/lib/scallop/index.d.ts +0 -3
- package/dist/lib/scallop/index.d.ts.map +0 -1
- package/dist/lib/scallop/index.js +0 -7
- package/dist/lib/scallop/index.js.map +0 -1
- package/dist/lib/scallop/scallop-addresses.d.ts +0 -24
- package/dist/lib/scallop/scallop-addresses.d.ts.map +0 -1
- package/dist/lib/scallop/scallop-addresses.js +0 -67
- package/dist/lib/scallop/scallop-addresses.js.map +0 -1
- package/dist/lib/scallop/scallop-builder.d.ts +0 -96
- package/dist/lib/scallop/scallop-builder.d.ts.map +0 -1
- package/dist/lib/scallop/scallop-builder.js +0 -163
- package/dist/lib/scallop/scallop-builder.js.map +0 -1
- package/dist/lib/suilend/calculators.d.ts +0 -44
- package/dist/lib/suilend/calculators.d.ts.map +0 -1
- package/dist/lib/suilend/calculators.js.map +0 -1
- package/dist/lib/suilend/const.d.ts +0 -9
- package/dist/lib/suilend/const.d.ts.map +0 -1
- package/dist/lib/suilend/const.js +0 -164
- package/dist/lib/suilend/suilend.d.ts +0 -15
- package/dist/lib/suilend/suilend.d.ts.map +0 -1
- package/dist/lib/suilend/suilend.js.map +0 -1
- package/dist/lib/utils/coin.d.ts +0 -21
- package/dist/lib/utils/coin.d.ts.map +0 -1
- package/dist/lib/utils/coin.js +0 -50
- package/dist/lib/utils/coin.js.map +0 -1
- package/dist/lib/utils/format.d.ts +0 -24
- package/dist/lib/utils/format.d.ts.map +0 -1
- package/dist/lib/utils/format.js.map +0 -1
- package/dist/lib/utils/index.d.ts +0 -9
- package/dist/lib/utils/index.d.ts.map +0 -1
- package/dist/lib/utils/index.js +0 -25
- package/dist/lib/utils/index.js.map +0 -1
- package/dist/lib/utils/logger.d.ts +0 -30
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js.map +0 -1
- package/dist/protocols/interface.d.ts +0 -129
- package/dist/protocols/interface.d.ts.map +0 -1
- package/dist/protocols/interface.js +0 -8
- package/dist/protocols/interface.js.map +0 -1
- package/dist/protocols/navi.d.ts +0 -34
- package/dist/protocols/navi.d.ts.map +0 -1
- package/dist/protocols/navi.js +0 -263
- package/dist/protocols/navi.js.map +0 -1
- package/dist/protocols/scallop.d.ts +0 -297
- package/dist/protocols/scallop.d.ts.map +0 -1
- package/dist/protocols/scallop.js.map +0 -1
- package/dist/protocols/suilend.d.ts +0 -29
- package/dist/protocols/suilend.d.ts.map +0 -1
- package/dist/protocols/suilend.js +0 -313
- package/dist/protocols/suilend.js.map +0 -1
- package/dist/types.d.ts +0 -188
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -22
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeFi Dash SDK
|
|
3
|
+
*
|
|
4
|
+
* Multi-protocol DeFi SDK for Sui blockchain integrating leverage strategies,
|
|
5
|
+
* flash loans, and lending protocols.
|
|
6
|
+
*
|
|
7
|
+
* @module defi-dash-sdk
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { DefiDashSDK, LendingProtocol } from 'defi-dash-sdk';
|
|
12
|
+
*
|
|
13
|
+
* const sdk = await DefiDashSDK.create(suiClient, keypair);
|
|
14
|
+
*
|
|
15
|
+
* // Build leverage transaction
|
|
16
|
+
* const tx = new Transaction();
|
|
17
|
+
* tx.setSender(address);
|
|
18
|
+
* await sdk.buildLeverageTransaction(tx, {
|
|
19
|
+
* protocol: LendingProtocol.Suilend,
|
|
20
|
+
* depositAsset: 'LBTC',
|
|
21
|
+
* depositAmount: '0.001',
|
|
22
|
+
* multiplier: 2.0,
|
|
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 });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
// Main SDK
|
|
33
|
+
export { DefiDashSDK } from './sdk';
|
|
34
|
+
// Enums & Constants
|
|
35
|
+
export { LendingProtocol, USDC_COIN_TYPE, SUI_COIN_TYPE, COIN_TYPES, } from './types';
|
|
36
|
+
// Utilities (frontend-facing only)
|
|
37
|
+
export { formatUnits, parseUnits } from './utils/format';
|
|
38
|
+
export { normalizeCoinType } from './utils/coin';
|
|
39
|
+
export { DefiDashError, SDKNotInitializedError, InvalidParameterError, InvalidCoinTypeError, } from './utils/errors';
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,oBAAoB;AACpB,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,UAAU,GACX,MAAM,SAAS,CAAC;AA2BjB,mCAAmC;AACnC,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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Protocol Adapter
|
|
3
|
+
*
|
|
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)
|
|
13
|
+
*/
|
|
14
|
+
import { normalizeCoinType } from "../utils";
|
|
15
|
+
/**
|
|
16
|
+
* Abstract base class for protocol adapters.
|
|
17
|
+
*
|
|
18
|
+
* Provides common utilities (SuiClient management, coin normalization).
|
|
19
|
+
* All ILendingProtocol methods are declared abstract — subclasses MUST implement them.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* export class NewProtocolAdapter extends BaseProtocolAdapter {
|
|
24
|
+
* readonly name = "new-protocol";
|
|
25
|
+
* readonly consumesRepaymentCoin = false;
|
|
26
|
+
*
|
|
27
|
+
* async initialize(suiClient: SuiClient): Promise<void> {
|
|
28
|
+
* await super.initialize(suiClient);
|
|
29
|
+
* // protocol-specific init
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* // All abstract methods must be implemented:
|
|
33
|
+
* async getPosition(userAddress: string) { ... }
|
|
34
|
+
* async deposit(tx, coin, coinType, userAddress) { ... }
|
|
35
|
+
* async withdraw(tx, coinType, amount, userAddress) { ... }
|
|
36
|
+
* async borrow(tx, coinType, amount, userAddress) { ... }
|
|
37
|
+
* async repay(tx, coinType, coin, userAddress) { ... }
|
|
38
|
+
* async refreshOracles(tx, coinTypes, userAddress) { ... }
|
|
39
|
+
* async getAccountPortfolio(address) { ... }
|
|
40
|
+
* async getAssetRiskParams(coinType) { ... }
|
|
41
|
+
* async getAssetApy(coinType) { ... }
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class BaseProtocolAdapter {
|
|
46
|
+
constructor() {
|
|
47
|
+
this.initialized = false;
|
|
48
|
+
}
|
|
49
|
+
// ── Base implementation ──────────────────────────────────────────────────
|
|
50
|
+
async initialize(suiClient) {
|
|
51
|
+
this.suiClient = suiClient;
|
|
52
|
+
this.initialized = true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Optional: clear pending state between transactions.
|
|
56
|
+
* Override in subclass if needed (e.g., Scallop obligation tracking).
|
|
57
|
+
*/
|
|
58
|
+
clearPendingState() {
|
|
59
|
+
// no-op by default
|
|
60
|
+
}
|
|
61
|
+
// ── Protected utilities ──────────────────────────────────────────────────
|
|
62
|
+
ensureInitialized() {
|
|
63
|
+
if (!this.initialized) {
|
|
64
|
+
throw new Error(`${this.name} adapter not initialized`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
normalizeCoin(coinType) {
|
|
68
|
+
return normalizeCoinType(coinType);
|
|
69
|
+
}
|
|
70
|
+
formatAmount(amount, decimals) {
|
|
71
|
+
return Number(amount) / Math.pow(10, decimals);
|
|
72
|
+
}
|
|
73
|
+
parseAmount(amount, decimals) {
|
|
74
|
+
const value = typeof amount === "string" ? parseFloat(amount) : amount;
|
|
75
|
+
return BigInt(Math.floor(value * Math.pow(10, decimals)));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=base-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../../../src/protocols/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,OAAgB,mBAAmB;IAAzC;QAEY,gBAAW,GAAG,KAAK,CAAC;IAuFhC,CAAC;IAnCC,4EAA4E;IAE5E,KAAK,CAAC,UAAU,CAAC,SAAoB;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,iBAAiB;QACf,mBAAmB;IACrB,CAAC;IAED,4EAA4E;IAElE,iBAAiB;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAES,aAAa,CAAC,QAAgB;QACtC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAES,YAAY,CAAC,MAAc,EAAE,QAAgB;QACrD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAES,WAAW,CAAC,MAAuB,EAAE,QAAgB;QAC7D,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACvE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeFi Dash SDK - Protocol Adapters
|
|
3
|
+
*/
|
|
4
|
+
export { BaseProtocolAdapter } from "./base-adapter";
|
|
5
|
+
export { SuilendAdapter } from "./suilend/adapter";
|
|
6
|
+
export { NaviAdapter } from "./navi/adapter";
|
|
7
|
+
export { ScallopAdapter } from "./scallop/adapter";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protocols/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeFi Dash SDK - Navi Protocol Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements ILendingProtocol for Navi
|
|
5
|
+
*/
|
|
6
|
+
import { depositCoinPTB, withdrawCoinPTB, borrowCoinPTB, repayCoinPTB, getPools, getLendingState, updateOraclePricesPTB, getPriceFeeds, getHealthFactor, } from "@naviprotocol/lending";
|
|
7
|
+
import { USDC_COIN_TYPE, LendingProtocol, } from "../../types";
|
|
8
|
+
import { normalizeCoinType } from "../../utils";
|
|
9
|
+
import { getReserveByCoinType } from "../suilend/constants";
|
|
10
|
+
import { getTokenPrice } from "@7kprotocol/sdk-ts";
|
|
11
|
+
// Navi SDK returns balances with 9 decimal precision internally
|
|
12
|
+
const NAVI_BALANCE_DECIMALS = 9;
|
|
13
|
+
/**
|
|
14
|
+
* Navi lending protocol adapter
|
|
15
|
+
*/
|
|
16
|
+
export class NaviAdapter {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.name = "navi";
|
|
19
|
+
this.consumesRepaymentCoin = true; // Navi's repayCoinPTB consumes entire coin
|
|
20
|
+
this.pools = [];
|
|
21
|
+
this.priceFeeds = [];
|
|
22
|
+
this.initialized = false;
|
|
23
|
+
}
|
|
24
|
+
async initialize(suiClient) {
|
|
25
|
+
this.suiClient = suiClient;
|
|
26
|
+
// Fetch pools
|
|
27
|
+
const poolsResult = await getPools({ env: "prod" });
|
|
28
|
+
this.pools = Array.isArray(poolsResult)
|
|
29
|
+
? poolsResult
|
|
30
|
+
: Object.values(poolsResult);
|
|
31
|
+
// Fetch price feeds
|
|
32
|
+
this.priceFeeds = await getPriceFeeds({ env: "prod" });
|
|
33
|
+
this.initialized = true;
|
|
34
|
+
}
|
|
35
|
+
ensureInitialized() {
|
|
36
|
+
if (!this.initialized) {
|
|
37
|
+
throw new Error("NaviAdapter not initialized. Call initialize() first.");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
getPool(coinType) {
|
|
41
|
+
const normalized = normalizeCoinType(coinType);
|
|
42
|
+
return this.pools.find((p) => {
|
|
43
|
+
const poolCoinType = normalizeCoinType(p.coinType ?? p.suiCoinType ?? "");
|
|
44
|
+
return poolCoinType === normalized;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
getPriceFeed(coinType) {
|
|
48
|
+
const normalized = normalizeCoinType(coinType);
|
|
49
|
+
return this.priceFeeds.find((f) => normalizeCoinType(f.coinType) === normalized);
|
|
50
|
+
}
|
|
51
|
+
async getPosition(userAddress) {
|
|
52
|
+
this.ensureInitialized();
|
|
53
|
+
const lendingState = await getLendingState(userAddress, { env: "prod" });
|
|
54
|
+
if (lendingState.length === 0)
|
|
55
|
+
return null;
|
|
56
|
+
const activePositions = lendingState.filter((p) => BigInt(p.supplyBalance) > 0 || BigInt(p.borrowBalance) > 0);
|
|
57
|
+
if (activePositions.length === 0)
|
|
58
|
+
return null;
|
|
59
|
+
// Build all supply and borrow positions
|
|
60
|
+
const supplies = [];
|
|
61
|
+
const allBorrows = [];
|
|
62
|
+
for (const pos of activePositions) {
|
|
63
|
+
const poolCoinType = normalizeCoinType(pos.pool.coinType);
|
|
64
|
+
const reserve = getReserveByCoinType(poolCoinType);
|
|
65
|
+
const decimals = reserve?.decimals || 9;
|
|
66
|
+
const symbol = reserve?.symbol || poolCoinType.split("::").pop() || "???";
|
|
67
|
+
if (BigInt(pos.supplyBalance) > 0) {
|
|
68
|
+
const amount = BigInt(pos.supplyBalance);
|
|
69
|
+
const price = await getTokenPrice(poolCoinType);
|
|
70
|
+
supplies.push({
|
|
71
|
+
amount,
|
|
72
|
+
symbol,
|
|
73
|
+
coinType: poolCoinType,
|
|
74
|
+
decimals: NAVI_BALANCE_DECIMALS, // Navi uses 9 decimals internally
|
|
75
|
+
valueUsd: (Number(amount) / Math.pow(10, NAVI_BALANCE_DECIMALS)) * price,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (BigInt(pos.borrowBalance) > 0) {
|
|
79
|
+
const rawAmount = BigInt(pos.borrowBalance);
|
|
80
|
+
// Convert from Navi's 9 decimal precision to native decimals
|
|
81
|
+
const amount = rawAmount / BigInt(10 ** (NAVI_BALANCE_DECIMALS - decimals));
|
|
82
|
+
const price = await getTokenPrice(poolCoinType);
|
|
83
|
+
allBorrows.push({
|
|
84
|
+
amount,
|
|
85
|
+
symbol,
|
|
86
|
+
coinType: poolCoinType,
|
|
87
|
+
decimals,
|
|
88
|
+
valueUsd: (Number(amount) / Math.pow(10, decimals)) * price,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Primary = largest by USD value
|
|
93
|
+
const collateral = [...supplies].sort((a, b) => b.valueUsd - a.valueUsd)[0] ?? null;
|
|
94
|
+
if (!collateral)
|
|
95
|
+
return null;
|
|
96
|
+
const debt = allBorrows.length > 0
|
|
97
|
+
? [...allBorrows].sort((a, b) => b.valueUsd - a.valueUsd)[0]
|
|
98
|
+
: null;
|
|
99
|
+
const totalSupplyUsd = supplies.reduce((s, p) => s + p.valueUsd, 0);
|
|
100
|
+
const totalDebtUsd = allBorrows.reduce((s, p) => s + p.valueUsd, 0);
|
|
101
|
+
return {
|
|
102
|
+
collateral,
|
|
103
|
+
debt: debt || {
|
|
104
|
+
amount: 0n,
|
|
105
|
+
symbol: "USDC",
|
|
106
|
+
coinType: normalizeCoinType(USDC_COIN_TYPE),
|
|
107
|
+
decimals: 6,
|
|
108
|
+
valueUsd: 0,
|
|
109
|
+
},
|
|
110
|
+
supplies,
|
|
111
|
+
borrows: allBorrows,
|
|
112
|
+
netValueUsd: totalSupplyUsd - totalDebtUsd,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async deposit(tx, coin, coinType, userAddress) {
|
|
116
|
+
this.ensureInitialized();
|
|
117
|
+
const pool = this.getPool(coinType);
|
|
118
|
+
if (!pool) {
|
|
119
|
+
throw new Error(`Pool not found for ${coinType}`);
|
|
120
|
+
}
|
|
121
|
+
// Navi's depositCoinPTB expects the coin directly
|
|
122
|
+
await depositCoinPTB(tx, pool, coin, {
|
|
123
|
+
env: "prod",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async withdraw(tx, coinType, amount, userAddress) {
|
|
127
|
+
this.ensureInitialized();
|
|
128
|
+
const pool = this.getPool(coinType);
|
|
129
|
+
if (!pool) {
|
|
130
|
+
throw new Error(`Pool not found for ${coinType}`);
|
|
131
|
+
}
|
|
132
|
+
const withdrawnCoin = await withdrawCoinPTB(tx, pool, Number(amount), { env: "prod" });
|
|
133
|
+
return withdrawnCoin;
|
|
134
|
+
}
|
|
135
|
+
async borrow(tx, coinType, amount, userAddress, skipOracle = false) {
|
|
136
|
+
this.ensureInitialized();
|
|
137
|
+
const pool = this.getPool(coinType);
|
|
138
|
+
if (!pool) {
|
|
139
|
+
throw new Error(`Pool not found for ${coinType}`);
|
|
140
|
+
}
|
|
141
|
+
const borrowedCoin = await borrowCoinPTB(tx, pool, Number(amount), {
|
|
142
|
+
env: "prod",
|
|
143
|
+
});
|
|
144
|
+
return borrowedCoin;
|
|
145
|
+
}
|
|
146
|
+
async repay(tx, coinType, coin, userAddress) {
|
|
147
|
+
this.ensureInitialized();
|
|
148
|
+
const pool = this.getPool(coinType);
|
|
149
|
+
if (!pool) {
|
|
150
|
+
throw new Error(`Pool not found for ${coinType}`);
|
|
151
|
+
}
|
|
152
|
+
await repayCoinPTB(tx, pool, coin, {
|
|
153
|
+
env: "prod",
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
async refreshOracles(tx, coinTypes, _userAddress) {
|
|
157
|
+
this.ensureInitialized();
|
|
158
|
+
// Navi's calculator::calculate_value requires ALL pool oracles to be fresh,
|
|
159
|
+
// not just the assets being operated on. Refresh all available feeds to avoid
|
|
160
|
+
// abort 1502 during withdraw/borrow health factor checks.
|
|
161
|
+
const feedsToUpdate = this.priceFeeds.length > 0 ? this.priceFeeds : coinTypes
|
|
162
|
+
.map((ct) => this.getPriceFeed(ct))
|
|
163
|
+
.filter(Boolean);
|
|
164
|
+
if (feedsToUpdate.length > 0) {
|
|
165
|
+
await updateOraclePricesPTB(tx, feedsToUpdate, {
|
|
166
|
+
env: "prod",
|
|
167
|
+
updatePythPriceFeeds: true,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get aggregated portfolio
|
|
173
|
+
*/
|
|
174
|
+
async getAccountPortfolio(address) {
|
|
175
|
+
this.ensureInitialized();
|
|
176
|
+
const [lendingState, healthFactor] = await Promise.all([
|
|
177
|
+
getLendingState(address, { env: "prod" }),
|
|
178
|
+
getHealthFactor(address, { env: "prod" }),
|
|
179
|
+
]);
|
|
180
|
+
const positions = [];
|
|
181
|
+
let totalCollateralUsd = 0;
|
|
182
|
+
let totalDebtUsd = 0;
|
|
183
|
+
let borrowLimitUsd = 0;
|
|
184
|
+
let liquidationThresholdUsd = 0;
|
|
185
|
+
for (const state of lendingState) {
|
|
186
|
+
const coinType = normalizeCoinType(state.coinType ?? state.pool?.coinType ?? "");
|
|
187
|
+
const reserve = getReserveByCoinType(coinType);
|
|
188
|
+
const symbol = reserve?.symbol || "UNKNOWN";
|
|
189
|
+
const price = parseFloat(state.pool?.oracle?.price ?? state.pool?.price ?? "0");
|
|
190
|
+
const supplyRaw = BigInt(state.supplyBalance ?? 0);
|
|
191
|
+
const borrowRaw = BigInt(state.borrowBalance ?? 0);
|
|
192
|
+
// Return APY as decimal (e.g., 0.03 for 3%) to match Suilend format
|
|
193
|
+
// Navi returns APY in percentage (e.g., 3.161 for 3.161%)
|
|
194
|
+
// Convert to decimal to match Suilend format
|
|
195
|
+
const getApy = (raw) => {
|
|
196
|
+
const val = parseFloat(raw ?? "0");
|
|
197
|
+
return val / 100;
|
|
198
|
+
};
|
|
199
|
+
if (supplyRaw > 0) {
|
|
200
|
+
// Navi internal balances are 9 decimals
|
|
201
|
+
const amount = Number(supplyRaw) / Math.pow(10, NAVI_BALANCE_DECIMALS);
|
|
202
|
+
const valueUsd = amount * price;
|
|
203
|
+
totalCollateralUsd += valueUsd;
|
|
204
|
+
// Get LTV and liquidation threshold from pool
|
|
205
|
+
const liqThreshold = parseFloat(state.pool?.liquidationFactor?.threshold ?? "0.8");
|
|
206
|
+
const ltv = liqThreshold - 0.05; // Safety margin, same as getMarkets
|
|
207
|
+
borrowLimitUsd += valueUsd * ltv;
|
|
208
|
+
liquidationThresholdUsd += valueUsd * liqThreshold;
|
|
209
|
+
const supplyApy = getApy(state.pool?.supplyApy ?? state.pool?.supplyIncentiveApyInfo?.apy);
|
|
210
|
+
positions.push({
|
|
211
|
+
protocol: LendingProtocol.Navi,
|
|
212
|
+
symbol,
|
|
213
|
+
coinType,
|
|
214
|
+
side: "supply",
|
|
215
|
+
amount,
|
|
216
|
+
valueUsd,
|
|
217
|
+
apy: supplyApy,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
if (borrowRaw > 0) {
|
|
221
|
+
const amount = Number(borrowRaw) / Math.pow(10, NAVI_BALANCE_DECIMALS);
|
|
222
|
+
const valueUsd = amount * price;
|
|
223
|
+
totalDebtUsd += valueUsd;
|
|
224
|
+
const borrowApy = getApy(state.pool?.borrowApy ?? state.pool?.borrowIncentiveApyInfo?.apy);
|
|
225
|
+
positions.push({
|
|
226
|
+
protocol: LendingProtocol.Navi,
|
|
227
|
+
symbol,
|
|
228
|
+
coinType,
|
|
229
|
+
side: "borrow",
|
|
230
|
+
amount,
|
|
231
|
+
valueUsd,
|
|
232
|
+
apy: borrowApy,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Calculate net APY and annual earnings
|
|
237
|
+
const netValueUsd = totalCollateralUsd - totalDebtUsd;
|
|
238
|
+
let weightedSupplyApy = 0;
|
|
239
|
+
let weightedBorrowApy = 0;
|
|
240
|
+
for (const pos of positions) {
|
|
241
|
+
if (pos.side === "supply" && totalCollateralUsd > 0) {
|
|
242
|
+
weightedSupplyApy += (pos.valueUsd / totalCollateralUsd) * pos.apy;
|
|
243
|
+
}
|
|
244
|
+
else if (pos.side === "borrow" && totalDebtUsd > 0) {
|
|
245
|
+
weightedBorrowApy += (pos.valueUsd / totalDebtUsd) * pos.apy;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Net APY on equity = (supply earnings - borrow costs) / net value
|
|
249
|
+
const supplyEarnings = totalCollateralUsd * weightedSupplyApy;
|
|
250
|
+
const borrowCosts = totalDebtUsd * weightedBorrowApy;
|
|
251
|
+
const netApy = netValueUsd > 0 ? (supplyEarnings - borrowCosts) / netValueUsd : 0;
|
|
252
|
+
const totalAnnualNetEarningsUsd = supplyEarnings - borrowCosts;
|
|
253
|
+
return {
|
|
254
|
+
protocol: LendingProtocol.Navi,
|
|
255
|
+
address,
|
|
256
|
+
healthFactor: parseFloat(healthFactor.toString()),
|
|
257
|
+
netValueUsd,
|
|
258
|
+
totalCollateralUsd,
|
|
259
|
+
totalDepositedUsd: totalCollateralUsd,
|
|
260
|
+
totalDebtUsd,
|
|
261
|
+
weightedBorrowsUsd: totalDebtUsd, // Navi uses 1:1 weight for borrows
|
|
262
|
+
borrowLimitUsd,
|
|
263
|
+
liquidationThresholdUsd,
|
|
264
|
+
positions,
|
|
265
|
+
netApy,
|
|
266
|
+
totalAnnualNetEarningsUsd,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Get asset risk parameters for leverage calculations
|
|
271
|
+
*
|
|
272
|
+
* Navi uses:
|
|
273
|
+
* - ltv: Loan-to-Value ratio (RAY format, 10^27)
|
|
274
|
+
* - liquidation_threshold: Liquidation threshold from pool config
|
|
275
|
+
* - liquidation_bonus: Liquidation bonus from pool config
|
|
276
|
+
*/
|
|
277
|
+
async getAssetRiskParams(coinType) {
|
|
278
|
+
this.ensureInitialized();
|
|
279
|
+
const pool = this.getPool(coinType);
|
|
280
|
+
if (!pool) {
|
|
281
|
+
// Fallback to conservative defaults
|
|
282
|
+
return {
|
|
283
|
+
ltv: 0.5,
|
|
284
|
+
liquidationThreshold: 0.6,
|
|
285
|
+
liquidationBonus: 0.05,
|
|
286
|
+
maxMultiplier: 2.0,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// Navi stores ltv as a string/number that may be in RAY format (10^27) or percentage
|
|
290
|
+
// Common values: 650000000000000000000000000 (65% in RAY) or 0.65 or 65
|
|
291
|
+
let ltv = 0.5;
|
|
292
|
+
if (pool.ltv) {
|
|
293
|
+
const ltvValue = parseFloat(pool.ltv.toString());
|
|
294
|
+
// If value is very large (RAY format: 10^27), normalize
|
|
295
|
+
if (ltvValue > 1e20) {
|
|
296
|
+
ltv = ltvValue / 1e27;
|
|
297
|
+
}
|
|
298
|
+
else if (ltvValue > 1) {
|
|
299
|
+
// Percentage format (e.g., 65 = 65%)
|
|
300
|
+
ltv = ltvValue / 100;
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
// Already 0-1 format
|
|
304
|
+
ltv = ltvValue;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Parse liquidation threshold similarly
|
|
308
|
+
let liquidationThreshold = 0.7;
|
|
309
|
+
if (pool.liquidationThreshold) {
|
|
310
|
+
const thresholdValue = parseFloat(pool.liquidationThreshold.toString());
|
|
311
|
+
if (thresholdValue > 1e20) {
|
|
312
|
+
liquidationThreshold = thresholdValue / 1e27;
|
|
313
|
+
}
|
|
314
|
+
else if (thresholdValue > 1) {
|
|
315
|
+
liquidationThreshold = thresholdValue / 100;
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
liquidationThreshold = thresholdValue;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Parse liquidation bonus
|
|
322
|
+
let liquidationBonus = 0.05;
|
|
323
|
+
if (pool.liquidationBonus) {
|
|
324
|
+
const bonusValue = parseFloat(pool.liquidationBonus.toString());
|
|
325
|
+
if (bonusValue > 1e20) {
|
|
326
|
+
liquidationBonus = bonusValue / 1e27;
|
|
327
|
+
}
|
|
328
|
+
else if (bonusValue > 1) {
|
|
329
|
+
liquidationBonus = bonusValue / 100;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
liquidationBonus = bonusValue;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// Calculate max multiplier: 1 / (1 - ltv)
|
|
336
|
+
const maxMultiplier = ltv > 0 && ltv < 1 ? 1 / (1 - ltv) : 1;
|
|
337
|
+
return {
|
|
338
|
+
ltv,
|
|
339
|
+
liquidationThreshold,
|
|
340
|
+
liquidationBonus,
|
|
341
|
+
maxMultiplier,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get current supply/borrow APY for an asset.
|
|
346
|
+
*
|
|
347
|
+
* Navi's Pool object (from getPools) already contains:
|
|
348
|
+
* - currentBorrowRate: raw per-second borrow rate
|
|
349
|
+
* - currentSupplyRate: raw per-second supply rate
|
|
350
|
+
* - supplyIncentiveApyInfo.apy / borrowIncentiveApyInfo.apy: incentive APY (as a string percent)
|
|
351
|
+
*
|
|
352
|
+
* We convert raw per-second rates to per-year APR then add incentive APY.
|
|
353
|
+
*/
|
|
354
|
+
async getAssetApy(coinType) {
|
|
355
|
+
this.ensureInitialized();
|
|
356
|
+
const pool = this.getPool(coinType);
|
|
357
|
+
if (!pool) {
|
|
358
|
+
throw new Error(`Navi: pool not found for ${normalizeCoinType(coinType)}`);
|
|
359
|
+
}
|
|
360
|
+
// Navi's Pool (from getPools) already exposes pre-computed APY info:
|
|
361
|
+
// supplyIncentiveApyInfo.apy = effective supply APY (% string, e.g. "2.96")
|
|
362
|
+
// supplyIncentiveApyInfo.vaultApr = base supply APR before incentives
|
|
363
|
+
// borrowIncentiveApyInfo.vaultApr = gross borrow cost (% string)
|
|
364
|
+
// borrowIncentiveApyInfo.apy = net borrow APY after borrow incentives
|
|
365
|
+
//
|
|
366
|
+
// We use vaultApr as the base supply APY and borrowIncentiveApyInfo.vaultApr
|
|
367
|
+
// as the borrow APY (gross cost to borrower).
|
|
368
|
+
// Reward APY = supplyIncentiveApyInfo.apy - supplyIncentiveApyInfo.vaultApr
|
|
369
|
+
// (difference attributable to staking yield, vault rewards, etc.)
|
|
370
|
+
const supplyInfo = pool.supplyIncentiveApyInfo ?? {};
|
|
371
|
+
const borrowInfo = pool.borrowIncentiveApyInfo ?? {};
|
|
372
|
+
// Base supply APR (e.g., "2.96" → 0.0296)
|
|
373
|
+
const baseSupplyApr = parseFloat(supplyInfo.vaultApr ?? "0") / 100;
|
|
374
|
+
// Total effective supply APY including staking/vault rewards
|
|
375
|
+
const totalSupplyApy = parseFloat(supplyInfo.apy ?? "0") / 100;
|
|
376
|
+
// Extra reward beyond base (staking yield etc.)
|
|
377
|
+
const rewardApy = Math.max(0, totalSupplyApy - baseSupplyApr);
|
|
378
|
+
// Gross borrow APR (what borrowers pay before incentives)
|
|
379
|
+
const grossBorrowApr = parseFloat(borrowInfo.vaultApr ?? "0") / 100;
|
|
380
|
+
// Net effective borrow cost after borrow incentive rebates
|
|
381
|
+
// borrowInfo.apy = grossBorrowApr - boostedApr (rebate from NAVX/reward tokens)
|
|
382
|
+
const netBorrowApy = parseFloat(borrowInfo.apy ?? borrowInfo.vaultApr ?? "0") / 100;
|
|
383
|
+
const borrowRewardApy = Math.max(0, grossBorrowApr - netBorrowApy);
|
|
384
|
+
return {
|
|
385
|
+
supplyApy: baseSupplyApr,
|
|
386
|
+
rewardApy,
|
|
387
|
+
totalSupplyApy,
|
|
388
|
+
borrowApy: netBorrowApy,
|
|
389
|
+
borrowRewardApy,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/protocols/navi/adapter.ts"],"names":[],"mappings":"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"}
|