defi-dash-sdk 0.1.3 → 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.
Files changed (236) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +199 -97
  3. package/dist/esm/index.js +40 -0
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/esm/protocols/base-adapter.js +78 -0
  6. package/dist/esm/protocols/base-adapter.js.map +1 -0
  7. package/dist/esm/protocols/index.js +8 -0
  8. package/dist/esm/protocols/index.js.map +1 -0
  9. package/dist/esm/protocols/navi/adapter.js +393 -0
  10. package/dist/esm/protocols/navi/adapter.js.map +1 -0
  11. package/dist/{protocols/scallop.js → esm/protocols/scallop/adapter.js} +252 -95
  12. package/dist/esm/protocols/scallop/adapter.js.map +1 -0
  13. package/dist/{lib/scallop/flash-loan-client.js → esm/protocols/scallop/flash-loan.js} +63 -8
  14. package/dist/esm/protocols/scallop/flash-loan.js.map +1 -0
  15. package/dist/esm/protocols/scallop/index.js +6 -0
  16. package/dist/esm/protocols/scallop/index.js.map +1 -0
  17. package/dist/esm/protocols/scallop/types.js +67 -0
  18. package/dist/esm/protocols/scallop/types.js.map +1 -0
  19. package/dist/esm/protocols/suilend/adapter.js +464 -0
  20. package/dist/esm/protocols/suilend/adapter.js.map +1 -0
  21. package/dist/{lib → esm/protocols}/suilend/calculators.js +41 -51
  22. package/dist/esm/protocols/suilend/calculators.js.map +1 -0
  23. package/dist/esm/protocols/suilend/constants.js +159 -0
  24. package/dist/{lib/suilend/const.js.map → esm/protocols/suilend/constants.js.map} +1 -1
  25. package/dist/{lib/suilend/suilend.js → esm/protocols/suilend/types.js} +7 -13
  26. package/dist/esm/protocols/suilend/types.js.map +1 -0
  27. package/dist/esm/sdk.js +569 -0
  28. package/dist/esm/sdk.js.map +1 -0
  29. package/dist/esm/strategies/common.js +75 -0
  30. package/dist/esm/strategies/common.js.map +1 -0
  31. package/dist/esm/strategies/deleverage.js +218 -0
  32. package/dist/esm/strategies/deleverage.js.map +1 -0
  33. package/dist/esm/strategies/index.js +10 -0
  34. package/dist/esm/strategies/index.js.map +1 -0
  35. package/dist/esm/strategies/leverage-preview.js +117 -0
  36. package/dist/esm/strategies/leverage-preview.js.map +1 -0
  37. package/dist/esm/strategies/leverage-route.js +109 -0
  38. package/dist/esm/strategies/leverage-route.js.map +1 -0
  39. package/dist/esm/strategies/leverage.js +156 -0
  40. package/dist/esm/strategies/leverage.js.map +1 -0
  41. package/dist/esm/strategies/scallop-leverage.js +140 -0
  42. package/dist/esm/strategies/scallop-leverage.js.map +1 -0
  43. package/dist/esm/types/common.js +13 -0
  44. package/dist/esm/types/common.js.map +1 -0
  45. package/dist/esm/types/config.js +5 -0
  46. package/dist/esm/types/config.js.map +1 -0
  47. package/dist/esm/types/constants.js +128 -0
  48. package/dist/esm/types/constants.js.map +1 -0
  49. package/dist/esm/types/index.js +10 -0
  50. package/dist/esm/types/index.js.map +1 -0
  51. package/dist/esm/types/position.js +5 -0
  52. package/dist/esm/types/position.js.map +1 -0
  53. package/dist/esm/types/protocol.js +5 -0
  54. package/dist/esm/types/protocol.js.map +1 -0
  55. package/dist/esm/types/strategy.js +5 -0
  56. package/dist/esm/types/strategy.js.map +1 -0
  57. package/dist/esm/utils/calculations.js +33 -0
  58. package/dist/esm/utils/calculations.js.map +1 -0
  59. package/dist/esm/utils/coin.js +54 -0
  60. package/dist/esm/utils/coin.js.map +1 -0
  61. package/dist/esm/utils/errors.js +111 -0
  62. package/dist/esm/utils/errors.js.map +1 -0
  63. package/dist/esm/utils/execution.js +106 -0
  64. package/dist/esm/utils/execution.js.map +1 -0
  65. package/dist/{lib → esm}/utils/format.js +2 -6
  66. package/dist/esm/utils/format.js.map +1 -0
  67. package/dist/esm/utils/gas.js +38 -0
  68. package/dist/esm/utils/gas.js.map +1 -0
  69. package/dist/esm/utils/index.js +13 -0
  70. package/dist/esm/utils/index.js.map +1 -0
  71. package/dist/{lib → esm}/utils/logger.js +17 -31
  72. package/dist/esm/utils/logger.js.map +1 -0
  73. package/dist/index.d.ts +19 -11
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +24 -40
  76. package/dist/index.js.map +1 -1
  77. package/dist/protocols/base-adapter.d.ts +42 -75
  78. package/dist/protocols/base-adapter.d.ts.map +1 -1
  79. package/dist/protocols/base-adapter.js +34 -77
  80. package/dist/protocols/base-adapter.js.map +1 -1
  81. package/dist/protocols/navi/adapter.d.ts +22 -2
  82. package/dist/protocols/navi/adapter.d.ts.map +1 -1
  83. package/dist/protocols/navi/adapter.js +145 -11
  84. package/dist/protocols/navi/adapter.js.map +1 -1
  85. package/dist/protocols/scallop/adapter.d.ts +26 -6
  86. package/dist/protocols/scallop/adapter.d.ts.map +1 -1
  87. package/dist/protocols/scallop/adapter.js +206 -43
  88. package/dist/protocols/scallop/adapter.js.map +1 -1
  89. package/dist/protocols/scallop/flash-loan.d.ts +18 -3
  90. package/dist/protocols/scallop/flash-loan.d.ts.map +1 -1
  91. package/dist/protocols/scallop/flash-loan.js +79 -20
  92. package/dist/protocols/scallop/flash-loan.js.map +1 -1
  93. package/dist/protocols/scallop/types.d.ts.map +1 -1
  94. package/dist/protocols/scallop/types.js +4 -1
  95. package/dist/protocols/scallop/types.js.map +1 -1
  96. package/dist/protocols/suilend/adapter.d.ts +19 -1
  97. package/dist/protocols/suilend/adapter.d.ts.map +1 -1
  98. package/dist/protocols/suilend/adapter.js +196 -51
  99. package/dist/protocols/suilend/adapter.js.map +1 -1
  100. package/dist/sdk.d.ts +107 -148
  101. package/dist/sdk.d.ts.map +1 -1
  102. package/dist/sdk.js +171 -523
  103. package/dist/sdk.js.map +1 -1
  104. package/dist/strategies/common.d.ts +42 -0
  105. package/dist/strategies/common.d.ts.map +1 -0
  106. package/dist/strategies/common.js +81 -0
  107. package/dist/strategies/common.js.map +1 -0
  108. package/dist/strategies/deleverage.d.ts.map +1 -1
  109. package/dist/strategies/deleverage.js +44 -62
  110. package/dist/strategies/deleverage.js.map +1 -1
  111. package/dist/strategies/index.d.ts +9 -1
  112. package/dist/strategies/index.d.ts.map +1 -1
  113. package/dist/strategies/index.js +11 -2
  114. package/dist/strategies/index.js.map +1 -1
  115. package/dist/strategies/leverage-preview.d.ts +27 -0
  116. package/dist/strategies/leverage-preview.d.ts.map +1 -0
  117. package/dist/strategies/leverage-preview.js +120 -0
  118. package/dist/strategies/leverage-preview.js.map +1 -0
  119. package/dist/strategies/leverage-route.d.ts +29 -0
  120. package/dist/strategies/leverage-route.d.ts.map +1 -0
  121. package/dist/strategies/leverage-route.js +112 -0
  122. package/dist/strategies/leverage-route.js.map +1 -0
  123. package/dist/strategies/leverage.d.ts +4 -44
  124. package/dist/strategies/leverage.d.ts.map +1 -1
  125. package/dist/strategies/leverage.js +43 -112
  126. package/dist/strategies/leverage.js.map +1 -1
  127. package/dist/strategies/scallop-leverage.d.ts +34 -0
  128. package/dist/strategies/scallop-leverage.d.ts.map +1 -0
  129. package/dist/strategies/scallop-leverage.js +143 -0
  130. package/dist/strategies/scallop-leverage.js.map +1 -0
  131. package/dist/types/config.d.ts +0 -7
  132. package/dist/types/config.d.ts.map +1 -1
  133. package/dist/types/constants.d.ts +8 -0
  134. package/dist/types/constants.d.ts.map +1 -1
  135. package/dist/types/constants.js +9 -1
  136. package/dist/types/constants.js.map +1 -1
  137. package/dist/types/index.d.ts +3 -3
  138. package/dist/types/index.d.ts.map +1 -1
  139. package/dist/types/index.js +2 -1
  140. package/dist/types/index.js.map +1 -1
  141. package/dist/types/position.d.ts +7 -3
  142. package/dist/types/position.d.ts.map +1 -1
  143. package/dist/types/protocol.d.ts +101 -0
  144. package/dist/types/protocol.d.ts.map +1 -1
  145. package/dist/types/strategy.d.ts +82 -38
  146. package/dist/types/strategy.d.ts.map +1 -1
  147. package/dist/utils/calculations.d.ts +10 -137
  148. package/dist/utils/calculations.d.ts.map +1 -1
  149. package/dist/utils/calculations.js +11 -162
  150. package/dist/utils/calculations.js.map +1 -1
  151. package/dist/utils/coin.d.ts +16 -7
  152. package/dist/utils/coin.d.ts.map +1 -1
  153. package/dist/utils/coin.js +32 -25
  154. package/dist/utils/coin.js.map +1 -1
  155. package/dist/utils/errors.d.ts +0 -18
  156. package/dist/utils/errors.d.ts.map +1 -1
  157. package/dist/utils/errors.js +2 -40
  158. package/dist/utils/errors.js.map +1 -1
  159. package/dist/utils/execution.d.ts +38 -0
  160. package/dist/utils/execution.d.ts.map +1 -0
  161. package/dist/utils/execution.js +110 -0
  162. package/dist/utils/execution.js.map +1 -0
  163. package/dist/utils/gas.d.ts +0 -37
  164. package/dist/utils/gas.d.ts.map +1 -1
  165. package/dist/utils/gas.js +2 -60
  166. package/dist/utils/gas.js.map +1 -1
  167. package/dist/utils/index.d.ts +1 -1
  168. package/dist/utils/index.d.ts.map +1 -1
  169. package/dist/utils/index.js +1 -1
  170. package/dist/utils/index.js.map +1 -1
  171. package/package.json +25 -46
  172. package/dist/lib/navi_calculations.d.ts +0 -76
  173. package/dist/lib/navi_calculations.d.ts.map +0 -1
  174. package/dist/lib/navi_calculations.js +0 -185
  175. package/dist/lib/navi_calculations.js.map +0 -1
  176. package/dist/lib/scallop/flash-loan-client.d.ts +0 -88
  177. package/dist/lib/scallop/flash-loan-client.d.ts.map +0 -1
  178. package/dist/lib/scallop/flash-loan-client.js.map +0 -1
  179. package/dist/lib/scallop/flash-loan.d.ts +0 -30
  180. package/dist/lib/scallop/flash-loan.d.ts.map +0 -1
  181. package/dist/lib/scallop/flash-loan.js +0 -61
  182. package/dist/lib/scallop/flash-loan.js.map +0 -1
  183. package/dist/lib/scallop/index.d.ts +0 -3
  184. package/dist/lib/scallop/index.d.ts.map +0 -1
  185. package/dist/lib/scallop/index.js +0 -7
  186. package/dist/lib/scallop/index.js.map +0 -1
  187. package/dist/lib/scallop/scallop-addresses.d.ts +0 -24
  188. package/dist/lib/scallop/scallop-addresses.d.ts.map +0 -1
  189. package/dist/lib/scallop/scallop-addresses.js +0 -67
  190. package/dist/lib/scallop/scallop-addresses.js.map +0 -1
  191. package/dist/lib/scallop/scallop-builder.d.ts +0 -96
  192. package/dist/lib/scallop/scallop-builder.d.ts.map +0 -1
  193. package/dist/lib/scallop/scallop-builder.js +0 -163
  194. package/dist/lib/scallop/scallop-builder.js.map +0 -1
  195. package/dist/lib/suilend/calculators.d.ts +0 -44
  196. package/dist/lib/suilend/calculators.d.ts.map +0 -1
  197. package/dist/lib/suilend/calculators.js.map +0 -1
  198. package/dist/lib/suilend/const.d.ts +0 -9
  199. package/dist/lib/suilend/const.d.ts.map +0 -1
  200. package/dist/lib/suilend/const.js +0 -164
  201. package/dist/lib/suilend/suilend.d.ts +0 -15
  202. package/dist/lib/suilend/suilend.d.ts.map +0 -1
  203. package/dist/lib/suilend/suilend.js.map +0 -1
  204. package/dist/lib/utils/coin.d.ts +0 -21
  205. package/dist/lib/utils/coin.d.ts.map +0 -1
  206. package/dist/lib/utils/coin.js +0 -50
  207. package/dist/lib/utils/coin.js.map +0 -1
  208. package/dist/lib/utils/format.d.ts +0 -24
  209. package/dist/lib/utils/format.d.ts.map +0 -1
  210. package/dist/lib/utils/format.js.map +0 -1
  211. package/dist/lib/utils/index.d.ts +0 -9
  212. package/dist/lib/utils/index.d.ts.map +0 -1
  213. package/dist/lib/utils/index.js +0 -25
  214. package/dist/lib/utils/index.js.map +0 -1
  215. package/dist/lib/utils/logger.d.ts +0 -30
  216. package/dist/lib/utils/logger.d.ts.map +0 -1
  217. package/dist/lib/utils/logger.js.map +0 -1
  218. package/dist/protocols/interface.d.ts +0 -129
  219. package/dist/protocols/interface.d.ts.map +0 -1
  220. package/dist/protocols/interface.js +0 -8
  221. package/dist/protocols/interface.js.map +0 -1
  222. package/dist/protocols/navi.d.ts +0 -34
  223. package/dist/protocols/navi.d.ts.map +0 -1
  224. package/dist/protocols/navi.js +0 -263
  225. package/dist/protocols/navi.js.map +0 -1
  226. package/dist/protocols/scallop.d.ts +0 -297
  227. package/dist/protocols/scallop.d.ts.map +0 -1
  228. package/dist/protocols/scallop.js.map +0 -1
  229. package/dist/protocols/suilend.d.ts +0 -29
  230. package/dist/protocols/suilend.d.ts.map +0 -1
  231. package/dist/protocols/suilend.js +0 -313
  232. package/dist/protocols/suilend.js.map +0 -1
  233. package/dist/types.d.ts +0 -188
  234. package/dist/types.d.ts.map +0 -1
  235. package/dist/types.js +0 -22
  236. package/dist/types.js.map +0 -1
@@ -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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"}