fibx 0.1.3 → 0.2.1

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 (47) hide show
  1. package/README.md +47 -7
  2. package/dist/commands/auth/import.d.ts +3 -0
  3. package/dist/commands/auth/import.d.ts.map +1 -0
  4. package/dist/commands/auth/import.js +44 -0
  5. package/dist/commands/auth/import.js.map +1 -0
  6. package/dist/commands/auth/verify.d.ts.map +1 -1
  7. package/dist/commands/auth/verify.js +1 -0
  8. package/dist/commands/auth/verify.js.map +1 -1
  9. package/dist/commands/defi/aave.d.ts +7 -0
  10. package/dist/commands/defi/aave.d.ts.map +1 -0
  11. package/dist/commands/defi/aave.js +218 -0
  12. package/dist/commands/defi/aave.js.map +1 -0
  13. package/dist/index.js +19 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/services/auth/session.d.ts +6 -1
  16. package/dist/services/auth/session.d.ts.map +1 -1
  17. package/dist/services/auth/session.js +3 -1
  18. package/dist/services/auth/session.js.map +1 -1
  19. package/dist/services/chain/client.d.ts +1 -1
  20. package/dist/services/chain/client.d.ts.map +1 -1
  21. package/dist/services/chain/client.js +17 -64
  22. package/dist/services/chain/client.js.map +1 -1
  23. package/dist/services/chain/constants.d.ts +6 -0
  24. package/dist/services/chain/constants.d.ts.map +1 -1
  25. package/dist/services/chain/constants.js +8 -1
  26. package/dist/services/chain/constants.js.map +1 -1
  27. package/dist/services/chain/nonceManager.d.ts +14 -0
  28. package/dist/services/chain/nonceManager.d.ts.map +1 -0
  29. package/dist/services/chain/nonceManager.js +50 -0
  30. package/dist/services/chain/nonceManager.js.map +1 -0
  31. package/dist/services/defi/aave.d.ts +30 -0
  32. package/dist/services/defi/aave.d.ts.map +1 -0
  33. package/dist/services/defi/aave.js +284 -0
  34. package/dist/services/defi/aave.js.map +1 -0
  35. package/dist/services/defi/abi/aave.d.ts +145 -0
  36. package/dist/services/defi/abi/aave.d.ts.map +1 -0
  37. package/dist/services/defi/abi/aave.js +100 -0
  38. package/dist/services/defi/abi/aave.js.map +1 -0
  39. package/dist/services/defi/constants.d.ts +15 -0
  40. package/dist/services/defi/constants.d.ts.map +1 -0
  41. package/dist/services/defi/constants.js +17 -0
  42. package/dist/services/defi/constants.js.map +1 -0
  43. package/dist/services/privy/account.d.ts +15 -0
  44. package/dist/services/privy/account.d.ts.map +1 -0
  45. package/dist/services/privy/account.js +64 -0
  46. package/dist/services/privy/account.js.map +1 -0
  47. package/package.json +12 -5
@@ -1,74 +1,27 @@
1
- import { createPublicClient, createWalletClient, http, toHex } from "viem";
1
+ import { createPublicClient, createWalletClient, http } from "viem";
2
+ import { privateKeyToAccount } from "viem/accounts";
3
+ import { toPrivyViemAccount } from "../privy/account.js";
2
4
  export function getPublicClient(chain) {
3
5
  return createPublicClient({
4
6
  chain: chain.viemChain,
5
7
  transport: http(chain.rpcUrl),
6
8
  });
7
9
  }
