fibx 0.5.1 → 0.7.0

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 (206) hide show
  1. package/README.md +73 -2
  2. package/dist/index.js +277 -292
  3. package/dist/index.js.map +1 -1
  4. package/package.json +13 -14
  5. package/dist/commands/auth/import.d.ts +0 -3
  6. package/dist/commands/auth/import.d.ts.map +0 -1
  7. package/dist/commands/auth/import.js +0 -44
  8. package/dist/commands/auth/import.js.map +0 -1
  9. package/dist/commands/auth/login.d.ts +0 -3
  10. package/dist/commands/auth/login.d.ts.map +0 -1
  11. package/dist/commands/auth/login.js +0 -13
  12. package/dist/commands/auth/login.js.map +0 -1
  13. package/dist/commands/auth/logout.d.ts +0 -3
  14. package/dist/commands/auth/logout.d.ts.map +0 -1
  15. package/dist/commands/auth/logout.js +0 -11
  16. package/dist/commands/auth/logout.js.map +0 -1
  17. package/dist/commands/auth/verify.d.ts +0 -3
  18. package/dist/commands/auth/verify.d.ts.map +0 -1
  19. package/dist/commands/auth/verify.js +0 -30
  20. package/dist/commands/auth/verify.js.map +0 -1
  21. package/dist/commands/chain/transaction.d.ts +0 -3
  22. package/dist/commands/chain/transaction.d.ts.map +0 -1
  23. package/dist/commands/chain/transaction.js +0 -31
  24. package/dist/commands/chain/transaction.js.map +0 -1
  25. package/dist/commands/config/index.d.ts +0 -3
  26. package/dist/commands/config/index.d.ts.map +0 -1
  27. package/dist/commands/config/index.js +0 -97
  28. package/dist/commands/config/index.js.map +0 -1
  29. package/dist/commands/defi/aave.d.ts +0 -8
  30. package/dist/commands/defi/aave.d.ts.map +0 -1
  31. package/dist/commands/defi/aave.js +0 -238
  32. package/dist/commands/defi/aave.js.map +0 -1
  33. package/dist/commands/portfolio/index.d.ts +0 -3
  34. package/dist/commands/portfolio/index.d.ts.map +0 -1
  35. package/dist/commands/portfolio/index.js +0 -64
  36. package/dist/commands/portfolio/index.js.map +0 -1
  37. package/dist/commands/trade/status.d.ts +0 -3
  38. package/dist/commands/trade/status.d.ts.map +0 -1
  39. package/dist/commands/trade/status.js +0 -30
  40. package/dist/commands/trade/status.js.map +0 -1
  41. package/dist/commands/trade/swap.d.ts +0 -9
  42. package/dist/commands/trade/swap.d.ts.map +0 -1
  43. package/dist/commands/trade/swap.js +0 -205
  44. package/dist/commands/trade/swap.js.map +0 -1
  45. package/dist/commands/wallet/address.d.ts +0 -3
  46. package/dist/commands/wallet/address.d.ts.map +0 -1
  47. package/dist/commands/wallet/address.js +0 -13
  48. package/dist/commands/wallet/address.js.map +0 -1
  49. package/dist/commands/wallet/balance.d.ts +0 -3
  50. package/dist/commands/wallet/balance.d.ts.map +0 -1
  51. package/dist/commands/wallet/balance.js +0 -73
  52. package/dist/commands/wallet/balance.js.map +0 -1
  53. package/dist/commands/wallet/list.d.ts +0 -3
  54. package/dist/commands/wallet/list.d.ts.map +0 -1
  55. package/dist/commands/wallet/list.js +0 -22
  56. package/dist/commands/wallet/list.js.map +0 -1
  57. package/dist/commands/wallet/send.d.ts +0 -7
  58. package/dist/commands/wallet/send.d.ts.map +0 -1
  59. package/dist/commands/wallet/send.js +0 -115
  60. package/dist/commands/wallet/send.js.map +0 -1
  61. package/dist/index.d.ts +0 -3
  62. package/dist/index.d.ts.map +0 -1
  63. package/dist/lib/brand.d.ts +0 -5
  64. package/dist/lib/brand.d.ts.map +0 -1
  65. package/dist/lib/brand.js +0 -15
  66. package/dist/lib/brand.js.map +0 -1
  67. package/dist/lib/cache.d.ts +0 -3
  68. package/dist/lib/cache.d.ts.map +0 -1
  69. package/dist/lib/cache.js +0 -23
  70. package/dist/lib/cache.js.map +0 -1
  71. package/dist/lib/cli-helpers.d.ts +0 -10
  72. package/dist/lib/cli-helpers.d.ts.map +0 -1
  73. package/dist/lib/cli-helpers.js +0 -20
  74. package/dist/lib/cli-helpers.js.map +0 -1
  75. package/dist/lib/concurrency.d.ts +0 -8
  76. package/dist/lib/concurrency.d.ts.map +0 -1
  77. package/dist/lib/concurrency.js +0 -26
  78. package/dist/lib/concurrency.js.map +0 -1
  79. package/dist/lib/config.d.ts +0 -7
  80. package/dist/lib/config.d.ts.map +0 -1
  81. package/dist/lib/config.js +0 -9
  82. package/dist/lib/config.js.map +0 -1
  83. package/dist/lib/errors.d.ts +0 -28
  84. package/dist/lib/errors.d.ts.map +0 -1
  85. package/dist/lib/errors.js +0 -33
  86. package/dist/lib/errors.js.map +0 -1
  87. package/dist/lib/format.d.ts +0 -31
  88. package/dist/lib/format.d.ts.map +0 -1
  89. package/dist/lib/format.js +0 -169
  90. package/dist/lib/format.js.map +0 -1
  91. package/dist/lib/parse-evm-error.d.ts +0 -6
  92. package/dist/lib/parse-evm-error.d.ts.map +0 -1
  93. package/dist/lib/parse-evm-error.js +0 -48
  94. package/dist/lib/parse-evm-error.js.map +0 -1
  95. package/dist/lib/parseAmount.d.ts +0 -3
  96. package/dist/lib/parseAmount.d.ts.map +0 -1
  97. package/dist/lib/parseAmount.js +0 -9
  98. package/dist/lib/parseAmount.js.map +0 -1
  99. package/dist/lib/retry.d.ts +0 -20
  100. package/dist/lib/retry.d.ts.map +0 -1
  101. package/dist/lib/retry.js +0 -36
  102. package/dist/lib/retry.js.map +0 -1
  103. package/dist/lib/validation.d.ts +0 -6
  104. package/dist/lib/validation.d.ts.map +0 -1
  105. package/dist/lib/validation.js +0 -24
  106. package/dist/lib/validation.js.map +0 -1
  107. package/dist/mcp/handlers.d.ts +0 -87
  108. package/dist/mcp/handlers.d.ts.map +0 -1
  109. package/dist/mcp/handlers.js +0 -394
  110. package/dist/mcp/handlers.js.map +0 -1
  111. package/dist/mcp/server.d.ts +0 -2
  112. package/dist/mcp/server.d.ts.map +0 -1
  113. package/dist/mcp/server.js +0 -21
  114. package/dist/mcp/server.js.map +0 -1
  115. package/dist/mcp/tools.d.ts +0 -3
  116. package/dist/mcp/tools.d.ts.map +0 -1
  117. package/dist/mcp/tools.js +0 -227
  118. package/dist/mcp/tools.js.map +0 -1
  119. package/dist/services/api/client.d.ts +0 -34
  120. package/dist/services/api/client.d.ts.map +0 -1
  121. package/dist/services/api/client.js +0 -68
  122. package/dist/services/api/client.js.map +0 -1
  123. package/dist/services/auth/policy.d.ts +0 -2
  124. package/dist/services/auth/policy.d.ts.map +0 -1
  125. package/dist/services/auth/policy.js +0 -3
  126. package/dist/services/auth/policy.js.map +0 -1
  127. package/dist/services/auth/session.d.ts +0 -20
  128. package/dist/services/auth/session.d.ts.map +0 -1
  129. package/dist/services/auth/session.js +0 -70
  130. package/dist/services/auth/session.js.map +0 -1
  131. package/dist/services/chain/client.d.ts +0 -17493
  132. package/dist/services/chain/client.d.ts.map +0 -1
  133. package/dist/services/chain/client.js +0 -30
  134. package/dist/services/chain/client.js.map +0 -1
  135. package/dist/services/chain/constants.d.ts +0 -163
  136. package/dist/services/chain/constants.d.ts.map +0 -1
  137. package/dist/services/chain/constants.js +0 -118
  138. package/dist/services/chain/constants.js.map +0 -1
  139. package/dist/services/chain/erc20.d.ts +0 -100
  140. package/dist/services/chain/erc20.d.ts.map +0 -1
  141. package/dist/services/chain/erc20.js +0 -117
  142. package/dist/services/chain/erc20.js.map +0 -1
  143. package/dist/services/chain/nonceManager.d.ts +0 -13
  144. package/dist/services/chain/nonceManager.d.ts.map +0 -1
  145. package/dist/services/chain/nonceManager.js +0 -45
  146. package/dist/services/chain/nonceManager.js.map +0 -1
  147. package/dist/services/config/config.d.ts +0 -20
  148. package/dist/services/config/config.d.ts.map +0 -1
  149. package/dist/services/config/config.js +0 -75
  150. package/dist/services/config/config.js.map +0 -1
  151. package/dist/services/defi/aave.d.ts +0 -50
  152. package/dist/services/defi/aave.d.ts.map +0 -1
  153. package/dist/services/defi/aave.js +0 -605
  154. package/dist/services/defi/aave.js.map +0 -1
  155. package/dist/services/defi/abi/aave.d.ts +0 -304
  156. package/dist/services/defi/abi/aave.d.ts.map +0 -1
  157. package/dist/services/defi/abi/aave.js +0 -194
  158. package/dist/services/defi/abi/aave.js.map +0 -1
  159. package/dist/services/defi/constants.d.ts +0 -11
  160. package/dist/services/defi/constants.d.ts.map +0 -1
  161. package/dist/services/defi/constants.js +0 -12
  162. package/dist/services/defi/constants.js.map +0 -1
  163. package/dist/services/fibrous/abi/base.d.ts +0 -768
  164. package/dist/services/fibrous/abi/base.d.ts.map +0 -1
  165. package/dist/services/fibrous/abi/base.js +0 -984
  166. package/dist/services/fibrous/abi/base.js.map +0 -1
  167. package/dist/services/fibrous/abi/citrea.d.ts +0 -773
  168. package/dist/services/fibrous/abi/citrea.d.ts.map +0 -1
  169. package/dist/services/fibrous/abi/citrea.js +0 -990
  170. package/dist/services/fibrous/abi/citrea.js.map +0 -1
  171. package/dist/services/fibrous/abi/hyperevm.d.ts +0 -773
  172. package/dist/services/fibrous/abi/hyperevm.d.ts.map +0 -1
  173. package/dist/services/fibrous/abi/hyperevm.js +0 -990
  174. package/dist/services/fibrous/abi/hyperevm.js.map +0 -1
  175. package/dist/services/fibrous/abi/monad.d.ts +0 -773
  176. package/dist/services/fibrous/abi/monad.d.ts.map +0 -1
  177. package/dist/services/fibrous/abi/monad.js +0 -990
  178. package/dist/services/fibrous/abi/monad.js.map +0 -1
  179. package/dist/services/fibrous/balances.d.ts +0 -15
  180. package/dist/services/fibrous/balances.d.ts.map +0 -1
  181. package/dist/services/fibrous/balances.js +0 -27
  182. package/dist/services/fibrous/balances.js.map +0 -1
  183. package/dist/services/fibrous/health.d.ts +0 -12
  184. package/dist/services/fibrous/health.d.ts.map +0 -1
  185. package/dist/services/fibrous/health.js +0 -16
  186. package/dist/services/fibrous/health.js.map +0 -1
  187. package/dist/services/fibrous/route.d.ts +0 -48
  188. package/dist/services/fibrous/route.d.ts.map +0 -1
  189. package/dist/services/fibrous/route.js +0 -65
  190. package/dist/services/fibrous/route.js.map +0 -1
  191. package/dist/services/fibrous/tokens.d.ts +0 -12
  192. package/dist/services/fibrous/tokens.d.ts.map +0 -1
  193. package/dist/services/fibrous/tokens.js +0 -38
  194. package/dist/services/fibrous/tokens.js.map +0 -1
  195. package/dist/services/portfolio/portfolio.d.ts +0 -28
  196. package/dist/services/portfolio/portfolio.d.ts.map +0 -1
  197. package/dist/services/portfolio/portfolio.js +0 -116
  198. package/dist/services/portfolio/portfolio.js.map +0 -1
  199. package/dist/services/privy/account.d.ts +0 -20
  200. package/dist/services/privy/account.d.ts.map +0 -1
  201. package/dist/services/privy/account.js +0 -60
  202. package/dist/services/privy/account.js.map +0 -1
  203. package/dist/services/privy/client.d.ts +0 -2
  204. package/dist/services/privy/client.d.ts.map +0 -1
  205. package/dist/services/privy/client.js +0 -7
  206. package/dist/services/privy/client.js.map +0 -1
