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,116 @@
1
+ /**
2
+ * Pure UTXO-selection logic, independent of any network I/O. Kept here so the
3
+ * coin-selection algorithm can be unit-tested without mocking the HTTP client.
4
+ *
5
+ * Objective: minimize the number of UTXOs remaining in the wallet *after* the
6
+ * transaction confirms — i.e., consolidate. Post-tx UTXO count equals (pool −
7
+ * chosen) + (1 if change else 0), so this is minimized by spending every
8
+ * spendable UTXO and, when possible, absorbing the residue into fee so no
9
+ * change output is created.
10
+ *
11
+ * Strategy: always spend the entire spendable pool. Then:
12
+ * - If totalIn < target + fee(no-change): insufficient funds.
13
+ * - Else if change (= totalIn − target − fee-with-change) ≥ dust: emit a
14
+ * change output. Post-tx wallet has 1 UTXO (the change).
15
+ * - Else: absorb the residue into fee and emit no change output. Post-tx
16
+ * wallet has 0 UTXOs.
17
+ *
18
+ * Tradeoff: consolidation increases the fee on *this* transaction roughly
19
+ * linearly in input count, but eliminates the ongoing cost of carrying — and
20
+ * eventually spending — every small UTXO. The user asked explicitly for this
21
+ * objective, so we take the one-time fee hit.
22
+ */
23
+ export function selectUtxos(input) {
24
+ const chosen = input.utxos
25
+ .filter((u) => input.includeUnconfirmed || u.confirmed)
26
+ .slice()
27
+ // Descending by value — cosmetic; it makes the input list readable but the
28
+ // algorithm spends all of them regardless of order.
29
+ .sort((a, b) => b.value - a.value);
30
+ if (chosen.length === 0) {
31
+ throw new Error("No spendable UTXOs available.");
32
+ }
33
+ const totalIn = chosen.reduce((s, u) => s + BigInt(u.value), 0n);
34
+ const k = chosen.length;
35
+ const vbytesNoChange = input.overheadVbytes + k * input.inputVbytes + input.outputVbytesRecipient;
36
+ const feeNoChange = BigInt(Math.ceil(vbytesNoChange * input.feeRateSatVb));
37
+ if (totalIn < input.targetSats + feeNoChange) {
38
+ throw new Error(`Insufficient funds: have ${totalIn} sats across ${k} UTXOs, need at least ${input.targetSats + feeNoChange} (target + fee).`);
39
+ }
40
+ const vbytesWithChange = vbytesNoChange + input.outputVbytesChange;
41
+ const feeWithChange = BigInt(Math.ceil(vbytesWithChange * input.feeRateSatVb));
42
+ // Prefer a change output when feasible and above dust: keeps the fee at the
43
+ // requested rate rather than over-paying miners. Post-tx wallet has 1 UTXO.
44
+ if (totalIn >= input.targetSats + feeWithChange) {
45
+ const change = totalIn - input.targetSats - feeWithChange;
46
+ if (change >= BigInt(input.dustSats)) {
47
+ return {
48
+ chosen,
49
+ totalInSats: totalIn,
50
+ feeSats: feeWithChange,
51
+ changeSats: change,
52
+ vbytes: vbytesWithChange,
53
+ effectiveFeeRateSatVb: Number(feeWithChange) / vbytesWithChange,
54
+ };
55
+ }
56
+ }
57
+ // Change would be dust (or negative after the change-output overhead) —
58
+ // absorb the residue into fee. Post-tx wallet has 0 UTXOs.
59
+ const actualFee = totalIn - input.targetSats;
60
+ return {
61
+ chosen,
62
+ totalInSats: totalIn,
63
+ feeSats: actualFee,
64
+ changeSats: 0n,
65
+ vbytes: vbytesNoChange,
66
+ effectiveFeeRateSatVb: Number(actualFee) / vbytesNoChange,
67
+ };
68
+ }
69
+ /**
70
+ * vsize constants by Bitcoin script type. Numbers come from BIP-141/BIP-341
71
+ * worst-case witness sizes; close enough for fee estimation.
72
+ */
73
+ export const VBYTES = {
74
+ p2pkh: { input: 148, output: 34 },
75
+ p2sh: { input: 91, output: 32 }, // Assumes P2SH-P2WPKH wrap — the common case.
76
+ p2wpkh: { input: 68, output: 31 },
77
+ p2wsh: { input: 104, output: 43 },
78
+ p2tr: { input: 58, output: 43 },
79
+ };
80
+ /** Detect script type from a mainnet address prefix. */
81
+ export function detectScriptType(address) {
82
+ if (address.startsWith("bc1p"))
83
+ return "p2tr";
84
+ if (address.startsWith("bc1q")) {
85
+ // P2WPKH is 42 chars total ("bc1q" + 38); P2WSH is 62 chars total ("bc1q" + 58).
86
+ return address.length >= 60 ? "p2wsh" : "p2wpkh";
87
+ }
88
+ if (address.startsWith("3"))
89
+ return "p2sh";
90
+ if (address.startsWith("1"))
91
+ return "p2pkh";
92
+ throw new Error(`Cannot detect script type for address: ${address}`);
93
+ }
94
+ /** Dust threshold per script type (sats). From Bitcoin Core policy. */
95
+ export function dustThreshold(scriptType) {
96
+ switch (scriptType) {
97
+ case "p2pkh":
98
+ return 546;
99
+ case "p2sh":
100
+ return 540;
101
+ case "p2wpkh":
102
+ return 294;
103
+ case "p2wsh":
104
+ return 330;
105
+ case "p2tr":
106
+ return 330;
107
+ }
108
+ }
109
+ /**
110
+ * Overhead vbytes for a SegWit-eligible transaction (inputs-from-segwit-address
111
+ * paths). For a pure-legacy spend this is slightly smaller (~10 vB), but
112
+ * overestimating by a couple of bytes just overpays fee by pennies.
113
+ */
114
+ export const SEGWIT_OVERHEAD_VBYTES = 11;
115
+ export const LEGACY_OVERHEAD_VBYTES = 10;
116
+ //# sourceMappingURL=utxo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utxo.js","sourceRoot":"","sources":["../../../src/modules/bitcoin/utxo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PrepareCompoundSupplyArgs, PrepareCompoundWithdrawArgs, PrepareCompoundBorrowArgs, PrepareCompoundRepayArgs } from "./schemas.js";
2
+ import type { UnsignedTx } from "../../types/index.js";
3
+ export declare function buildCompoundSupply(p: PrepareCompoundSupplyArgs): Promise<UnsignedTx>;
4
+ export declare function buildCompoundWithdraw(p: PrepareCompoundWithdrawArgs): Promise<UnsignedTx>;
5
+ /** Borrow = withdraw of the market's base token beyond the user's supplied balance. */
6
+ export declare function buildCompoundBorrow(p: PrepareCompoundBorrowArgs): Promise<UnsignedTx>;
7
+ /** Repay = supply of the market's base token against an outstanding borrow. */
8
+ export declare function buildCompoundRepay(p: PrepareCompoundRepayArgs): Promise<UnsignedTx>;
@@ -0,0 +1,154 @@
1
+ import { encodeFunctionData, parseUnits, maxUint256 } from "viem";
2
+ import { cometAbi } from "../../abis/compound-comet.js";
3
+ import { erc20Abi } from "../../abis/erc20.js";
4
+ import { getClient } from "../../data/rpc.js";
5
+ import { buildApprovalTx, resolveApprovalCap } from "../shared/approval.js";
6
+ async function resolveMeta(chain, asset) {
7
+ const client = getClient(chain);
8
+ const [decimals, symbol] = await client.multicall({
9
+ contracts: [
10
+ { address: asset, abi: erc20Abi, functionName: "decimals" },
11
+ { address: asset, abi: erc20Abi, functionName: "symbol" },
12
+ ],
13
+ allowFailure: false,
14
+ });
15
+ return { decimals: Number(decimals), symbol: symbol };
16
+ }
17
+ async function resolveBaseToken(chain, market) {
18
+ const client = getClient(chain);
19
+ return (await client.readContract({
20
+ address: market,
21
+ abi: cometAbi,
22
+ functionName: "baseToken",
23
+ }));
24
+ }
25
+ export async function buildCompoundSupply(p) {
26
+ const chain = p.chain;
27
+ const market = p.market;
28
+ const asset = p.asset;
29
+ const wallet = p.wallet;
30
+ const meta = await resolveMeta(chain, asset);
31
+ const amountWei = parseUnits(p.amount, meta.decimals);
32
+ const { approvalAmount, display } = resolveApprovalCap(p.approvalCap, amountWei, meta.decimals);
33
+ const approval = await buildApprovalTx({
34
+ chain,
35
+ wallet,
36
+ asset,
37
+ spender: market,
38
+ amountWei,
39
+ approvalAmount,
40
+ approvalDisplay: display,
41
+ symbol: meta.symbol,
42
+ spenderLabel: `Compound V3 market ${market}`,
43
+ });
44
+ const supplyTx = {
45
+ chain,
46
+ to: market,
47
+ data: encodeFunctionData({
48
+ abi: cometAbi,
49
+ functionName: "supply",
50
+ args: [asset, amountWei],
51
+ }),
52
+ value: "0",
53
+ from: wallet,
54
+ description: `Supply ${p.amount} ${meta.symbol} to Compound V3 ${market} on ${chain}`,
55
+ decoded: { functionName: "supply", args: { asset, amount: p.amount, market } },
56
+ };
57
+ if (approval) {
58
+ let tail = approval;
59
+ while (tail.next)
60
+ tail = tail.next;
61
+ tail.next = supplyTx;
62
+ return approval;
63
+ }
64
+ return supplyTx;
65
+ }
66
+ export async function buildCompoundWithdraw(p) {
67
+ const chain = p.chain;
68
+ const market = p.market;
69
+ const asset = p.asset;
70
+ const wallet = p.wallet;
71
+ const meta = await resolveMeta(chain, asset);
72
+ const amountWei = p.amount === "max" ? maxUint256 : parseUnits(p.amount, meta.decimals);
73
+ return {
74
+ chain,
75
+ to: market,
76
+ data: encodeFunctionData({
77
+ abi: cometAbi,
78
+ functionName: "withdraw",
79
+ args: [asset, amountWei],
80
+ }),
81
+ value: "0",
82
+ from: wallet,
83
+ description: `Withdraw ${p.amount === "max" ? "all" : p.amount} ${meta.symbol} from Compound V3 ${market} on ${chain}`,
84
+ decoded: { functionName: "withdraw", args: { asset, amount: p.amount, market } },
85
+ };
86
+ }
87
+ /** Borrow = withdraw of the market's base token beyond the user's supplied balance. */
88
+ export async function buildCompoundBorrow(p) {
89
+ const chain = p.chain;
90
+ const market = p.market;
91
+ const wallet = p.wallet;
92
+ const baseToken = await resolveBaseToken(chain, market);
93
+ const meta = await resolveMeta(chain, baseToken);
94
+ const amountWei = parseUnits(p.amount, meta.decimals);
95
+ return {
96
+ chain,
97
+ to: market,
98
+ data: encodeFunctionData({
99
+ abi: cometAbi,
100
+ functionName: "withdraw",
101
+ args: [baseToken, amountWei],
102
+ }),
103
+ value: "0",
104
+ from: wallet,
105
+ description: `Borrow ${p.amount} ${meta.symbol} from Compound V3 ${market} on ${chain}`,
106
+ decoded: { functionName: "withdraw(base)", args: { asset: baseToken, amount: p.amount, market } },
107
+ };
108
+ }
109
+ /** Repay = supply of the market's base token against an outstanding borrow. */
110
+ export async function buildCompoundRepay(p) {
111
+ const chain = p.chain;
112
+ const market = p.market;
113
+ const wallet = p.wallet;
114
+ const baseToken = await resolveBaseToken(chain, market);
115
+ const meta = await resolveMeta(chain, baseToken);
116
+ const amountWei = p.amount === "max" ? maxUint256 : parseUnits(p.amount, meta.decimals);
117
+ let approval = null;
118
+ if (amountWei !== maxUint256) {
119
+ const { approvalAmount, display } = resolveApprovalCap(p.approvalCap, amountWei, meta.decimals);
120
+ approval = await buildApprovalTx({
121
+ chain,
122
+ wallet,
123
+ asset: baseToken,
124
+ spender: market,
125
+ amountWei,
126
+ approvalAmount,
127
+ approvalDisplay: display,
128
+ symbol: meta.symbol,
129
+ spenderLabel: `Compound V3 market ${market}`,
130
+ });
131
+ }
132
+ const repayTx = {
133
+ chain,
134
+ to: market,
135
+ data: encodeFunctionData({
136
+ abi: cometAbi,
137
+ functionName: "supply",
138
+ args: [baseToken, amountWei],
139
+ }),
140
+ value: "0",
141
+ from: wallet,
142
+ description: `Repay ${p.amount === "max" ? "all" : p.amount} ${meta.symbol} on Compound V3 ${market} on ${chain}`,
143
+ decoded: { functionName: "supply(base)", args: { asset: baseToken, amount: p.amount, market } },
144
+ };
145
+ if (approval) {
146
+ let tail = approval;
147
+ while (tail.next)
148
+ tail = tail.next;
149
+ tail.next = repayTx;
150
+ return approval;
151
+ }
152
+ return repayTx;
153
+ }
154
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/modules/compound/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { formatUnits } from "viem";
2
+ import type { GetCompoundPositionsArgs } from "./schemas.js";
3
+ import type { SupportedChain, TokenAmount } from "../../types/index.js";
4
+ /**
5
+ * A Compound V3 Comet position for a single market.
6
+ * `baseSupplied` and `baseBorrowed` are mutually exclusive at the Comet level — an
7
+ * account either has a positive base balance or a nonzero borrow balance, never both.
8
+ */
9
+ export interface CompoundPosition {
10
+ protocol: "compound-v3";
11
+ chain: SupportedChain;
12
+ market: string;
13
+ marketAddress: `0x${string}`;
14
+ baseSupplied: TokenAmount | null;
15
+ baseBorrowed: TokenAmount | null;
16
+ collateral: TokenAmount[];
17
+ totalCollateralUsd: number;
18
+ totalDebtUsd: number;
19
+ totalSuppliedUsd: number;
20
+ netValueUsd: number;
21
+ }
22
+ export declare function getCompoundPositions(args: GetCompoundPositionsArgs): Promise<{
23
+ wallet: `0x${string}`;
24
+ positions: CompoundPosition[];
25
+ }>;
26
+ export { formatUnits };
@@ -0,0 +1,141 @@
1
+ import { formatUnits } from "viem";
2
+ import { getClient } from "../../data/rpc.js";
3
+ import { CONTRACTS } from "../../config/contracts.js";
4
+ import { cometAbi } from "../../abis/compound-comet.js";
5
+ import { erc20Abi } from "../../abis/erc20.js";
6
+ import { makeTokenAmount, priceTokenAmounts, round } from "../../data/format.js";
7
+ import { SUPPORTED_CHAINS } from "../../types/index.js";
8
+ function listMarkets(chain) {
9
+ const comp = CONTRACTS[chain]
10
+ ?.compound;
11
+ if (!comp)
12
+ return [];
13
+ return Object.entries(comp).map(([name, address]) => ({
14
+ name,
15
+ address: address,
16
+ }));
17
+ }
18
+ async function readMarketPosition(wallet, chain, market) {
19
+ const client = getClient(chain);
20
+ const comet = market.address;
21
+ // Tolerate markets that aren't deployed / reverted — we silently skip them. Previously this
22
+ // used allowFailure:false which made ONE bad market address in the registry blow up the
23
+ // entire portfolio call.
24
+ const results = await client.multicall({
25
+ contracts: [
26
+ { address: comet, abi: cometAbi, functionName: "baseToken" },
27
+ { address: comet, abi: cometAbi, functionName: "numAssets" },
28
+ { address: comet, abi: cometAbi, functionName: "balanceOf", args: [wallet] },
29
+ { address: comet, abi: cometAbi, functionName: "borrowBalanceOf", args: [wallet] },
30
+ ],
31
+ allowFailure: true,
32
+ });
33
+ // Need baseToken + balanceOf + borrowBalanceOf to say anything meaningful. numAssets
34
+ // failing is survivable — we just skip the collateral breakdown.
35
+ if (results[0].status !== "success" ||
36
+ results[2].status !== "success" ||
37
+ results[3].status !== "success") {
38
+ return null;
39
+ }
40
+ const baseToken = results[0].result;
41
+ const supplied = results[2].result;
42
+ const borrowed = results[3].result;
43
+ const baseAddr = baseToken;
44
+ const n = results[1].status === "success" ? Number(results[1].result) : 0;
45
+ // Fetch base token metadata + enumerate collateral asset addresses. allowFailure:true
46
+ // so one weird collateral (non-standard decimals/symbol, rate-limit) doesn't nuke the
47
+ // whole position. We fall back to sane defaults for base token metadata if needed.
48
+ const metaCalls = [
49
+ { address: baseAddr, abi: erc20Abi, functionName: "decimals" },
50
+ { address: baseAddr, abi: erc20Abi, functionName: "symbol" },
51
+ ...Array.from({ length: n }, (_, i) => ({
52
+ address: comet,
53
+ abi: cometAbi,
54
+ functionName: "getAssetInfo",
55
+ args: [i],
56
+ })),
57
+ ];
58
+ const metaResults = await client.multicall({ contracts: metaCalls, allowFailure: true });
59
+ const baseDecimals = metaResults[0].status === "success" ? Number(metaResults[0].result) : 18;
60
+ const baseSymbol = metaResults[1].status === "success" ? metaResults[1].result : "?";
61
+ const collateralAddrs = [];
62
+ for (let i = 0; i < n; i++) {
63
+ const r = metaResults[2 + i];
64
+ if (r.status !== "success")
65
+ continue;
66
+ const info = r.result;
67
+ collateralAddrs.push(info.asset);
68
+ }
69
+ // Collateral balances (parallel). Per-slot allowFailure so one broken ERC-20 read
70
+ // doesn't hide the (healthy) base supply/borrow numbers.
71
+ const collatResults = collateralAddrs.length === 0
72
+ ? []
73
+ : await client.multicall({
74
+ contracts: collateralAddrs.flatMap((addr) => [
75
+ {
76
+ address: comet,
77
+ abi: cometAbi,
78
+ functionName: "collateralBalanceOf",
79
+ args: [wallet, addr],
80
+ },
81
+ { address: addr, abi: erc20Abi, functionName: "decimals" },
82
+ { address: addr, abi: erc20Abi, functionName: "symbol" },
83
+ ]),
84
+ allowFailure: true,
85
+ });
86
+ const baseSuppliedWei = supplied;
87
+ const baseBorrowedWei = borrowed;
88
+ const collateral = [];
89
+ for (let i = 0; i < collateralAddrs.length; i++) {
90
+ const balRes = collatResults[i * 3];
91
+ if (balRes?.status !== "success")
92
+ continue;
93
+ const bal = balRes.result;
94
+ if (bal === 0n)
95
+ continue;
96
+ const decRes = collatResults[i * 3 + 1];
97
+ const symRes = collatResults[i * 3 + 2];
98
+ const decimals = decRes?.status === "success" ? Number(decRes.result) : 18;
99
+ const symbol = symRes?.status === "success" ? symRes.result : "?";
100
+ collateral.push(makeTokenAmount(chain, collateralAddrs[i], bal, decimals, symbol));
101
+ }
102
+ if (baseSuppliedWei === 0n && baseBorrowedWei === 0n && collateral.length === 0) {
103
+ return null;
104
+ }
105
+ const baseSupplied = baseSuppliedWei > 0n
106
+ ? makeTokenAmount(chain, baseAddr, baseSuppliedWei, baseDecimals, baseSymbol)
107
+ : null;
108
+ const baseBorrowed = baseBorrowedWei > 0n
109
+ ? makeTokenAmount(chain, baseAddr, baseBorrowedWei, baseDecimals, baseSymbol)
110
+ : null;
111
+ // Batch price everything (base + collaterals).
112
+ const toPrice = [baseSupplied, baseBorrowed, ...collateral].filter((t) => t !== null);
113
+ await priceTokenAmounts(chain, toPrice);
114
+ const totalCollateralUsd = collateral.reduce((s, t) => s + (t.valueUsd ?? 0), 0);
115
+ const totalDebtUsd = baseBorrowed?.valueUsd ?? 0;
116
+ const totalSuppliedUsd = baseSupplied?.valueUsd ?? 0;
117
+ return {
118
+ protocol: "compound-v3",
119
+ chain,
120
+ market: market.name,
121
+ marketAddress: market.address,
122
+ baseSupplied,
123
+ baseBorrowed,
124
+ collateral,
125
+ totalCollateralUsd: round(totalCollateralUsd, 2),
126
+ totalDebtUsd: round(totalDebtUsd, 2),
127
+ totalSuppliedUsd: round(totalSuppliedUsd, 2),
128
+ netValueUsd: round(totalSuppliedUsd + totalCollateralUsd - totalDebtUsd, 2),
129
+ };
130
+ }
131
+ export async function getCompoundPositions(args) {
132
+ const wallet = args.wallet;
133
+ const chains = args.chains ?? [...SUPPORTED_CHAINS];
134
+ // Use allSettled so an unhealthy chain (Multicall3 returning 0x, rate-limit, etc.)
135
+ // doesn't nuke the other chain's results. Rejected reads are dropped silently.
136
+ const tasks = chains.flatMap((chain) => listMarkets(chain).map((m) => readMarketPosition(wallet, chain, m).catch(() => null)));
137
+ const all = await Promise.all(tasks);
138
+ return { wallet, positions: all.filter((p) => p !== null) };
139
+ }
140
+ export { formatUnits };
141
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/compound/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqBxD,SAAS,WAAW,CAAC,KAAqB;IACxC,MAAM,IAAI,GAAI,SAAoE,CAAC,KAAK,CAAC;QACvF,EAAE,QAAQ,CAAC;IACb,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI;QACJ,OAAO,EAAE,OAAwB;KAClC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAqB,EACrB,KAAqB,EACrB,MAAgD;IAEhD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC;IAE7B,4FAA4F;IAC5F,wFAAwF;IACxF,yBAAyB;IACzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;QACrC,SAAS,EAAE;YACT,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE;YAC5D,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE;YAC5D,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;YAC5E,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;SACnF;QACD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,qFAAqF;IACrF,iEAAiE;IACjE,IACE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS;QAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS;QAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,EAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,QAAQ,GAAG,SAA0B,CAAC;IAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,sFAAsF;IACtF,sFAAsF;IACtF,mFAAmF;IACnF,MAAM,SAAS,GAAG;QAChB,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAmB,EAAE;QACvE,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAiB,EAAE;QACrE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,KAAK;YACd,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,cAAuB;YACrC,IAAI,EAAE,CAAC,CAAC,CAAU;SACnB,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,MAAM,YAAY,GAChB,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,UAAU,GACd,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAiB,CAAC,CAAC,CAAC,GAAG,CAAC;IAChF,MAAM,eAAe,GAAoB,EAAE,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,MAA6C,CAAC;QAC7D,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,kFAAkF;IAClF,yDAAyD;IACzD,MAAM,aAAa,GACjB,eAAe,CAAC,MAAM,KAAK,CAAC;QAC1B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC;YACrB,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3C;oBACE,OAAO,EAAE,KAAK;oBACd,GAAG,EAAE,QAAQ;oBACb,YAAY,EAAE,qBAA8B;oBAC5C,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAU;iBAC9B;gBACD,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAmB,EAAE;gBACnE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAiB,EAAE;aAClE,CAAC;YACF,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IAET,MAAM,eAAe,GAAG,QAAkB,CAAC;IAC3C,MAAM,eAAe,GAAG,QAAkB,CAAC;IAE3C,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS;YAAE,SAAS;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAgB,CAAC;QACpC,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAE,MAAM,CAAC,MAAiB,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9E,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,eAAe,KAAK,EAAE,IAAI,eAAe,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAChB,eAAe,GAAG,EAAE;QAClB,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,CAAC;QAC7E,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,YAAY,GAChB,eAAe,GAAG,EAAE;QAClB,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,CAAC;QAC7E,CAAC,CAAC,IAAI,CAAC;IAEX,+CAA+C;IAC/C,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,CAAC,MAAM,CAChE,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,IAAI,CACpC,CAAC;IACF,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAExC,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,YAAY,EAAE,QAAQ,IAAI,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,YAAY,EAAE,QAAQ,IAAI,CAAC,CAAC;IAErD,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,aAAa,EAAE,MAAM,CAAC,OAAO;QAC7B,YAAY;QACZ,YAAY;QACZ,UAAU;QACV,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAChD,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC5C,WAAW,EAAE,KAAK,CAAC,gBAAgB,GAAG,kBAAkB,GAAG,YAAY,EAAE,CAAC,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAuB,CAAC;IAC5C,MAAM,MAAM,GAAI,IAAI,CAAC,MAAuC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACtF,mFAAmF;IACnF,+EAA+E;IAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACrC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CACtF,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { z } from "zod";
2
+ export declare const getCompoundPositionsInput: 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 prepareCompoundSupplyInput: z.ZodObject<{
13
+ wallet: z.ZodString;
14
+ chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
15
+ market: z.ZodString;
16
+ asset: z.ZodString;
17
+ amount: z.ZodString;
18
+ } & {
19
+ approvalCap: z.ZodOptional<z.ZodString>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ chain: string;
22
+ asset: string;
23
+ amount: string;
24
+ wallet: string;
25
+ market: string;
26
+ approvalCap?: string | undefined;
27
+ }, {
28
+ asset: string;
29
+ amount: string;
30
+ wallet: string;
31
+ market: string;
32
+ chain?: string | undefined;
33
+ approvalCap?: string | undefined;
34
+ }>;
35
+ export declare const prepareCompoundWithdrawInput: z.ZodObject<{
36
+ wallet: z.ZodString;
37
+ chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
38
+ market: z.ZodString;
39
+ asset: z.ZodString;
40
+ amount: z.ZodString;
41
+ }, "strip", z.ZodTypeAny, {
42
+ chain: string;
43
+ asset: string;
44
+ amount: string;
45
+ wallet: string;
46
+ market: string;
47
+ }, {
48
+ asset: string;
49
+ amount: string;
50
+ wallet: string;
51
+ market: string;
52
+ chain?: string | undefined;
53
+ }>;
54
+ /** Convenience wrappers — borrow = withdraw(baseToken); repay = supply(baseToken). */
55
+ export declare const prepareCompoundBorrowInput: z.ZodObject<{
56
+ wallet: z.ZodString;
57
+ chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
58
+ market: z.ZodString;
59
+ amount: z.ZodString;
60
+ }, "strip", z.ZodTypeAny, {
61
+ chain: string;
62
+ amount: string;
63
+ wallet: string;
64
+ market: string;
65
+ }, {
66
+ amount: string;
67
+ wallet: string;
68
+ market: string;
69
+ chain?: string | undefined;
70
+ }>;
71
+ export declare const prepareCompoundRepayInput: z.ZodObject<{
72
+ wallet: z.ZodString;
73
+ chain: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
74
+ market: z.ZodString;
75
+ amount: z.ZodString;
76
+ } & {
77
+ approvalCap: z.ZodOptional<z.ZodString>;
78
+ }, "strip", z.ZodTypeAny, {
79
+ chain: string;
80
+ amount: string;
81
+ wallet: string;
82
+ market: string;
83
+ approvalCap?: string | undefined;
84
+ }, {
85
+ amount: string;
86
+ wallet: string;
87
+ market: string;
88
+ chain?: string | undefined;
89
+ approvalCap?: string | undefined;
90
+ }>;
91
+ export type GetCompoundPositionsArgs = z.infer<typeof getCompoundPositionsInput>;
92
+ export type PrepareCompoundSupplyArgs = z.infer<typeof prepareCompoundSupplyInput>;
93
+ export type PrepareCompoundWithdrawArgs = z.infer<typeof prepareCompoundWithdrawInput>;
94
+ export type PrepareCompoundBorrowArgs = z.infer<typeof prepareCompoundBorrowInput>;
95
+ export type PrepareCompoundRepayArgs = z.infer<typeof prepareCompoundRepayInput>;
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ import { SUPPORTED_CHAINS } from "../../types/index.js";
3
+ import { approvalCapSchema } from "../shared/approval.js";
4
+ const chainEnum = z.enum(SUPPORTED_CHAINS);
5
+ const walletSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/);
6
+ const addressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/);
7
+ export const getCompoundPositionsInput = z.object({
8
+ wallet: walletSchema,
9
+ chains: z.array(chainEnum).optional(),
10
+ });
11
+ const baseCometAction = z.object({
12
+ wallet: walletSchema,
13
+ chain: chainEnum.default("ethereum"),
14
+ market: addressSchema.describe("Comet market address (e.g. cUSDCv3). Discover via get_compound_positions or the Compound registry."),
15
+ asset: addressSchema,
16
+ amount: z
17
+ .string()
18
+ .describe('Human-readable decimal amount of `asset`, NOT raw wei/base units. ' +
19
+ 'Example: "10" for 10 USDC. Pass "max" for full-balance withdraw.'),
20
+ });
21
+ export const prepareCompoundSupplyInput = baseCometAction.extend({
22
+ approvalCap: approvalCapSchema,
23
+ });
24
+ export const prepareCompoundWithdrawInput = baseCometAction;
25
+ /** Convenience wrappers — borrow = withdraw(baseToken); repay = supply(baseToken). */
26
+ export const prepareCompoundBorrowInput = z.object({
27
+ wallet: walletSchema,
28
+ chain: chainEnum.default("ethereum"),
29
+ market: addressSchema,
30
+ amount: z
31
+ .string()
32
+ .describe('Human-readable decimal amount of the market base token, NOT raw wei/base units. Example: "100" for 100 USDC.'),
33
+ });
34
+ export const prepareCompoundRepayInput = prepareCompoundBorrowInput.extend({
35
+ approvalCap: approvalCapSchema,
36
+ });
37
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/modules/compound/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAoD,CAAC,CAAC;AAC/E,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC7D,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;IACpC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAC5B,oGAAoG,CACrG;IACD,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CACP,oEAAoE;QAClE,kEAAkE,CACrE;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,eAAe,CAAC,MAAM,CAAC;IAC/D,WAAW,EAAE,iBAAiB;CAC/B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,eAAe,CAAC;AAE5D,sFAAsF;AACtF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;IACpC,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CACP,8GAA8G,CAC/G;CACJ,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,0BAA0B,CAAC,MAAM,CAAC;IACzE,WAAW,EAAE,iBAAiB;CAC/B,CAAC,CAAC"}