recon-crypto-mcp 0.1.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 (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/dist/abis/aave-pool.d.ts +174 -0
  4. package/dist/abis/aave-pool.js +101 -0
  5. package/dist/abis/aave-pool.js.map +1 -0
  6. package/dist/abis/aave-ui-pool-data-provider.d.ts +232 -0
  7. package/dist/abis/aave-ui-pool-data-provider.js +107 -0
  8. package/dist/abis/aave-ui-pool-data-provider.js.map +1 -0
  9. package/dist/abis/access-control.d.ts +94 -0
  10. package/dist/abis/access-control.js +51 -0
  11. package/dist/abis/access-control.js.map +1 -0
  12. package/dist/abis/compound-comet.d.ts +120 -0
  13. package/dist/abis/compound-comet.js +84 -0
  14. package/dist/abis/compound-comet.js.map +1 -0
  15. package/dist/abis/eigenlayer-delegation-manager.d.ts +23 -0
  16. package/dist/abis/eigenlayer-delegation-manager.js +18 -0
  17. package/dist/abis/eigenlayer-delegation-manager.js.map +1 -0
  18. package/dist/abis/eigenlayer-strategy-manager.d.ts +53 -0
  19. package/dist/abis/eigenlayer-strategy-manager.js +47 -0
  20. package/dist/abis/eigenlayer-strategy-manager.js.map +1 -0
  21. package/dist/abis/erc20.d.ts +78 -0
  22. package/dist/abis/erc20.js +10 -0
  23. package/dist/abis/erc20.js.map +1 -0
  24. package/dist/abis/lido.d.ts +80 -0
  25. package/dist/abis/lido.js +60 -0
  26. package/dist/abis/lido.js.map +1 -0
  27. package/dist/abis/morpho-blue.d.ts +321 -0
  28. package/dist/abis/morpho-blue.js +193 -0
  29. package/dist/abis/morpho-blue.js.map +1 -0
  30. package/dist/abis/uniswap-pool.d.ts +70 -0
  31. package/dist/abis/uniswap-pool.js +53 -0
  32. package/dist/abis/uniswap-pool.js.map +1 -0
  33. package/dist/abis/uniswap-position-manager.d.ts +71 -0
  34. package/dist/abis/uniswap-position-manager.js +41 -0
  35. package/dist/abis/uniswap-position-manager.js.map +1 -0
  36. package/dist/config/cache.d.ts +12 -0
  37. package/dist/config/cache.js +12 -0
  38. package/dist/config/cache.js.map +1 -0
  39. package/dist/config/chains.d.ts +24 -0
  40. package/dist/config/chains.js +158 -0
  41. package/dist/config/chains.js.map +1 -0
  42. package/dist/config/contracts.d.ts +107 -0
  43. package/dist/config/contracts.js +123 -0
  44. package/dist/config/contracts.js.map +1 -0
  45. package/dist/config/user-config.d.ts +15 -0
  46. package/dist/config/user-config.js +93 -0
  47. package/dist/config/user-config.js.map +1 -0
  48. package/dist/data/apis/etherscan.d.ts +30 -0
  49. package/dist/data/apis/etherscan.js +109 -0
  50. package/dist/data/apis/etherscan.js.map +1 -0
  51. package/dist/data/cache.d.ts +18 -0
  52. package/dist/data/cache.js +47 -0
  53. package/dist/data/cache.js.map +1 -0
  54. package/dist/data/format.d.ts +6 -0
  55. package/dist/data/format.js +44 -0
  56. package/dist/data/format.js.map +1 -0
  57. package/dist/data/prices.d.ts +12 -0
  58. package/dist/data/prices.js +81 -0
  59. package/dist/data/prices.js.map +1 -0
  60. package/dist/data/rpc.d.ts +17 -0
  61. package/dist/data/rpc.js +68 -0
  62. package/dist/data/rpc.js.map +1 -0
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.js +344 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/modules/balances/index.d.ts +20 -0
  67. package/dist/modules/balances/index.js +49 -0
  68. package/dist/modules/balances/index.js.map +1 -0
  69. package/dist/modules/balances/schemas.d.ts +32 -0
  70. package/dist/modules/balances/schemas.js +21 -0
  71. package/dist/modules/balances/schemas.js.map +1 -0
  72. package/dist/modules/bitcoin/index.d.ts +26 -0
  73. package/dist/modules/bitcoin/index.js +128 -0
  74. package/dist/modules/bitcoin/index.js.map +1 -0
  75. package/dist/modules/bitcoin/schemas.d.ts +49 -0
  76. package/dist/modules/bitcoin/schemas.js +51 -0
  77. package/dist/modules/bitcoin/schemas.js.map +1 -0
  78. package/dist/modules/bitcoin/send.d.ts +52 -0
  79. package/dist/modules/bitcoin/send.js +158 -0
  80. package/dist/modules/bitcoin/send.js.map +1 -0
  81. package/dist/modules/bitcoin/utxo.d.ts +99 -0
  82. package/dist/modules/bitcoin/utxo.js +116 -0
  83. package/dist/modules/bitcoin/utxo.js.map +1 -0
  84. package/dist/modules/compound/actions.d.ts +8 -0
  85. package/dist/modules/compound/actions.js +154 -0
  86. package/dist/modules/compound/actions.js.map +1 -0
  87. package/dist/modules/compound/index.d.ts +26 -0
  88. package/dist/modules/compound/index.js +141 -0
  89. package/dist/modules/compound/index.js.map +1 -0
  90. package/dist/modules/compound/schemas.d.ts +95 -0
  91. package/dist/modules/compound/schemas.js +37 -0
  92. package/dist/modules/compound/schemas.js.map +1 -0
  93. package/dist/modules/execution/index.d.ts +51 -0
  94. package/dist/modules/execution/index.js +271 -0
  95. package/dist/modules/execution/index.js.map +1 -0
  96. package/dist/modules/execution/schemas.d.ts +183 -0
  97. package/dist/modules/execution/schemas.js +88 -0
  98. package/dist/modules/execution/schemas.js.map +1 -0
  99. package/dist/modules/feedback/index.d.ts +28 -0
  100. package/dist/modules/feedback/index.js +161 -0
  101. package/dist/modules/feedback/index.js.map +1 -0
  102. package/dist/modules/feedback/rate-limit.d.ts +15 -0
  103. package/dist/modules/feedback/rate-limit.js +110 -0
  104. package/dist/modules/feedback/rate-limit.js.map +1 -0
  105. package/dist/modules/feedback/schemas.d.ts +41 -0
  106. package/dist/modules/feedback/schemas.js +40 -0
  107. package/dist/modules/feedback/schemas.js.map +1 -0
  108. package/dist/modules/morpho/actions.d.ts +8 -0
  109. package/dist/modules/morpho/actions.js +265 -0
  110. package/dist/modules/morpho/actions.js.map +1 -0
  111. package/dist/modules/morpho/index.d.ts +26 -0
  112. package/dist/modules/morpho/index.js +94 -0
  113. package/dist/modules/morpho/index.js.map +1 -0
  114. package/dist/modules/morpho/schemas.d.ts +130 -0
  115. package/dist/modules/morpho/schemas.js +34 -0
  116. package/dist/modules/morpho/schemas.js.map +1 -0
  117. package/dist/modules/portfolio/index.d.ts +3 -0
  118. package/dist/modules/portfolio/index.js +197 -0
  119. package/dist/modules/portfolio/index.js.map +1 -0
  120. package/dist/modules/portfolio/schemas.d.ts +20 -0
  121. package/dist/modules/portfolio/schemas.js +15 -0
  122. package/dist/modules/portfolio/schemas.js.map +1 -0
  123. package/dist/modules/positions/aave.d.ts +22 -0
  124. package/dist/modules/positions/aave.js +197 -0
  125. package/dist/modules/positions/aave.js.map +1 -0
  126. package/dist/modules/positions/actions.d.ts +18 -0
  127. package/dist/modules/positions/actions.js +205 -0
  128. package/dist/modules/positions/actions.js.map +1 -0
  129. package/dist/modules/positions/index.d.ts +37 -0
  130. package/dist/modules/positions/index.js +59 -0
  131. package/dist/modules/positions/index.js.map +1 -0
  132. package/dist/modules/positions/schemas.d.ts +55 -0
  133. package/dist/modules/positions/schemas.js +25 -0
  134. package/dist/modules/positions/schemas.js.map +1 -0
  135. package/dist/modules/positions/uniswap.d.ts +4 -0
  136. package/dist/modules/positions/uniswap.js +181 -0
  137. package/dist/modules/positions/uniswap.js.map +1 -0
  138. package/dist/modules/prices/index.d.ts +19 -0
  139. package/dist/modules/prices/index.js +22 -0
  140. package/dist/modules/prices/index.js.map +1 -0
  141. package/dist/modules/security/index.d.ts +26 -0
  142. package/dist/modules/security/index.js +13 -0
  143. package/dist/modules/security/index.js.map +1 -0
  144. package/dist/modules/security/permissions.d.ts +8 -0
  145. package/dist/modules/security/permissions.js +96 -0
  146. package/dist/modules/security/permissions.js.map +1 -0
  147. package/dist/modules/security/risk-score.d.ts +18 -0
  148. package/dist/modules/security/risk-score.js +116 -0
  149. package/dist/modules/security/risk-score.js.map +1 -0
  150. package/dist/modules/security/schemas.d.ts +31 -0
  151. package/dist/modules/security/schemas.js +16 -0
  152. package/dist/modules/security/schemas.js.map +1 -0
  153. package/dist/modules/security/verification.d.ts +4 -0
  154. package/dist/modules/security/verification.js +82 -0
  155. package/dist/modules/security/verification.js.map +1 -0
  156. package/dist/modules/shared/approval.d.ts +71 -0
  157. package/dist/modules/shared/approval.js +130 -0
  158. package/dist/modules/shared/approval.js.map +1 -0
  159. package/dist/modules/staking/actions.d.ts +22 -0
  160. package/dist/modules/staking/actions.js +100 -0
  161. package/dist/modules/staking/actions.js.map +1 -0
  162. package/dist/modules/staking/eigenlayer.d.ts +14 -0
  163. package/dist/modules/staking/eigenlayer.js +105 -0
  164. package/dist/modules/staking/eigenlayer.js.map +1 -0
  165. package/dist/modules/staking/index.d.ts +24 -0
  166. package/dist/modules/staking/index.js +59 -0
  167. package/dist/modules/staking/index.js.map +1 -0
  168. package/dist/modules/staking/lido.d.ts +14 -0
  169. package/dist/modules/staking/lido.js +113 -0
  170. package/dist/modules/staking/lido.js.map +1 -0
  171. package/dist/modules/staking/schemas.d.ts +34 -0
  172. package/dist/modules/staking/schemas.js +20 -0
  173. package/dist/modules/staking/schemas.js.map +1 -0
  174. package/dist/modules/swap/index.d.ts +47 -0
  175. package/dist/modules/swap/index.js +376 -0
  176. package/dist/modules/swap/index.js.map +1 -0
  177. package/dist/modules/swap/lifi.d.ts +17 -0
  178. package/dist/modules/swap/lifi.js +44 -0
  179. package/dist/modules/swap/lifi.js.map +1 -0
  180. package/dist/modules/swap/oneinch.d.ts +26 -0
  181. package/dist/modules/swap/oneinch.js +33 -0
  182. package/dist/modules/swap/oneinch.js.map +1 -0
  183. package/dist/modules/swap/schemas.d.ts +65 -0
  184. package/dist/modules/swap/schemas.js +46 -0
  185. package/dist/modules/swap/schemas.js.map +1 -0
  186. package/dist/setup.d.ts +2 -0
  187. package/dist/setup.js +257 -0
  188. package/dist/setup.js.map +1 -0
  189. package/dist/signing/pre-sign-check.d.ts +8 -0
  190. package/dist/signing/pre-sign-check.js +231 -0
  191. package/dist/signing/pre-sign-check.js.map +1 -0
  192. package/dist/signing/session.d.ts +28 -0
  193. package/dist/signing/session.js +26 -0
  194. package/dist/signing/session.js.map +1 -0
  195. package/dist/signing/tx-store.d.ts +29 -0
  196. package/dist/signing/tx-store.js +85 -0
  197. package/dist/signing/tx-store.js.map +1 -0
  198. package/dist/signing/walletconnect.d.ts +33 -0
  199. package/dist/signing/walletconnect.js +226 -0
  200. package/dist/signing/walletconnect.js.map +1 -0
  201. package/dist/types/index.d.ts +222 -0
  202. package/dist/types/index.js +18 -0
  203. package/dist/types/index.js.map +1 -0
  204. package/package.json +134 -0
@@ -0,0 +1,197 @@
1
+ import { formatUnits, parseUnits, maxUint256 } from "viem";
2
+ import { getClient } from "../../data/rpc.js";
3
+ import { CONTRACTS } from "../../config/contracts.js";
4
+ import { aavePoolAbi, aavePoolAddressProviderAbi } from "../../abis/aave-pool.js";
5
+ import { aaveUiPoolDataProviderAbi } from "../../abis/aave-ui-pool-data-provider.js";
6
+ import { round } from "../../data/format.js";
7
+ const BASE_DECIMALS = 8; // Aave V3 market reference currency (USD) uses 8 decimals.
8
+ const RAY = 10n ** 27n;
9
+ function rayMul(a, b) {
10
+ return (a * b + RAY / 2n) / RAY;
11
+ }
12
+ /**
13
+ * Fetch the fully-resolved Aave V3 lending position on a single chain.
14
+ * Returns null if the user has no Aave activity OR the RPC returned empty data for any of
15
+ * the required reads (batching mis-handling, rate-limit, transient). The caller treats a
16
+ * null result as "no position on this chain" — safer than exploding the whole portfolio.
17
+ */
18
+ export async function getAaveLendingPosition(wallet, chain) {
19
+ try {
20
+ return await readAaveLendingPosition(wallet, chain);
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ async function readAaveLendingPosition(wallet, chain) {
27
+ const client = getClient(chain);
28
+ const provider = CONTRACTS[chain].aave.poolAddressProvider;
29
+ const uiProvider = CONTRACTS[chain].aave.uiPoolDataProvider;
30
+ // Resolve the current Pool address dynamically.
31
+ const poolAddr = (await client.readContract({
32
+ address: provider,
33
+ abi: aavePoolAddressProviderAbi,
34
+ functionName: "getPool",
35
+ }));
36
+ // Aggregate data (HF, totals, LTV) comes from Pool.getUserAccountData — a stable ABI that
37
+ // has not changed across Aave V3 upgrades. Per-reserve breakdown relies on the more volatile
38
+ // UiPoolDataProviderV3 struct, whose shape drifts between chains/versions (stable-rate fields
39
+ // were removed in 3.2, extra fields added/shifted later). If that decode fails, we keep the
40
+ // aggregate — the user still gets HF and totals, just without the per-asset split.
41
+ const account = (await client.readContract({
42
+ address: poolAddr,
43
+ abi: aavePoolAbi,
44
+ functionName: "getUserAccountData",
45
+ args: [wallet],
46
+ }));
47
+ const [totalCollateralBase, totalDebtBase, availableBorrowsBase, currentLiquidationThreshold, ltv, healthFactor] = account;
48
+ if (totalCollateralBase === 0n && totalDebtBase === 0n)
49
+ return null;
50
+ const agg = {
51
+ totalCollateralBase,
52
+ totalDebtBase,
53
+ availableBorrowsBase,
54
+ currentLiquidationThreshold,
55
+ ltv,
56
+ healthFactor,
57
+ };
58
+ let userReservesRaw = [];
59
+ let reservesRaw = [];
60
+ let baseCurrencyRaw = null;
61
+ try {
62
+ const [userReservesResult, reservesResult] = await Promise.all([
63
+ client.readContract({
64
+ address: uiProvider,
65
+ abi: aaveUiPoolDataProviderAbi,
66
+ functionName: "getUserReservesData",
67
+ args: [provider, wallet],
68
+ }),
69
+ client.readContract({
70
+ address: uiProvider,
71
+ abi: aaveUiPoolDataProviderAbi,
72
+ functionName: "getReservesData",
73
+ args: [provider],
74
+ }),
75
+ ]);
76
+ [userReservesRaw] = userReservesResult;
77
+ const [rr, bc] = reservesResult;
78
+ reservesRaw = rr;
79
+ baseCurrencyRaw = bc;
80
+ }
81
+ catch {
82
+ // UiPoolDataProvider ABI drift — surface what we have (aggregate only).
83
+ }
84
+ const reservesBySymbol = new Map(reservesRaw.map((r) => [r.underlyingAsset.toLowerCase(), r]));
85
+ const collateral = [];
86
+ const debt = [];
87
+ // Skip per-reserve breakdown if the UiPoolDataProvider call failed — aggregate totals above
88
+ // are still returned.
89
+ if (!baseCurrencyRaw) {
90
+ return buildPosition(chain, agg, collateral, debt);
91
+ }
92
+ // Unit-of-account price = USD price with `networkBaseTokenPriceDecimals` decimals
93
+ const usdUnit = 10 ** baseCurrencyRaw.networkBaseTokenPriceDecimals;
94
+ const marketBase = Number(baseCurrencyRaw.marketReferenceCurrencyUnit);
95
+ for (const ur of userReservesRaw) {
96
+ const reserve = reservesBySymbol.get(ur.underlyingAsset.toLowerCase());
97
+ if (!reserve)
98
+ continue;
99
+ const decimals = Number(reserve.decimals);
100
+ const priceBase = Number(reserve.priceInMarketReferenceCurrency);
101
+ const tokenPriceUsd = (priceBase / marketBase) * (Number(baseCurrencyRaw.marketReferenceCurrencyPriceInUsd) / usdUnit);
102
+ // aToken balance (actual) = scaled × liquidityIndex / RAY
103
+ const aTokenBalance = rayMul(ur.scaledATokenBalance, reserve.liquidityIndex);
104
+ const variableDebt = rayMul(ur.scaledVariableDebt, reserve.variableBorrowIndex);
105
+ const stableDebt = ur.principalStableDebt; // approximation; stable is near-zero in practice
106
+ const totalDebt = variableDebt + stableDebt;
107
+ if (aTokenBalance > 0n) {
108
+ const amount = Number(formatUnits(aTokenBalance, decimals));
109
+ collateral.push({
110
+ token: ur.underlyingAsset,
111
+ symbol: reserve.symbol,
112
+ decimals,
113
+ amount: aTokenBalance.toString(),
114
+ formatted: amount.toString(),
115
+ priceUsd: round(tokenPriceUsd, 6),
116
+ valueUsd: round(amount * tokenPriceUsd, 2),
117
+ });
118
+ }
119
+ if (totalDebt > 0n) {
120
+ const amount = Number(formatUnits(totalDebt, decimals));
121
+ debt.push({
122
+ token: ur.underlyingAsset,
123
+ symbol: reserve.symbol,
124
+ decimals,
125
+ amount: totalDebt.toString(),
126
+ formatted: amount.toString(),
127
+ priceUsd: round(tokenPriceUsd, 6),
128
+ valueUsd: round(amount * tokenPriceUsd, 2),
129
+ });
130
+ }
131
+ }
132
+ return buildPosition(chain, agg, collateral, debt);
133
+ }
134
+ function buildPosition(chain, agg, collateral, debt) {
135
+ const totalCollateralUsd = Number(formatUnits(agg.totalCollateralBase, BASE_DECIMALS));
136
+ const totalDebtUsd = Number(formatUnits(agg.totalDebtBase, BASE_DECIMALS));
137
+ // healthFactor returned by Aave is scaled 1e18; cap at a big number if no debt.
138
+ const hf = agg.totalDebtBase === 0n
139
+ ? Number.POSITIVE_INFINITY
140
+ : Number(formatUnits(agg.healthFactor, 18));
141
+ return {
142
+ protocol: "aave-v3",
143
+ chain,
144
+ collateral,
145
+ debt,
146
+ totalCollateralUsd: round(totalCollateralUsd, 2),
147
+ totalDebtUsd: round(totalDebtUsd, 2),
148
+ netValueUsd: round(totalCollateralUsd - totalDebtUsd, 2),
149
+ healthFactor: hf === Number.POSITIVE_INFINITY ? 1e18 : round(hf, 4),
150
+ liquidationThreshold: Number(agg.currentLiquidationThreshold),
151
+ ltv: Number(agg.ltv),
152
+ };
153
+ }
154
+ /**
155
+ * Simulate a delta to the lending position and return the projected health factor.
156
+ * We work in USD space: newHF = (newCollateral × liqThreshold) / newDebt.
157
+ */
158
+ export function simulateHealthFactorChange(base, action, deltaUsd) {
159
+ let collateral = base.totalCollateralUsd;
160
+ let debtUsd = base.totalDebtUsd;
161
+ switch (action) {
162
+ case "add_collateral":
163
+ collateral += deltaUsd;
164
+ break;
165
+ case "remove_collateral":
166
+ collateral = Math.max(0, collateral - deltaUsd);
167
+ break;
168
+ case "borrow":
169
+ debtUsd += deltaUsd;
170
+ break;
171
+ case "repay":
172
+ debtUsd = Math.max(0, debtUsd - deltaUsd);
173
+ break;
174
+ }
175
+ const liqThresh = base.liquidationThreshold / 10_000; // bps → fraction
176
+ const hf = debtUsd === 0
177
+ ? Number.POSITIVE_INFINITY
178
+ : (collateral * liqThresh) / debtUsd;
179
+ return {
180
+ newHealthFactor: hf === Number.POSITIVE_INFINITY ? 1e18 : round(hf, 4),
181
+ newCollateralUsd: round(collateral, 2),
182
+ newDebtUsd: round(debtUsd, 2),
183
+ safe: hf > 1.0,
184
+ };
185
+ }
186
+ /** Export a tiny helper for action builders. */
187
+ export async function getAavePoolAddress(chain) {
188
+ const client = getClient(chain);
189
+ const provider = CONTRACTS[chain].aave.poolAddressProvider;
190
+ return (await client.readContract({
191
+ address: provider,
192
+ abi: aavePoolAddressProviderAbi,
193
+ functionName: "getPool",
194
+ }));
195
+ }
196
+ export { maxUint256, parseUnits };
197
+ //# sourceMappingURL=aave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aave.js","sourceRoot":"","sources":["../../../src/modules/positions/aave.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { formatUnits } from "viem";
2
+ import type { SupportedChain, UnsignedTx } from "../../types/index.js";
3
+ interface AaveActionParams {
4
+ wallet: `0x${string}`;
5
+ chain: SupportedChain;
6
+ asset: `0x${string}`;
7
+ amount: string;
8
+ decimals: number;
9
+ symbol: string;
10
+ /** Optional ERC-20 approval cap — see resolveApprovalCap for semantics. */
11
+ approvalCap?: string;
12
+ }
13
+ declare function parseAmountFriendly(amount: string, decimals: number): bigint;
14
+ export declare function buildAaveSupply(p: AaveActionParams): Promise<UnsignedTx>;
15
+ export declare function buildAaveWithdraw(p: AaveActionParams): Promise<UnsignedTx>;
16
+ export declare function buildAaveBorrow(p: AaveActionParams): Promise<UnsignedTx>;
17
+ export declare function buildAaveRepay(p: AaveActionParams): Promise<UnsignedTx>;
18
+ export { parseAmountFriendly, formatUnits };
@@ -0,0 +1,205 @@
1
+ import { encodeFunctionData, parseUnits, maxUint256, formatUnits } from "viem";
2
+ import { aavePoolAbi } from "../../abis/aave-pool.js";
3
+ import { erc20Abi } from "../../abis/erc20.js";
4
+ import { getClient } from "../../data/rpc.js";
5
+ import { getAavePoolAddress } from "./aave.js";
6
+ import { buildApprovalTx, resolveApprovalCap } from "../shared/approval.js";
7
+ /**
8
+ * "Native" pseudo-addresses some UIs pass to mean "the chain's native coin".
9
+ * Aave V3 Pool does NOT accept these — supply()/repay() expect a real ERC-20.
10
+ * Native ETH must be wrapped (WETH) first, or routed through Aave's
11
+ * WrappedTokenGateway contract, which we don't wire up here.
12
+ */
13
+ const NATIVE_PSEUDOADDRS = new Set([
14
+ "0x0000000000000000000000000000000000000000",
15
+ "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
16
+ ]);
17
+ function assertNotNativePseudoaddr(asset, op) {
18
+ if (NATIVE_PSEUDOADDRS.has(asset.toLowerCase())) {
19
+ throw new Error(`Aave V3 Pool.${op} does not accept the native coin pseudoaddress ${asset}. ` +
20
+ "Pass the wrapped-token address (e.g. WETH on Ethereum: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) " +
21
+ "instead, or wrap native → WETH in a separate tx first.");
22
+ }
23
+ }
24
+ function parseAmountFriendly(amount, decimals) {
25
+ return parseUnits(amount, decimals);
26
+ }
27
+ export async function buildAaveSupply(p) {
28
+ assertNotNativePseudoaddr(p.asset, "supply");
29
+ const pool = await getAavePoolAddress(p.chain);
30
+ const amountWei = parseAmountFriendly(p.amount, p.decimals);
31
+ const { approvalAmount, display } = resolveApprovalCap(p.approvalCap, amountWei, p.decimals);
32
+ const approval = await buildApprovalTx({
33
+ chain: p.chain,
34
+ wallet: p.wallet,
35
+ asset: p.asset,
36
+ spender: pool,
37
+ amountWei,
38
+ approvalAmount,
39
+ approvalDisplay: display,
40
+ symbol: p.symbol,
41
+ spenderLabel: "Aave V3 Pool",
42
+ });
43
+ const supplyTx = {
44
+ chain: p.chain,
45
+ to: pool,
46
+ data: encodeFunctionData({
47
+ abi: aavePoolAbi,
48
+ functionName: "supply",
49
+ args: [p.asset, amountWei, p.wallet, 0],
50
+ }),
51
+ value: "0",
52
+ from: p.wallet,
53
+ description: `Supply ${p.amount} ${p.symbol} to Aave V3 on ${p.chain}`,
54
+ decoded: {
55
+ functionName: "supply",
56
+ args: { asset: p.asset, amount: p.amount, onBehalfOf: p.wallet, referralCode: "0" },
57
+ },
58
+ };
59
+ if (approval) {
60
+ // Walk to the tail of the approval chain (may be reset→approve) and attach supply.
61
+ let tail = approval;
62
+ while (tail.next)
63
+ tail = tail.next;
64
+ tail.next = supplyTx;
65
+ return approval;
66
+ }
67
+ return supplyTx;
68
+ }
69
+ export async function buildAaveWithdraw(p) {
70
+ const pool = await getAavePoolAddress(p.chain);
71
+ // Special case: passing max uint means "withdraw all" in Aave V3.
72
+ const amountWei = p.amount === "max" ? maxUint256 : parseAmountFriendly(p.amount, p.decimals);
73
+ return {
74
+ chain: p.chain,
75
+ to: pool,
76
+ data: encodeFunctionData({
77
+ abi: aavePoolAbi,
78
+ functionName: "withdraw",
79
+ args: [p.asset, amountWei, p.wallet],
80
+ }),
81
+ value: "0",
82
+ from: p.wallet,
83
+ description: `Withdraw ${p.amount === "max" ? "all" : p.amount} ${p.symbol} from Aave V3 on ${p.chain}`,
84
+ decoded: {
85
+ functionName: "withdraw",
86
+ args: { asset: p.asset, amount: p.amount, to: p.wallet },
87
+ },
88
+ };
89
+ }
90
+ /** Aave V3 stable-rate borrowing is disabled on all production markets. We only support variable. */
91
+ const VARIABLE_RATE_MODE = 2n;
92
+ export async function buildAaveBorrow(p) {
93
+ const pool = await getAavePoolAddress(p.chain);
94
+ const amountWei = parseAmountFriendly(p.amount, p.decimals);
95
+ return {
96
+ chain: p.chain,
97
+ to: pool,
98
+ data: encodeFunctionData({
99
+ abi: aavePoolAbi,
100
+ functionName: "borrow",
101
+ args: [p.asset, amountWei, VARIABLE_RATE_MODE, 0, p.wallet],
102
+ }),
103
+ value: "0",
104
+ from: p.wallet,
105
+ description: `Borrow ${p.amount} ${p.symbol} from Aave V3 on ${p.chain} (variable rate)`,
106
+ decoded: {
107
+ functionName: "borrow",
108
+ args: {
109
+ asset: p.asset,
110
+ amount: p.amount,
111
+ rate: "variable",
112
+ onBehalfOf: p.wallet,
113
+ },
114
+ },
115
+ };
116
+ }
117
+ /**
118
+ * Look up the user's current variable debt for an asset by querying the
119
+ * variableDebtToken.balanceOf(wallet). Used for repay-max so we can size an
120
+ * approval that covers the actual debt (plus a buffer for interest that
121
+ * accrues between preparing and signing).
122
+ */
123
+ async function getCurrentVariableDebt(chain, wallet, asset) {
124
+ const pool = await getAavePoolAddress(chain);
125
+ const client = getClient(chain);
126
+ const reserve = (await client.readContract({
127
+ address: pool,
128
+ abi: aavePoolAbi,
129
+ functionName: "getReserveData",
130
+ args: [asset],
131
+ }));
132
+ const variableDebtToken = reserve.variableDebtTokenAddress;
133
+ const debt = (await client.readContract({
134
+ address: variableDebtToken,
135
+ abi: erc20Abi,
136
+ functionName: "balanceOf",
137
+ args: [wallet],
138
+ }));
139
+ return { debt, variableDebtToken };
140
+ }
141
+ export async function buildAaveRepay(p) {
142
+ assertNotNativePseudoaddr(p.asset, "repay");
143
+ const pool = await getAavePoolAddress(p.chain);
144
+ let amountWei;
145
+ let neededForApproval;
146
+ if (p.amount === "max") {
147
+ amountWei = maxUint256;
148
+ // Aave caps the repay at the user's actual debt internally, but transferFrom
149
+ // still needs allowance to cover it. Size the approval to current debt + 1%
150
+ // buffer so we don't revert because interest accrued between prepare and sign.
151
+ const { debt } = await getCurrentVariableDebt(p.chain, p.wallet, p.asset);
152
+ if (debt === 0n) {
153
+ throw new Error(`No variable-rate debt for ${p.symbol} on Aave V3 ${p.chain} — nothing to repay. ` +
154
+ "If you borrowed at stable rate historically, repay via the Aave UI (legacy flow).");
155
+ }
156
+ neededForApproval = (debt * 101n) / 100n;
157
+ }
158
+ else {
159
+ amountWei = parseAmountFriendly(p.amount, p.decimals);
160
+ neededForApproval = amountWei;
161
+ }
162
+ const { approvalAmount, display } = resolveApprovalCap(p.approvalCap, neededForApproval, p.decimals);
163
+ const approval = await buildApprovalTx({
164
+ chain: p.chain,
165
+ wallet: p.wallet,
166
+ asset: p.asset,
167
+ spender: pool,
168
+ amountWei: neededForApproval,
169
+ approvalAmount,
170
+ approvalDisplay: display,
171
+ symbol: p.symbol,
172
+ spenderLabel: "Aave V3 Pool",
173
+ });
174
+ const repayTx = {
175
+ chain: p.chain,
176
+ to: pool,
177
+ data: encodeFunctionData({
178
+ abi: aavePoolAbi,
179
+ functionName: "repay",
180
+ args: [p.asset, amountWei, VARIABLE_RATE_MODE, p.wallet],
181
+ }),
182
+ value: "0",
183
+ from: p.wallet,
184
+ description: `Repay ${p.amount === "max" ? "all" : p.amount} ${p.symbol} on Aave V3 ${p.chain} (variable rate)`,
185
+ decoded: {
186
+ functionName: "repay",
187
+ args: {
188
+ asset: p.asset,
189
+ amount: p.amount,
190
+ rate: "variable",
191
+ onBehalfOf: p.wallet,
192
+ },
193
+ },
194
+ };
195
+ if (approval) {
196
+ let tail = approval;
197
+ while (tail.next)
198
+ tail = tail.next;
199
+ tail.next = repayTx;
200
+ return approval;
201
+ }
202
+ return repayTx;
203
+ }
204
+ export { parseAmountFriendly, formatUnits };
205
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/modules/positions/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { GetLendingPositionsArgs, GetLpPositionsArgs, GetHealthAlertsArgs, SimulatePositionChangeArgs } from "./schemas.js";
2
+ import type { LendingPosition, LPPosition, SupportedChain } from "../../types/index.js";
3
+ export declare function getLendingPositions(args: GetLendingPositionsArgs): Promise<{
4
+ wallet: string;
5
+ positions: LendingPosition[];
6
+ }>;
7
+ export declare function getLpPositions(args: GetLpPositionsArgs): Promise<{
8
+ wallet: string;
9
+ positions: LPPosition[];
10
+ }>;
11
+ export declare function getHealthAlerts(args: GetHealthAlertsArgs): Promise<{
12
+ wallet: string;
13
+ threshold: number;
14
+ atRisk: Array<{
15
+ chain: SupportedChain;
16
+ healthFactor: number;
17
+ collateralUsd: number;
18
+ debtUsd: number;
19
+ marginToLiquidation: number;
20
+ }>;
21
+ }>;
22
+ export declare function simulatePositionChange(args: SimulatePositionChangeArgs): Promise<{
23
+ wallet: string;
24
+ chain: SupportedChain;
25
+ action: string;
26
+ before: {
27
+ healthFactor: number;
28
+ collateralUsd: number;
29
+ debtUsd: number;
30
+ };
31
+ after: {
32
+ healthFactor: number;
33
+ collateralUsd: number;
34
+ debtUsd: number;
35
+ safe: boolean;
36
+ };
37
+ }>;
@@ -0,0 +1,59 @@
1
+ import { getAaveLendingPosition, simulateHealthFactorChange } from "./aave.js";
2
+ import { getUniswapPositions } from "./uniswap.js";
3
+ import { SUPPORTED_CHAINS } from "../../types/index.js";
4
+ function resolveChains(chains) {
5
+ return chains ?? [...SUPPORTED_CHAINS];
6
+ }
7
+ export async function getLendingPositions(args) {
8
+ const wallet = args.wallet;
9
+ const chains = resolveChains(args.chains);
10
+ const results = await Promise.all(chains.map((c) => getAaveLendingPosition(wallet, c)));
11
+ return { wallet, positions: results.filter((p) => p !== null) };
12
+ }
13
+ export async function getLpPositions(args) {
14
+ const wallet = args.wallet;
15
+ const chains = resolveChains(args.chains);
16
+ const perChain = await Promise.all(chains.map((c) => getUniswapPositions(wallet, c)));
17
+ return { wallet, positions: perChain.flat() };
18
+ }
19
+ export async function getHealthAlerts(args) {
20
+ const threshold = args.threshold ?? 1.5;
21
+ const { positions, wallet } = await getLendingPositions({ wallet: args.wallet, chains: undefined });
22
+ const atRisk = positions
23
+ .filter((p) => p.healthFactor < threshold && p.totalDebtUsd > 0)
24
+ .map((p) => ({
25
+ chain: p.chain,
26
+ healthFactor: p.healthFactor,
27
+ collateralUsd: p.totalCollateralUsd,
28
+ debtUsd: p.totalDebtUsd,
29
+ // Margin is the % HF would need to drop by to hit 1.0.
30
+ marginToLiquidation: Math.max(0, Math.round(((p.healthFactor - 1) / p.healthFactor) * 10000) / 100),
31
+ }));
32
+ return { wallet, threshold, atRisk };
33
+ }
34
+ export async function simulatePositionChange(args) {
35
+ const wallet = args.wallet;
36
+ const chain = (args.chain ?? "ethereum");
37
+ const base = await getAaveLendingPosition(wallet, chain);
38
+ if (!base) {
39
+ throw new Error(`Wallet ${wallet} has no Aave V3 position on ${chain}.`);
40
+ }
41
+ const sim = simulateHealthFactorChange(base, args.action, args.amountUsd);
42
+ return {
43
+ wallet,
44
+ chain,
45
+ action: args.action,
46
+ before: {
47
+ healthFactor: base.healthFactor,
48
+ collateralUsd: base.totalCollateralUsd,
49
+ debtUsd: base.totalDebtUsd,
50
+ },
51
+ after: {
52
+ healthFactor: sim.newHealthFactor,
53
+ collateralUsd: sim.newCollateralUsd,
54
+ debtUsd: sim.newDebtUsd,
55
+ safe: sim.safe,
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/positions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ export declare const getLendingPositionsInput: z.ZodObject<{
3
+ wallet: z.ZodString;
4
+ chains: z.ZodOptional<z.ZodArray<z.ZodEnum<[string, ...string[]]>, "many">>;
5
+ }, "strip", z.ZodTypeAny, {
6
+ wallet: string;
7
+ chains?: string[] | undefined;
8
+ }, {
9
+ wallet: string;
10
+ chains?: string[] | undefined;
11
+ }>;
12
+ export declare const getLpPositionsInput: z.ZodObject<{
13
+ wallet: z.ZodString;
14
+ chains: z.ZodOptional<z.ZodArray<z.ZodEnum<[string, ...string[]]>, "many">>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ wallet: string;
17
+ chains?: string[] | undefined;
18
+ }, {
19
+ wallet: string;
20
+ chains?: string[] | undefined;
21
+ }>;
22
+ export declare const getHealthAlertsInput: z.ZodObject<{
23
+ wallet: z.ZodString;
24
+ threshold: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ wallet: string;
27
+ threshold: number;
28
+ }, {
29
+ wallet: string;
30
+ threshold?: number | undefined;
31
+ }>;
32
+ export declare const simulatePositionChangeInput: z.ZodObject<{
33
+ wallet: z.ZodString;
34
+ chain: z.ZodDefault<z.ZodOptional<z.ZodEnum<[string, ...string[]]>>>;
35
+ action: z.ZodEnum<["add_collateral", "remove_collateral", "borrow", "repay"]>;
36
+ asset: z.ZodString;
37
+ /** Amount in USD (base currency) — we approximate since asset price lookups are cheap. */
38
+ amountUsd: z.ZodNumber;
39
+ }, "strip", z.ZodTypeAny, {
40
+ chain: string;
41
+ asset: string;
42
+ wallet: string;
43
+ action: "borrow" | "repay" | "add_collateral" | "remove_collateral";
44
+ amountUsd: number;
45
+ }, {
46
+ asset: string;
47
+ wallet: string;
48
+ action: "borrow" | "repay" | "add_collateral" | "remove_collateral";
49
+ amountUsd: number;
50
+ chain?: string | undefined;
51
+ }>;
52
+ export type GetLendingPositionsArgs = z.infer<typeof getLendingPositionsInput>;
53
+ export type GetLpPositionsArgs = z.infer<typeof getLpPositionsInput>;
54
+ export type GetHealthAlertsArgs = z.infer<typeof getHealthAlertsInput>;
55
+ export type SimulatePositionChangeArgs = z.infer<typeof simulatePositionChangeInput>;
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ import { SUPPORTED_CHAINS } from "../../types/index.js";
3
+ const chainEnum = z.enum(SUPPORTED_CHAINS);
4
+ const walletSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, "must be a 0x-prefixed EVM address");
5
+ export const getLendingPositionsInput = z.object({
6
+ wallet: walletSchema,
7
+ chains: z.array(chainEnum).optional(),
8
+ });
9
+ export const getLpPositionsInput = z.object({
10
+ wallet: walletSchema,
11
+ chains: z.array(chainEnum).optional(),
12
+ });
13
+ export const getHealthAlertsInput = z.object({
14
+ wallet: walletSchema,
15
+ threshold: z.number().min(1).max(10).optional().default(1.5),
16
+ });
17
+ export const simulatePositionChangeInput = z.object({
18
+ wallet: walletSchema,
19
+ chain: chainEnum.optional().default("ethereum"),
20
+ action: z.enum(["add_collateral", "remove_collateral", "borrow", "repay"]),
21
+ asset: z.string().regex(/^0x[a-fA-F0-9]{40}$/),
22
+ /** Amount in USD (base currency) — we approximate since asset price lookups are cheap. */
23
+ amountUsd: z.number().positive(),
24
+ });
25
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/modules/positions/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAoD,CAAC,CAAC;AAC/E,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,mCAAmC,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,YAAY;IACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;IAC/C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC;IAC9C,0FAA0F;IAC1F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LPPosition, SupportedChain } from "../../types/index.js";
2
+ /** Deterministically compute the Uniswap V3 pool address from (factory, token0, token1, fee). */
3
+ export declare function computePoolAddress(factory: `0x${string}`, tokenA: `0x${string}`, tokenB: `0x${string}`, fee: number): `0x${string}`;
4
+ export declare function getUniswapPositions(wallet: `0x${string}`, chain: SupportedChain): Promise<LPPosition[]>;