@@ -1,605 +0,0 @@
1
- import { createPublicClient, http, parseUnits, formatUnits, maxUint256, erc20Abi, } from "viem";
2
- import { POOL_ADDRESSES_PROVIDER_ABI, POOL_ABI, POOL_DATA_PROVIDER_ABI, WETH_ABI, } from "./abi/aave.js";
3
- import { AAVE_V3_POOL_ADDRESSES_PROVIDER, AAVE_V3_POOL_DATA_PROVIDER, InterestRateMode, } from "./constants.js";
4
- import { NonceManager } from "../chain/nonceManager.js";
5
- import { waitForAllowance } from "../chain/erc20.js";
6
- import { ErrorCode, FibxError } from "../../lib/errors.js";
7
- export class AaveService {
8
- publicClient;
9
- walletClient;
10
- account;
11
- userAddress;
12
- chainConfig;
13
- constructor(chainConfig, walletClient) {
14
- this.chainConfig = chainConfig;
15
- this.publicClient = createPublicClient({
16
- chain: chainConfig.viemChain,
17
- transport: http(chainConfig.rpcUrl),
18
- });
19
- if (walletClient) {
20
- this.setWalletClient(walletClient);
21
- }
22
- }
23
- getAccountAddress() {
24
- return this.userAddress;
25
- }
26
- setAccountAddress(address) {
27
- this.userAddress = address;
28
- }
29
- setWalletClient(walletClient) {
30
- this.walletClient = walletClient;
31
- if (walletClient.account) {
32
- this.account = walletClient.account;
33
- this.userAddress = walletClient.account.address;
34
- }
35
- }
36
- async getPoolAddress() {
37
- return (await this.publicClient.readContract({
38
- address: AAVE_V3_POOL_ADDRESSES_PROVIDER,
39
- abi: POOL_ADDRESSES_PROVIDER_ABI,
40
- functionName: "getPool",
41
- }));
42
- }
43
- async getUserAccountData(userAddress) {
44
- const poolAddress = await this.getPoolAddress();
45
- const data = await this.publicClient.readContract({
46
- address: poolAddress,
47
- abi: POOL_ABI,
48
- functionName: "getUserAccountData",
49
- args: [userAddress],
50
- });
51
- // Values in Base Currency (USD, 8 decimals)
52
- return {
53
- totalCollateralUSD: formatUnits(data[0], 8),
54
- totalDebtUSD: formatUnits(data[1], 8),
55
- availableBorrowsUSD: formatUnits(data[2], 8),
56
- currentLiquidationThreshold: formatUnits(data[3], 4),
57
- ltv: formatUnits(data[4], 4),
58
- healthFactor: formatUnits(data[5], 18),
59
- };
60
- }
61
- async getMarkets() {
62
- // 1. Get all reserve tokens with symbols
63
- const reserveTokens = (await this.publicClient.readContract({
64
- address: AAVE_V3_POOL_DATA_PROVIDER,
65
- abi: POOL_DATA_PROVIDER_ABI,
66
- functionName: "getAllReservesTokens",
67
- }));
68
- // 2. Build multicall contracts array — 2 calls per token (reserveData + configData)
69
- const contracts = reserveTokens.flatMap((token) => [
70
- {
71
- address: AAVE_V3_POOL_DATA_PROVIDER,
72
- abi: POOL_DATA_PROVIDER_ABI,
73
- functionName: "getReserveData",
74
- args: [token.tokenAddress],
75
- },
76
- {
77
- address: AAVE_V3_POOL_DATA_PROVIDER,
78
- abi: POOL_DATA_PROVIDER_ABI,
79
- functionName: "getReserveConfigurationData",
80
- args: [token.tokenAddress],
81
- },
82
- ]);
83
- // 3. Single batched RPC call — avoids rate limiting
84
- const results = await this.publicClient.multicall({ contracts });
85
- // 4. Parse results in pairs
86
- const markets = [];
87
- for (let i = 0; i < reserveTokens.length; i++) {
88
- const token = reserveTokens[i];
89
- const reserveResult = results[i * 2];
90
- const configResult = results[i * 2 + 1];
91
- if (!token ||
92
- reserveResult?.status !== "success" ||
93
- configResult?.status !== "success") {
94
- continue;
95
- }
96
- const rd = reserveResult.result;
97
- const cd = configResult.result;
98
- const decimals = Number(cd[0]);
99
- const isActive = cd[8];
100
- const isFrozen = cd[9];
101
- if (!isActive)
102
- continue;
103
- // APY from RAY (1e27): rate / 1e27 * 100
104
- const RAY = 10n ** 27n;
105
- const supplyRate = rd[5]; // liquidityRate
106
- const borrowRate = rd[6]; // variableBorrowRate
107
- const supplyAPY = Number((supplyRate * 10000n) / RAY) / 100;
108
- const borrowAPY = Number((borrowRate * 10000n) / RAY) / 100;
109
- const totalAToken = rd[2]; // totalSupply (in token decimals)
110
- const totalVariableDebt = rd[4]; // totalBorrow
111
- const ltvBps = Number(cd[1]);
112
- markets.push({
113
- symbol: token.symbol,
114
- address: token.tokenAddress,
115
- supplyAPY: `${supplyAPY.toFixed(2)}%`,
116
- borrowAPY: `${borrowAPY.toFixed(2)}%`,
117
- totalSupply: formatUnits(totalAToken, decimals),
118
- totalBorrow: formatUnits(totalVariableDebt, decimals),
119
- ltv: `${(ltvBps / 100).toFixed(1)}%`,
120
- isActive,
121
- isFrozen,
122
- });
123
- }
124
- return markets;
125
- }
126
- async supply(tokenAddress, amountStr) {
127
- await this.ensureWalletConnection();
128
- const poolAddress = await this.getPoolAddress();
129
- const decimals = await this.getTokenDecimals(tokenAddress);
130
- const amount = parseUnits(amountStr, decimals);
131
- const allowance = await this.publicClient.readContract({
132
- address: tokenAddress,
133
- abi: erc20Abi,
134
- functionName: "allowance",
135
- args: [this.account.address, poolAddress],
136
- });
137
- if (allowance < amount) {
138
- const nonceApprove = await NonceManager.getInstance().getNextNonce();
139
- const txApprove = await this.walletClient.writeContract({
140
- address: tokenAddress,
141
- abi: erc20Abi,
142
- functionName: "approve",
143
- args: [poolAddress, amount],
144
- chain: this.chainConfig.viemChain,
145
- account: this.account,
146
- nonce: nonceApprove,
147
- });
148
- await this.publicClient.waitForTransactionReceipt({ hash: txApprove });
149
- await waitForAllowance(this.publicClient, tokenAddress, this.account.address, poolAddress, amount);
150
- }
151
- const { request: supplyRequest } = await this.publicClient.simulateContract({
152
- address: poolAddress,
153
- abi: POOL_ABI,
154
- functionName: "supply",
155
- args: [tokenAddress, amount, this.account.address, 0],
156
- account: this.account,
157
- chain: this.chainConfig.viemChain,
158
- });
159
- const nonceSupply = await NonceManager.getInstance().getNextNonce();
160
- const txSupply = await this.walletClient.writeContract({
161
- ...supplyRequest,
162
- nonce: nonceSupply,
163
- });
164
- await this.publicClient.waitForTransactionReceipt({ hash: txSupply });
165
- return txSupply;
166
- }
167
- async wrapETH(amountStr) {
168
- await this.ensureWalletConnection();
169
- const amount = parseUnits(amountStr, 18);
170
- const { request } = await this.publicClient.simulateContract({
171
- address: this.chainConfig.wrappedNativeAddress,
172
- abi: WETH_ABI,
173
- functionName: "deposit",
174
- args: [],
175
- value: amount,
176
- account: this.account,
177
- chain: this.chainConfig.viemChain,
178
- });
179
- const nonce = await NonceManager.getInstance().getNextNonce();
180
- const txWrap = await this.walletClient.writeContract({
181
- ...request,
182
- nonce,
183
- });
184
- await this.publicClient.waitForTransactionReceipt({ hash: txWrap });
185
- return txWrap;
186
- }
187
- async unwrapWETH(amountStr) {
188
- await this.ensureWalletConnection();
189
- const amount = parseUnits(amountStr, 18);
190
- const { request } = await this.publicClient.simulateContract({
191
- address: this.chainConfig.wrappedNativeAddress,
192
- abi: WETH_ABI,
193
- functionName: "withdraw",
194
- args: [amount],
195
- account: this.account,
196
- chain: this.chainConfig.viemChain,
197
- });
198
- const nonce = await NonceManager.getInstance().getNextNonce();
199
- const txUnwrap = await this.walletClient.writeContract({
200
- ...request,
201
- nonce,
202
- });
203
- await this.publicClient.waitForTransactionReceipt({ hash: txUnwrap });
204
- return txUnwrap;
205
- }
206
- async withdraw(tokenAddress, amountStr) {
207
- await this.ensureWalletConnection();
208
- const poolAddress = await this.getPoolAddress();
209
- const userAddress = this.account.address;
210
- let amount;
211
- if (amountStr.toLowerCase() === "max" || amountStr === "-1") {
212
- amount = maxUint256;
213
- }
214
- else {
215
- const decimals = await this.getTokenDecimals(tokenAddress);
216
- amount = parseUnits(amountStr, decimals);
217
- }
218
- let request;
219
- try {
220
- const result = await this.publicClient.simulateContract({
221
- address: poolAddress,
222
- abi: POOL_ABI,
223
- functionName: "withdraw",
224
- args: [tokenAddress, amount, userAddress],
225
- account: this.account,
226
- chain: this.chainConfig.viemChain,
227
- });
228
- request = result.request;
229
- }
230
- catch (error) {
231
- await this.handleLiquidationError(error, userAddress);
232
- throw error; // detailed error thrown by handleLiquidationError, but needed for TS control flow
233
- }
234
- const nonce = await NonceManager.getInstance().getNextNonce();
235
- const txWithdraw = await this.walletClient.writeContract({
236
- ...request,
237
- nonce,
238
- });
239
- await this.publicClient.waitForTransactionReceipt({ hash: txWithdraw });
240
- return txWithdraw;
241
- }
242
- async borrow(tokenAddress, amountStr) {
243
- await this.ensureWalletConnection();
244
- const poolAddress = await this.getPoolAddress();
245
- const decimals = await this.getTokenDecimals(tokenAddress);
246
- const amount = parseUnits(amountStr, decimals);
247
- let request;
248
- try {
249
- const result = await this.publicClient.simulateContract({
250
- address: poolAddress,
251
- abi: POOL_ABI,
252
- functionName: "borrow",
253
- args: [
254
- tokenAddress,
255
- amount,
256
- BigInt(InterestRateMode.Variable),
257
- 0,
258
- this.account.address,
259
- ],
260
- chain: this.chainConfig.viemChain,
261
- account: this.account,
262
- });
263
- request = result.request;
264
- }
265
- catch (error) {
266
- const err = error;
267
- if (err.message?.includes("HealthFactorLowerThanLiquidationThreshold") ||
268
- err.cause?.message?.includes("0x6679996d")) {
269
- throw new FibxError(ErrorCode.WALLET_ERROR, "Cannot borrow: This amount would lower your Health Factor below 1.0 (Liquidation Threshold). Try borrowing a smaller amount or adding more collateral first.");
270
- }
271
- throw error;
272
- }
273
- const nonce = await NonceManager.getInstance().getNextNonce();
274
- const txBorrow = await this.walletClient.writeContract({
275
- ...request,
276
- nonce,
277
- });
278
- await this.publicClient.waitForTransactionReceipt({ hash: txBorrow });
279
- return txBorrow;
280
- }
281
- async repay(tokenAddress, amountStr) {
282
- await this.ensureWalletConnection();
283
- const poolAddress = await this.getPoolAddress();
284
- let amount;
285
- if (amountStr.toLowerCase() === "max" || amountStr === "-1") {
286
- amount = maxUint256;
287
- }
288
- else {
289
- const decimals = await this.getTokenDecimals(tokenAddress);
290
- amount = parseUnits(amountStr, decimals);
291
- }
292
- const allowance = await this.publicClient.readContract({
293
- address: tokenAddress,
294
- abi: erc20Abi,
295
- functionName: "allowance",
296
- args: [this.account.address, poolAddress],
297
- });
298
- if (allowance < amount) {
299
- const nonceApprove = await NonceManager.getInstance().getNextNonce();
300
- const txApprove = await this.walletClient.writeContract({
301
- address: tokenAddress,
302
- abi: erc20Abi,
303
- functionName: "approve",
304
- args: [poolAddress, amount],
305
- chain: this.chainConfig.viemChain,
306
- account: this.account,
307
- nonce: nonceApprove,
308
- });
309
- await this.publicClient.waitForTransactionReceipt({ hash: txApprove });
310
- await waitForAllowance(this.publicClient, tokenAddress, this.account.address, poolAddress, amount);
311
- }
312
- try {
313
- const { request: repayRequest } = await this.publicClient.simulateContract({
314
- address: poolAddress,
315
- abi: POOL_ABI,
316
- functionName: "repay",
317
- args: [
318
- tokenAddress,
319
- amount,
320
- BigInt(InterestRateMode.Variable),
321
- this.account.address,
322
- ],
323
- account: this.account,
324
- chain: this.chainConfig.viemChain,
325
- });
326
- const nonceRepay = await NonceManager.getInstance().getNextNonce();
327
- const txRepay = await this.walletClient.writeContract({
328
- ...repayRequest,
329
- nonce: nonceRepay,
330
- });
331
- await this.publicClient.waitForTransactionReceipt({ hash: txRepay });
332
- return txRepay;
333
- }
334
- catch (error) {
335
- const err = error;
336
- // NoDebtOfSelectedType (0xf0788fb2) = already debt-free
337
- if (err.message?.includes("NoDebtOfSelectedType") ||
338
- err.cause?.message?.includes("0xf0788fb2")) {
339
- return "0x0";
340
- }
341
- throw error;
342
- }
343
- }
344
- async ensureWalletConnection() {
345
- if (!this.walletClient || !this.account) {
346
- throw new FibxError(ErrorCode.WALLET_ERROR, "Wallet not connected. Please login or provide a PRIVATE_KEY.");
347
- }
348
- await NonceManager.getInstance().init(this.account.address, this.publicClient);
349
- }
350
- async getTokenDecimals(tokenAddress) {
351
- return await this.publicClient.readContract({
352
- address: tokenAddress,
353
- abi: erc20Abi,
354
- functionName: "decimals",
355
- });
356
- }
357
- // Repay with auto ETH wrapping if needed.
358
- async repayWithAutoWrap(tokenAddress, amountStr, onStatus) {
359
- await this.ensureWalletConnection();
360
- if (onStatus)
361
- onStatus("Checking debt...");
362
- const currentDebt = await this.getAssetDebt(tokenAddress);
363
- if (currentDebt === 0n) {
364
- throw new FibxError(ErrorCode.VALIDATION_ERROR, "No debt found for this asset.");
365
- }
366
- let amountToRepay;
367
- let finalAmountStr = amountStr;
368
- const decimals = await this.getTokenDecimals(tokenAddress);
369
- if (amountStr === "-1" || amountStr.toLowerCase() === "max") {
370
- // 0.1% buffer for accrued interest
371
- const interestBuffer = currentDebt / 1000n;
372
- const safeMax = currentDebt + interestBuffer;
373
- amountToRepay = safeMax;
374
- finalAmountStr = "-1"; // Protocol indication for "repay all"
375
- }
376
- else {
377
- amountToRepay = parseUnits(amountStr, decimals);
378
- if (amountToRepay > currentDebt) {
379
- amountToRepay = currentDebt;
380
- finalAmountStr = "-1";
381
- }
382
- }
383
- const isWrappedNative = tokenAddress.toLowerCase() === this.chainConfig.wrappedNativeAddress.toLowerCase();
384
- if (isWrappedNative) {
385
- if (onStatus)
386
- onStatus("Checking WETH balance for auto-wrap...");
387
- const wethBalance = await this.publicClient.readContract({
388
- address: tokenAddress,
389
- abi: erc20Abi,
390
- functionName: "balanceOf",
391
- args: [this.account.address],
392
- });
393
- if (wethBalance < amountToRepay) {
394
- const ethBalance = await this.publicClient.getBalance({
395
- address: this.account.address,
396
- });
397
- const needed = amountToRepay - wethBalance;
398
- if (ethBalance >= needed) {
399
- if (onStatus)
400
- onStatus(`Wrapping ${formatUnits(needed, 18)} ETH to WETH...`);
401
- await this.wrapETH(formatUnits(needed, 18));
402
- }
403
- else {
404
- throw new FibxError(ErrorCode.VALIDATION_ERROR, `Insufficient WETH+ETH balance. Available: ${formatUnits(wethBalance + ethBalance, 18)}`);
405
- }
406
- }
407
- }
408
- if (onStatus)
409
- onStatus("Signaling Aave Repay...");
410
- if (finalAmountStr === "-1") {
411
- const interestBuffer = currentDebt / 1000n;
412
- const safeMax = currentDebt + interestBuffer;
413
- finalAmountStr = formatUnits(safeMax, decimals);
414
- }
415
- return await this.repay(tokenAddress, finalAmountStr);
416
- }
417
- async getAssetDebt(tokenAddress) {
418
- const poolDataProvider = AAVE_V3_POOL_DATA_PROVIDER;
419
- const data = await this.publicClient.readContract({
420
- address: poolDataProvider,
421
- abi: POOL_DATA_PROVIDER_ABI,
422
- functionName: "getUserReserveData",
423
- args: [tokenAddress, this.account.address],
424
- });
425
- const stableDebt = data[1];
426
- const variableDebt = data[2];
427
- return stableDebt + variableDebt;
428
- }
429
- // Supply with auto ETH wrapping if needed.
430
- async supplyWithAutoWrap(tokenAddress, amountStr, onStatus) {
431
- await this.ensureWalletConnection();
432
- const decimals = await this.getTokenDecimals(tokenAddress);
433
- const amount = parseUnits(amountStr, decimals);
434
- if (onStatus)
435
- onStatus("Checking balance...");
436
- const tokenBalance = await this.publicClient.readContract({
437
- address: tokenAddress,
438
- abi: erc20Abi,
439
- functionName: "balanceOf",
440
- args: [this.account.address],
441
- });
442
- const isWrappedNative = tokenAddress.toLowerCase() === this.chainConfig.wrappedNativeAddress.toLowerCase();
443
- if (isWrappedNative) {
444
- const ethBalance = await this.publicClient.getBalance({
445
- address: this.account.address,
446
- });
447
- if (tokenBalance < amount) {
448
- const needed = amount - tokenBalance;
449
- if (ethBalance >= needed) {
450
- if (onStatus)
451
- onStatus(`Wrapping ${formatUnits(needed, 18)} ETH to WETH...`);
452
- await this.wrapETH(formatUnits(needed, 18));
453
- }
454
- else {
455
- throw new FibxError(ErrorCode.VALIDATION_ERROR, `Insufficient WETH+ETH balance. Available: ${formatUnits(tokenBalance + ethBalance, 18)}`);
456
- }
457
- }
458
- }
459
- else {
460
- if (tokenBalance < amount) {
461
- throw new FibxError(ErrorCode.VALIDATION_ERROR, `Insufficient balance. Available: ${formatUnits(tokenBalance, decimals)}`);
462
- }
463
- }
464
- if (onStatus)
465
- onStatus("Signaling Aave Supply...");
466
- return await this.supply(tokenAddress, amountStr);
467
- }
468
- // Withdraw with optional WETH → ETH unwrapping.
469
- async withdrawWithAutoUnwrap(tokenAddress, amountStr, unwrapToNative = false, onStatus) {
470
- if (onStatus)
471
- onStatus("Signaling Aave Withdraw...");
472
- const tx = await this.withdraw(tokenAddress, amountStr);
473
- if (unwrapToNative) {
474
- const isWrappedNative = tokenAddress.toLowerCase() === this.chainConfig.wrappedNativeAddress.toLowerCase();
475
- if (isWrappedNative) {
476
- if (onStatus)
477
- onStatus("Unwrapping WETH to ETH...");
478
- let amountToUnwrap = amountStr;
479
- if (amountStr === "-1" || amountStr.toLowerCase() === "max") {
480
- const balance = await this.publicClient.readContract({
481
- address: tokenAddress,
482
- abi: erc20Abi,
483
- functionName: "balanceOf",
484
- args: [this.account.address],
485
- });
486
- amountToUnwrap = formatUnits(balance, 18);
487
- }
488
- await this.unwrapWETH(amountToUnwrap);
489
- if (onStatus)
490
- onStatus("Unwrapped WETH successfully");
491
- }
492
- }
493
- return tx;
494
- }
495
- async getDebts(dataProviderAddress, reserves) {
496
- const debtDetails = [];
497
- // Multicall: batch fetch all reserve data
498
- const reserveDataCalls = reserves.map((asset) => ({
499
- address: dataProviderAddress,
500
- abi: POOL_DATA_PROVIDER_ABI,
501
- functionName: "getUserReserveData",
502
- args: [asset, this.account.address],
503
- }));
504
- const results = await this.publicClient.multicall({
505
- contracts: reserveDataCalls,
506
- allowFailure: true,
507
- });
508
- const assetsWithDebt = [];
509
- const debts = [];
510
- results.forEach((result, index) => {
511
- if (result.status === "success" && result.result) {
512
- const data = result.result;
513
- const stableDebt = data[1];
514
- const variableDebt = data[2];
515
- if (stableDebt > 0n || variableDebt > 0n) {
516
- assetsWithDebt.push(reserves[index]);
517
- debts.push(stableDebt + variableDebt);
518
- }
519
- }
520
- });
521
- if (assetsWithDebt.length > 0) {
522
- const detailCalls = [];
523
- assetsWithDebt.forEach((asset) => {
524
- detailCalls.push({
525
- address: asset,
526
- abi: erc20Abi,
527
- functionName: "symbol",
528
- });
529
- detailCalls.push({
530
- address: asset,
531
- abi: erc20Abi,
532
- functionName: "decimals",
533
- });
534
- });
535
- try {
536
- const detailResults = await this.publicClient.multicall({
537
- contracts: detailCalls,
538
- allowFailure: false,
539
- });
540
- for (let i = 0; i < assetsWithDebt.length; i++) {
541
- const symbol = detailResults[i * 2];
542
- const decimals = detailResults[i * 2 + 1];
543
- const debt = debts[i];
544
- debtDetails.push(`${symbol}: $${formatUnits(debt, decimals)}`);
545
- }
546
- }
547
- catch (error) {
548
- console.warn("Failed to fetch debt token details via multicall:", error);
549
- // Fallback: list addresses with raw amounts
550
- assetsWithDebt.forEach((asset, i) => {
551
- debtDetails.push(`${asset}: raw units ${debts[i]}`);
552
- });
553
- }
554
- }
555
- return debtDetails;
556
- }
557
- async handleLiquidationError(error, userAddress) {
558
- const err = error;
559
- const userData = await this.getUserAccountData(userAddress);
560
- const totalDebt = parseFloat(userData.totalDebtUSD);
561
- if (err.message?.includes("HealthFactorLowerThanLiquidationThreshold") ||
562
- err.cause?.message?.includes("0x6679996d")) {
563
- let details = "This amount would lower your Health Factor below 1.0.";
564
- // Check cross-asset dust debt
565
- if (totalDebt > 0) {
566
- try {
567
- const poolContract = {
568
- address: await this.getPoolAddress(),
569
- abi: POOL_ABI,
570
- };
571
- const reserves = await this.publicClient.readContract({
572
- ...poolContract,
573
- functionName: "getReservesList",
574
- });
575
- const debts = await this.getDebts(AAVE_V3_POOL_DATA_PROVIDER, reserves);
576
- if (debts.length > 0) {
577
- details = `You have remaining debt in other assets: ${debts.join(", ")}. You must repay these debts first to withdraw max collateral.`;
578
- }
579
- else if (totalDebt < 0.01) {
580
- details = `You have tiny "dust" debt ($${totalDebt.toFixed(6)}) in an asset (scan failed to identify) preventing full withdrawal.`;
581
- }
582
- }
583
- catch (error) {
584
- console.error("Error scanning debts:", error);
585
- // Fallback
586
- if (totalDebt < 0.01) {
587
- details = `You have tiny "dust" debt ($${totalDebt.toFixed(6)}) in an asset preventing full withdrawal.`;
588
- }
589
- }
590
- }
591
- const totalCollateral = parseFloat(userData.totalCollateralUSD);
592
- const lt = parseFloat(userData.currentLiquidationThreshold) / 10000;
593
- if (lt > 0) {
594
- const requiredCollateral = totalDebt / lt;
595
- const maxSafeUSD = Math.max(0, totalCollateral - requiredCollateral);
596
- if (maxSafeUSD < totalCollateral) {
597
- details += ` You need keep ~$${requiredCollateral.toFixed(2)} collateral to cover your debt. Max safe withdraw is approx $${maxSafeUSD.toFixed(2)}.`;
598
- }
599
- }
600
- throw new FibxError(ErrorCode.WALLET_ERROR, `Cannot withdraw: ${details}`);
601
- }
602
- throw error;
603
- }
604
- }
605
- //# sourceMappingURL=aave.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aave.js","sourceRoot":"","sources":["../../../src/services/defi/aave.ts"],"names":[],"mappings":"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"}