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.
- package/README.md +47 -7
- package/dist/commands/auth/import.d.ts +3 -0
- package/dist/commands/auth/import.d.ts.map +1 -0
- package/dist/commands/auth/import.js +44 -0
- package/dist/commands/auth/import.js.map +1 -0
- package/dist/commands/auth/verify.d.ts.map +1 -1
- package/dist/commands/auth/verify.js +1 -0
- package/dist/commands/auth/verify.js.map +1 -1
- package/dist/commands/defi/aave.d.ts +7 -0
- package/dist/commands/defi/aave.d.ts.map +1 -0
- package/dist/commands/defi/aave.js +218 -0
- package/dist/commands/defi/aave.js.map +1 -0
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/services/auth/session.d.ts +6 -1
- package/dist/services/auth/session.d.ts.map +1 -1
- package/dist/services/auth/session.js +3 -1
- package/dist/services/auth/session.js.map +1 -1
- package/dist/services/chain/client.d.ts +1 -1
- package/dist/services/chain/client.d.ts.map +1 -1
- package/dist/services/chain/client.js +17 -64
- package/dist/services/chain/client.js.map +1 -1
- package/dist/services/chain/constants.d.ts +6 -0
- package/dist/services/chain/constants.d.ts.map +1 -1
- package/dist/services/chain/constants.js +8 -1
- package/dist/services/chain/constants.js.map +1 -1
- package/dist/services/chain/nonceManager.d.ts +14 -0
- package/dist/services/chain/nonceManager.d.ts.map +1 -0
- package/dist/services/chain/nonceManager.js +50 -0
- package/dist/services/chain/nonceManager.js.map +1 -0
- package/dist/services/defi/aave.d.ts +30 -0
- package/dist/services/defi/aave.d.ts.map +1 -0
- package/dist/services/defi/aave.js +284 -0
- package/dist/services/defi/aave.js.map +1 -0
- package/dist/services/defi/abi/aave.d.ts +145 -0
- package/dist/services/defi/abi/aave.d.ts.map +1 -0
- package/dist/services/defi/abi/aave.js +100 -0
- package/dist/services/defi/abi/aave.js.map +1 -0
- package/dist/services/defi/constants.d.ts +15 -0
- package/dist/services/defi/constants.d.ts.map +1 -0
- package/dist/services/defi/constants.js +17 -0
- package/dist/services/defi/constants.js.map +1 -0
- package/dist/services/privy/account.d.ts +15 -0
- package/dist/services/privy/account.d.ts.map +1 -0
- package/dist/services/privy/account.js +64 -0
- package/dist/services/privy/account.js.map +1 -0
- package/package.json +12 -5
|
@@ -1,74 +1,27 @@
|
|
|
1
|
-
import { createPublicClient, createWalletClient, http
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,IAAI,EAAE,
|
|
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,
|
|
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
|
-
|
|
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":"AACA,OAAO,EAAc,WAAW,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC;IACjC,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,gBAAgB;IACtB,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxE,OAAO,EAAE;QACR,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,gCAAgC,CAAC,EAAE;KACrD;IACD,cAAc,EAAE;QACf,OAAO,EAAE;YACR,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,qCAAqC;YAC1C,MAAM,EAAE,yCAAyC;SACjD;KACD;IACD,OAAO,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;IACnC,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,UAAU;IAChB,cAAc,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;IACrE,OAAO,EAAE;QACR,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,iCAAiC,CAAC,EAAE;KACtD;IACD,cAAc,EAAE;QACf,OAAO,EAAE;YACR,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,yBAAyB;YAC9B,MAAM,EAAE,6BAA6B;SACrC;KACD;IACD,OAAO,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;IAChC,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9D,OAAO,EAAE;QACR,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,oCAAoC,CAAC,EAAE;KACzD;IACD,cAAc,EAAE;QACf,OAAO,EAAE;YACR,IAAI,EAAE,cAAc;YACpB,GAAG,EAAE,yBAAyB;YAC9B,MAAM,EAAE,6BAA6B;SACrC;KACD;IACD,OAAO,EAAE,KAAK;CACd,CAAC,CAAC;AAYH,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC5D,IAAI,EAAE;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,0BAA0B;QAClC,kBAAkB,EAAE,4CAA4C;QAChE,cAAc,EAAE,MAAM;QACtB,SAAS,EAAE,aAAoB;KAC/B;IACD,MAAM,EAAE;QACP,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,gCAAgC;QACxC,kBAAkB,EAAE,4CAA4C;QAChE,cAAc,EAAE,QAAQ;QACxB,SAAS,EAAE,eAAsB;KACjC;IACD,QAAQ,EAAE;QACT,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,iCAAiC;QACzC,kBAAkB,EAAE,4CAA4C;QAChE,cAAc,EAAE,UAAU;QAC1B,SAAS,EAAE,iBAAwB;KACnC;IACD,KAAK,EAAE;QACN,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,oCAAoC;QAC5C,kBAAkB,EAAE,4CAA4C;QAChE,cAAc,EAAE,OAAO;QACvB,SAAS,EAAE,cAAqB;KAChC;CACD,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,
|
|
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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"}
|