8
- function toPrivyViemAccount(privy, walletId, address) {
9
- return {
10
- address: address,
11
- type: "local",
12
- source: "privy",
13
- publicKey: address,
14
- async signTransaction(transaction) {
15
- const { chainId, ...txParams } = transaction;
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- const privyTx = {
18
- chain_id: toHex(chainId),
19
- to: txParams.to,
20
- data: txParams.data,
21
- value: txParams.value ? toHex(txParams.value) : undefined,
22
- nonce: txParams.nonce ? toHex(txParams.nonce) : undefined,
23
- gas_limit: txParams.gas ? toHex(txParams.gas) : undefined,
24
- max_fee_per_gas: txParams.maxFeePerGas
25
- ? toHex(txParams.maxFeePerGas)
26
- : undefined,
27
- max_priority_fee_per_gas: txParams.maxPriorityFeePerGas
28
- ? toHex(txParams.maxPriorityFeePerGas)
29
- : undefined,
30
- type: txParams.type === "eip1559" ? 2 : txParams.type === "legacy" ? 0 : undefined,
31
- };
32
- Object.keys(privyTx).forEach((key) => {
33
- const k = key;
34
- if (privyTx[k] === undefined)
35
- delete privyTx[k];
36
- });
37
- const rpcInput = {
38
- params: { transaction: privyTx },
39
- method: "eth_signTransaction",
40
- };
41
- const response = await privy.wallets().ethereum().signTransaction(walletId, rpcInput);
42
- return response.signed_transaction;
43
- },
44
- async signMessage({ message, }) {
45
- let messageContent;
46
- if (typeof message === "object" && "raw" in message) {
47
- messageContent = message.raw;
48
- }
49
- else {
50
- messageContent = message;
51
- }
52
- const rpcInput = {
53
- message: messageContent,
54
- };
55
- const response = await privy.wallets().ethereum().signMessage(walletId, rpcInput);
56
- return response.signature;
57
- },
58
- async signTypedData(typedData) {
59
- const rpcInput = {
60
- params: {
61
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
- typed_data: typedData,
63
- },
64
- };
65
- const response = await privy.wallets().ethereum().signTypedData(walletId, rpcInput);
66
- return response.signature;
67
- },
68
- };
69
- }
70
10
  export function getWalletClient(privy, session, chain) {
71
- const account = toPrivyViemAccount(privy, session.walletId, session.walletAddress);
11
+ let account;
12
+ if (session.type === "private-key" && session.privateKey) {
13
+ account = privateKeyToAccount(session.privateKey);
14
+ }
15
+ else {
16
+ // Default to Privy (or if type is missing/explicitly privy)
17
+ if (!privy)
18
+ throw new Error("Privy client required for privy session type");
19
+ // Fallback for old sessions without type
20
+ const walletId = session.walletId;
21
+ if (!walletId)
22
+ throw new Error("Wallet ID required for privy session");
23
+ account = toPrivyViemAccount(privy, walletId, session.walletAddress);
24
+ }
72
25
  return createWalletClient({
73
26
  account,
74
27
  chain: chain.viemChain,
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/services/chain/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/services/chain/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAKpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAU,eAAe,CAAC,KAAkB;IACjD,OAAO,kBAAkB,CAAC;QACzB,KAAK,EAAE,KAAK,CAAC,SAAS;QACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAyB,EAAE,OAAgB,EAAE,KAAkB;IAC9F,IAAI,OAAO,CAAC;IAEZ,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1D,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAA2B,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACP,4DAA4D;QAC5D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC5E,yCAAyC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEvE,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,kBAAkB,CAAC;QACzB,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,SAAS;QACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;AACJ,CAAC"}
@@ -154,5 +154,11 @@ export interface ChainConfig {
154
154
  routerAbi: Abi;
155
155
  }
156
156
  export declare const SUPPORTED_CHAINS: Record<string, ChainConfig>;
157
+ export declare const RPC_URLS: {
158
+ base: string;
159
+ citrea: string;
160
+ hyperevm: string;
161
+ monad: string;
162
+ };
157
163
  export declare function getChainConfig(network: string): ChainConfig;
158
164
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/services/chain/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,MAAM,CAAC;AAO/C,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAejB,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAenB,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAehB,CAAC;AAEH,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,GAAG,CAAC;CACf;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAqCxD,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAQ3D"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/services/chain/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,MAAM,CAAC;AAO/C,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAejB,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAenB,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAehB,CAAC;AAEH,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,GAAG,CAAC;CACf;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAqCxD,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAO3D"}
@@ -90,10 +90,17 @@ export const SUPPORTED_CHAINS = {
90
90
  routerAbi: monadRouterAbi,
91
91
  },
92
92
  };
93
+ export const RPC_URLS = {
94
+ base: "https://mainnet.base.org",
95
+ citrea: "https://rpc.mainnet.citrea.xyz",
96
+ hyperevm: "https://rpc.hyperliquid.xyz/evm",
97
+ monad: "https://rpc-mainnet.monadinfra.com",
98
+ };
93
99
  export function getChainConfig(network) {
94
100
  const config = SUPPORTED_CHAINS[network];
95
101
  if (!config) {
96
- throw new Error(`Unsupported chain: ${network}. Supported: ${Object.keys(SUPPORTED_CHAINS).join(", ")}`);
102
+ const supported = Object.keys(SUPPORTED_CHAINS).join(", ");
103
+ throw new Error(`Unsupported chain: ${network}. Supported: ${supported}`);
97
104
  }
98
105
  return config;
99
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/services/chain/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/services/chain/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Address, PublicClient } from "viem";
2
+ export declare class NonceManager {
3
+ private static instance;
4
+ private nonce;
5
+ private address;
6
+ private publicClient;
7
+ private mutex;
8
+ private constructor();
9
+ static getInstance(): NonceManager;
10
+ init(address: Address, publicClient: PublicClient): Promise<void>;
11
+ getNextNonce(): Promise<number>;
12
+ reset(): void;
13
+ }
14
+ //# sourceMappingURL=nonceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonceManager.d.ts","sourceRoot":"","sources":["../../../src/services/chain/nonceManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAElD,qBAAa,YAAY;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,KAAK,CAAoC;IAEjD,OAAO;WAEO,WAAW,IAAI,YAAY;IAO5B,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY;IASjD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IA0BrC,KAAK;CAKZ"}
@@ -0,0 +1,50 @@
1
+ export class NonceManager {
2
+ static instance;
3
+ nonce = null;
4
+ address = null;
5
+ publicClient = null;
6
+ mutex = Promise.resolve();
7
+ constructor() { }
8
+ static getInstance() {
9
+ if (!NonceManager.instance) {
10
+ NonceManager.instance = new NonceManager();
11
+ }
12
+ return NonceManager.instance;
13
+ }
14
+ async init(address, publicClient) {
15
+ // Only re-initialize if address changes or not initialized
16
+ if (this.address !== address || this.nonce === null) {
17
+ this.address = address;
18
+ this.publicClient = publicClient;
19
+ this.nonce = await publicClient.getTransactionCount({ address });
20
+ }
21
+ }
22
+ async getNextNonce() {
23
+ if (this.nonce === null) {
24
+ throw new Error("NonceManager not initialized. Call init() first.");
25
+ }
26
+ // Simple mutex to ensure sequential access if needed, though JS is single-threaded
27
+ // this helps if we add async logic inside the critical section later.
28
+ let releaseStr;
29
+ const lock = new Promise((resolve) => {
30
+ releaseStr = resolve;
31
+ });
32
+ const previousMutex = this.mutex;
33
+ this.mutex = this.mutex.then(() => lock);
34
+ await previousMutex;
35
+ try {
36
+ const nextNonce = this.nonce;
37
+ this.nonce++;
38
+ return nextNonce;
39
+ }
40
+ finally {
41
+ releaseStr();
42
+ }
43
+ }
44
+ reset() {
45
+ this.nonce = null;
46
+ this.address = null;
47
+ this.publicClient = null;
48
+ }
49
+ }
50
+ //# sourceMappingURL=nonceManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonceManager.js","sourceRoot":"","sources":["../../../src/services/chain/nonceManager.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IAChB,MAAM,CAAC,QAAQ,CAAe;IAC9B,KAAK,GAAkB,IAAI,CAAC;IAC5B,OAAO,GAAmB,IAAI,CAAC;IAC/B,YAAY,GAAwB,IAAI,CAAC;IACzC,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEjD,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACxB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC5B,YAAY,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,OAAgB,EAAE,YAA0B;QAC7D,2DAA2D;QAC3D,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;YACjC,IAAI,CAAC,KAAK,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACrE,CAAC;QAED,mFAAmF;QACnF,sEAAsE;QACtE,IAAI,UAAsB,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC1C,UAAU,GAAG,OAAO,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,aAAa,CAAC;QAEpB,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QAClB,CAAC;gBAAS,CAAC;YACV,UAAW,EAAE,CAAC;QACf,CAAC;IACF,CAAC;IAEM,KAAK;QACX,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC1B,CAAC;CACD"}
@@ -0,0 +1,30 @@
1
+ import { type Address, type Hash, type WalletClient } from "viem";
2
+ export interface UserAccountData {
3
+ totalCollateralUSD: string;
4
+ totalDebtUSD: string;
5
+ availableBorrowsUSD: string;
6
+ currentLiquidationThreshold: string;
7
+ ltv: string;
8
+ healthFactor: string;
9
+ }
10
+ export declare class AaveService {
11
+ private publicClient;
12
+ private walletClient?;
13
+ private account?;
14
+ private userAddress?;
15
+ constructor(walletClient?: WalletClient);
16
+ getAccountAddress(): Address | undefined;
17
+ setAccountAddress(address: Address): void;
18
+ setWalletClient(walletClient: WalletClient): void;
19
+ private getPoolAddress;
20
+ getUserAccountData(userAddress: Address): Promise<UserAccountData>;
21
+ supply(tokenAddress: Address, amountStr: string): Promise<Hash>;
22
+ wrapETH(amountStr: string): Promise<Hash>;
23
+ unwrapWETH(amountStr: string): Promise<Hash>;
24
+ withdraw(tokenAddress: Address, amountStr: string): Promise<Hash>;
25
+ borrow(tokenAddress: Address, amountStr: string): Promise<Hash>;
26
+ repay(tokenAddress: Address, amountStr: string): Promise<Hash>;
27
+ private ensureWalletConnection;
28
+ private getTokenDecimals;
29
+ }
30
+ //# sourceMappingURL=aave.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aave.d.ts","sourceRoot":"","sources":["../../../src/services/defi/aave.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,KAAK,OAAO,EACZ,KAAK,IAAI,EAGT,KAAK,YAAY,EAEjB,MAAM,MAAM,CAAC;AAWd,MAAM,WAAW,eAAe;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2BAA2B,EAAE,MAAM,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAW;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAU;gBAElB,YAAY,CAAC,EAAE,YAAY;IAWhC,iBAAiB,IAAI,OAAO,GAAG,SAAS;IAIxC,iBAAiB,CAAC,OAAO,EAAE,OAAO;IAIlC,eAAe,CAAC,YAAY,EAAE,YAAY;YASnC,cAAc;IAQf,kBAAkB,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAoBlE,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C/D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBzC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5C,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+DjE,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD/D,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C3E,OAAO,CAAC,sBAAsB;YAMhB,gBAAgB;CAO9B"}
@@ -0,0 +1,284 @@
1
+ import { createPublicClient, http, parseUnits, formatUnits, erc20Abi, } from "viem";
2
+ import { base } from "viem/chains";
3
+ import { RPC_URLS } from "../chain/constants.js";
4
+ import { POOL_ADDRESSES_PROVIDER_ABI, POOL_ABI, WETH_ABI } from "./abi/aave.js";
5
+ import { AAVE_V3_POOL_ADDRESSES_PROVIDER, InterestRateMode, WETH_BASE_ADDRESS, } from "./constants.js";
6
+ import { NonceManager } from "../chain/nonceManager.js";
7
+ export class AaveService {
8
+ publicClient;
9
+ walletClient;
10
+ account;
11
+ userAddress;
12
+ constructor(walletClient) {
13
+ this.publicClient = createPublicClient({
14
+ chain: base,
15
+ transport: http(RPC_URLS.base),
16
+ });
17
+ if (walletClient) {
18
+ this.setWalletClient(walletClient);
19
+ }
20
+ }
21
+ getAccountAddress() {
22
+ return this.userAddress;
23
+ }
24
+ setAccountAddress(address) {
25
+ this.userAddress = address;
26
+ }
27
+ setWalletClient(walletClient) {
28
+ this.walletClient = walletClient;
29
+ if (walletClient.account) {
30
+ this.account = walletClient.account;
31
+ this.userAddress = walletClient.account.address;
32
+ NonceManager.getInstance().init(this.userAddress, this.publicClient);
33
+ }
34
+ }
35
+ async getPoolAddress() {
36
+ return (await this.publicClient.readContract({
37
+ address: AAVE_V3_POOL_ADDRESSES_PROVIDER,
38
+ abi: POOL_ADDRESSES_PROVIDER_ABI,
39
+ functionName: "getPool",
40
+ }));
41
+ }
42
+ async getUserAccountData(userAddress) {
43
+ const poolAddress = await this.getPoolAddress();
44
+ const data = await this.publicClient.readContract({
45
+ address: poolAddress,
46
+ abi: POOL_ABI,
47
+ functionName: "getUserAccountData",
48
+ args: [userAddress],
49
+ });
50
+ // Aave V3 getUserAccountData returns values in Base Currency (USD, 8 decimals)
51
+ return {
52
+ totalCollateralUSD: formatUnits(data[0], 8),
53
+ totalDebtUSD: formatUnits(data[1], 8),
54
+ availableBorrowsUSD: formatUnits(data[2], 8),
55
+ currentLiquidationThreshold: formatUnits(data[3], 4),
56
+ ltv: formatUnits(data[4], 4),
57
+ healthFactor: formatUnits(data[5], 18),
58
+ };
59
+ }
60
+ async supply(tokenAddress, amountStr) {
61
+ this.ensureWalletConnection();
62
+ const poolAddress = await this.getPoolAddress();
63
+ const decimals = await this.getTokenDecimals(tokenAddress);
64
+ const amount = parseUnits(amountStr, decimals);
65
+ // Check Allowance & Approve if necessary
66
+ const allowance = await this.publicClient.readContract({
67
+ address: tokenAddress,
68
+ abi: erc20Abi,
69
+ functionName: "allowance",
70
+ args: [this.account.address, poolAddress],
71
+ });
72
+ if (allowance < amount) {
73
+ const nonceApprove = await NonceManager.getInstance().getNextNonce();
74
+ const txApprove = await this.walletClient.writeContract({
75
+ address: tokenAddress,
76
+ abi: erc20Abi,
77
+ functionName: "approve",
78
+ args: [poolAddress, amount],
79
+ chain: base,
80
+ account: this.account,
81
+ nonce: nonceApprove,
82
+ });
83
+ await this.publicClient.waitForTransactionReceipt({ hash: txApprove });
84
+ }
85
+ // Execute Supply
86
+ const nonceSupply = await NonceManager.getInstance().getNextNonce();
87
+ const txSupply = await this.walletClient.writeContract({
88
+ address: poolAddress,
89
+ abi: POOL_ABI,
90
+ functionName: "supply",
91
+ args: [tokenAddress, amount, this.account.address, 0],
92
+ chain: base,
93
+ account: this.account,
94
+ nonce: nonceSupply,
95
+ });
96
+ await this.publicClient.waitForTransactionReceipt({ hash: txSupply });
97
+ return txSupply;
98
+ }
99
+ async wrapETH(amountStr) {
100
+ this.ensureWalletConnection();
101
+ const amount = parseUnits(amountStr, 18); // ETH always 18
102
+ const nonce = await NonceManager.getInstance().getNextNonce();
103
+ const txWrap = await this.walletClient.writeContract({
104
+ address: WETH_BASE_ADDRESS,
105
+ abi: WETH_ABI,
106
+ functionName: "deposit",
107
+ args: [],
108
+ value: amount,
109
+ chain: base,
110
+ account: this.account,
111
+ nonce,
112
+ });
113
+ await this.publicClient.waitForTransactionReceipt({ hash: txWrap });
114
+ return txWrap;
115
+ }
116
+ async unwrapWETH(amountStr) {
117
+ this.ensureWalletConnection();
118
+ const amount = parseUnits(amountStr, 18);
119
+ const nonce = await NonceManager.getInstance().getNextNonce();
120
+ const txUnwrap = await this.walletClient.writeContract({
121
+ address: WETH_BASE_ADDRESS,
122
+ abi: WETH_ABI,
123
+ functionName: "withdraw",
124
+ args: [amount],
125
+ chain: base,
126
+ account: this.account,
127
+ nonce,
128
+ });
129
+ await this.publicClient.waitForTransactionReceipt({ hash: txUnwrap });
130
+ return txUnwrap;
131
+ }
132
+ async withdraw(tokenAddress, amountStr) {
133
+ this.ensureWalletConnection();
134
+ const poolAddress = await this.getPoolAddress();
135
+ const decimals = await this.getTokenDecimals(tokenAddress);
136
+ const amount = parseUnits(amountStr, decimals);
137
+ const userAddress = this.account.address;
138
+ const nonce = await NonceManager.getInstance().getNextNonce();
139
+ // Simulate first to catch errors
140
+ try {
141
+ await this.publicClient.simulateContract({
142
+ address: poolAddress,
143
+ abi: POOL_ABI,
144
+ functionName: "withdraw",
145
+ args: [tokenAddress, amount, userAddress],
146
+ account: userAddress,
147
+ });
148
+ }
149
+ catch (error) {
150
+ // Smart Error Handling
151
+ const userData = await this.getUserAccountData(userAddress);
152
+ const totalDebt = parseFloat(userData.totalDebtUSD);
153
+ if (error.message?.includes("HealthFactorLowerThanLiquidationThreshold") ||
154
+ error.cause?.message?.includes("0x6679996d")) {
155
+ let details = "This amount would lower your Health Factor below 1.0.";
156
+ if (totalDebt > 0 && totalDebt < 0.01) {
157
+ details = `You have tiny "dust" debt ($${totalDebt.toFixed(6)}) preventing full withdrawal.`;
158
+ }
159
+ const totalCollateral = parseFloat(userData.totalCollateralUSD);
160
+ const lt = parseFloat(userData.currentLiquidationThreshold) / 10000;
161
+ if (lt > 0) {
162
+ const requiredCollateral = totalDebt / lt;
163
+ const maxSafeUSD = Math.max(0, totalCollateral - requiredCollateral);
164
+ if (maxSafeUSD < totalCollateral) {
165
+ details += ` You need keep ~$${requiredCollateral.toFixed(2)} collateral to cover your debt. Max safe withdraw is approx $${maxSafeUSD.toFixed(2)}.`;
166
+ }
167
+ }
168
+ throw new Error(`Cannot withdraw: ${details} (Try repaying all debt first)`);
169
+ }
170
+ throw error;
171
+ }
172
+ const txWithdraw = await this.walletClient.writeContract({
173
+ address: poolAddress,
174
+ abi: POOL_ABI,
175
+ functionName: "withdraw",
176
+ args: [tokenAddress, amount, userAddress],
177
+ chain: base,
178
+ account: this.account,
179
+ nonce,
180
+ });
181
+ await this.publicClient.waitForTransactionReceipt({ hash: txWithdraw });
182
+ return txWithdraw;
183
+ }
184
+ async borrow(tokenAddress, amountStr) {
185
+ this.ensureWalletConnection();
186
+ const poolAddress = await this.getPoolAddress();
187
+ const decimals = await this.getTokenDecimals(tokenAddress);
188
+ const amount = parseUnits(amountStr, decimals);
189
+ const nonce = await NonceManager.getInstance().getNextNonce();
190
+ // Simulate first to catch errors
191
+ try {
192
+ await this.publicClient.simulateContract({
193
+ address: poolAddress,
194
+ abi: POOL_ABI,
195
+ functionName: "borrow",
196
+ args: [
197
+ tokenAddress,
198
+ amount,
199
+ BigInt(InterestRateMode.Variable),
200
+ 0,
201
+ this.account.address,
202
+ ],
203
+ chain: base,
204
+ account: this.account,
205
+ });
206
+ }
207
+ catch (error) {
208
+ if (error.message?.includes("HealthFactorLowerThanLiquidationThreshold") ||
209
+ error.cause?.message?.includes("0x6679996d")) {
210
+ throw new 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.");
211
+ }
212
+ throw error;
213
+ }
214
+ const txBorrow = await this.walletClient.writeContract({
215
+ address: poolAddress,
216
+ abi: POOL_ABI,
217
+ functionName: "borrow",
218
+ args: [
219
+ tokenAddress,
220
+ amount,
221
+ BigInt(InterestRateMode.Variable),
222
+ 0,
223
+ this.account.address,
224
+ ],
225
+ chain: base,
226
+ account: this.account,
227
+ nonce,
228
+ });
229
+ await this.publicClient.waitForTransactionReceipt({ hash: txBorrow });
230
+ return txBorrow;
231
+ }
232
+ async repay(tokenAddress, amountStr) {
233
+ this.ensureWalletConnection();
234
+ const poolAddress = await this.getPoolAddress();
235
+ const decimals = await this.getTokenDecimals(tokenAddress);
236
+ const amount = parseUnits(amountStr, decimals);
237
+ // Check Allowance & Approve if necessary
238
+ const allowance = await this.publicClient.readContract({
239
+ address: tokenAddress,
240
+ abi: erc20Abi,
241
+ functionName: "allowance",
242
+ args: [this.account.address, poolAddress],
243
+ });
244
+ if (allowance < amount) {
245
+ const nonceApprove = await NonceManager.getInstance().getNextNonce();
246
+ const txApprove = await this.walletClient.writeContract({
247
+ address: tokenAddress,
248
+ abi: erc20Abi,
249
+ functionName: "approve",
250
+ args: [poolAddress, amount],
251
+ chain: base,
252
+ account: this.account,
253
+ nonce: nonceApprove,
254
+ });
255
+ await this.publicClient.waitForTransactionReceipt({ hash: txApprove });
256
+ }
257
+ // Execute Repay
258
+ const nonceRepay = await NonceManager.getInstance().getNextNonce();
259
+ const txRepay = await this.walletClient.writeContract({
260
+ address: poolAddress,
261
+ abi: POOL_ABI,
262
+ functionName: "repay",
263
+ args: [tokenAddress, amount, BigInt(InterestRateMode.Variable), this.account.address],
264
+ chain: base,
265
+ account: this.account,
266
+ nonce: nonceRepay,
267
+ });
268
+ await this.publicClient.waitForTransactionReceipt({ hash: txRepay });
269
+ return txRepay;
270
+ }
271
+ ensureWalletConnection() {
272
+ if (!this.walletClient || !this.account) {
273
+ throw new Error("Wallet not connected. Please login or provide a PRIVATE_KEY.");
274
+ }
275
+ }
276
+ async getTokenDecimals(tokenAddress) {
277
+ return await this.publicClient.readContract({
278
+ address: tokenAddress,
279
+ abi: erc20Abi,
280
+ functionName: "decimals",
281
+ });
282
+ }
283
+ }
284
+ //# sourceMappingURL=aave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aave.js","sourceRoot":"","sources":["../../../src/services/defi/aave.ts"],"names":[],"mappings":"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"}