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,17 @@
1
+ import { type SupportedChain } from "../../types/index.js";
2
+ /** Initialize the LiFi SDK once. Safe to call repeatedly. */
3
+ export declare function initLifi(): void;
4
+ export interface LifiQuoteRequest {
5
+ fromChain: SupportedChain;
6
+ toChain: SupportedChain;
7
+ /** Use "native" or "0x0000000000000000000000000000000000000000" for native token. */
8
+ fromToken: `0x${string}` | "native";
9
+ toToken: `0x${string}` | "native";
10
+ /** Raw integer amount as string (e.g. "1000000" for 1 USDC). */
11
+ fromAmount: string;
12
+ fromAddress: `0x${string}`;
13
+ /** Optional slippage override — LiFi default is 0.5% (0.005). */
14
+ slippage?: number;
15
+ }
16
+ export declare function fetchQuote(req: LifiQuoteRequest): Promise<import("@lifi/sdk").LiFiStep>;
17
+ export declare function fetchStatus(txHash: string, fromChain: SupportedChain, toChain: SupportedChain): Promise<import("@lifi/sdk").StatusResponse>;
@@ -0,0 +1,44 @@
1
+ import { createConfig, getQuote, getStatus } from "@lifi/sdk";
2
+ import { CHAIN_IDS } from "../../types/index.js";
3
+ let initialized = false;
4
+ /** Initialize the LiFi SDK once. Safe to call repeatedly. */
5
+ export function initLifi() {
6
+ if (initialized)
7
+ return;
8
+ createConfig({
9
+ integrator: "recon-crypto-mcp",
10
+ // We don't execute routes through LiFi — we just fetch tx data and hand it to WalletConnect.
11
+ });
12
+ initialized = true;
13
+ }
14
+ /** Map our chain name to LiFi's numeric chain ID. */
15
+ function toLifiChain(chain) {
16
+ return CHAIN_IDS[chain];
17
+ }
18
+ const NATIVE = "0x0000000000000000000000000000000000000000";
19
+ export async function fetchQuote(req) {
20
+ initLifi();
21
+ const fromChain = toLifiChain(req.fromChain);
22
+ const toChain = toLifiChain(req.toChain);
23
+ const fromToken = req.fromToken === "native" ? NATIVE : req.fromToken;
24
+ const toToken = req.toToken === "native" ? NATIVE : req.toToken;
25
+ const quote = await getQuote({
26
+ fromChain: fromChain,
27
+ toChain: toChain,
28
+ fromToken,
29
+ toToken,
30
+ fromAmount: req.fromAmount,
31
+ fromAddress: req.fromAddress,
32
+ slippage: req.slippage,
33
+ });
34
+ return quote;
35
+ }
36
+ export async function fetchStatus(txHash, fromChain, toChain) {
37
+ initLifi();
38
+ return getStatus({
39
+ txHash,
40
+ fromChain: toLifiChain(fromChain),
41
+ toChain: toLifiChain(toChain),
42
+ });
43
+ }
44
+ //# sourceMappingURL=lifi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifi.js","sourceRoot":"","sources":["../../../src/modules/swap/lifi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAA0B,MAAM,WAAW,CAAC;AACtF,OAAO,EAAE,SAAS,EAAuB,MAAM,sBAAsB,CAAC;AAEtE,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,6DAA6D;AAC7D,MAAM,UAAU,QAAQ;IACtB,IAAI,WAAW;QAAE,OAAO;IACxB,YAAY,CAAC;QACX,UAAU,EAAE,kBAAkB;QAC9B,6FAA6F;KAC9F,CAAC,CAAC;IACH,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,qDAAqD;AACrD,SAAS,WAAW,CAAC,KAAqB;IACxC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAeD,MAAM,MAAM,GAAG,4CAA4C,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAqB;IACpD,QAAQ,EAAE,CAAC;IACX,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;IACtE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;IAEhE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC;QAC3B,SAAS,EAAE,SAAwB;QACnC,OAAO,EAAE,OAAsB;QAC/B,SAAS;QACT,OAAO;QACP,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,SAAyB,EAAE,OAAuB;IAClG,QAAQ,EAAE,CAAC;IACX,OAAO,SAAS,CAAC;QACf,MAAM;QACN,SAAS,EAAE,WAAW,CAAC,SAAS,CAAgB;QAChD,OAAO,EAAE,WAAW,CAAC,OAAO,CAAgB;KAC7C,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type SupportedChain } from "../../types/index.js";
2
+ export interface OneInchQuoteRequest {
3
+ chain: SupportedChain;
4
+ fromToken: `0x${string}` | "native";
5
+ toToken: `0x${string}` | "native";
6
+ /** Raw integer amount as string (e.g. "1000000" for 1 USDC). */
7
+ fromAmount: string;
8
+ apiKey: string;
9
+ }
10
+ export interface OneInchQuoteRaw {
11
+ dstAmount: string;
12
+ srcToken?: {
13
+ address: string;
14
+ symbol: string;
15
+ decimals: number;
16
+ };
17
+ dstToken?: {
18
+ address: string;
19
+ symbol: string;
20
+ decimals: number;
21
+ };
22
+ /** Estimated gas (units) for the swap, if `includeGas=true` was requested. */
23
+ gas?: number;
24
+ protocols?: unknown[];
25
+ }
26
+ export declare function fetchOneInchQuote(req: OneInchQuoteRequest): Promise<OneInchQuoteRaw>;
@@ -0,0 +1,33 @@
1
+ import { CHAIN_IDS } from "../../types/index.js";
2
+ /**
3
+ * 1inch Aggregation API v6.0 client. Used for intra-chain swap comparison against LiFi.
4
+ *
5
+ * 1inch is intra-chain only (no bridges), so cross-chain routes skip this entirely.
6
+ * The public API requires a Bearer token from https://portal.1inch.dev — when no
7
+ * key is configured, callers should skip the comparison silently rather than error.
8
+ */
9
+ /** 1inch uses this sentinel for the chain's native asset. */
10
+ const ONEINCH_NATIVE = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE";
11
+ export async function fetchOneInchQuote(req) {
12
+ const chainId = CHAIN_IDS[req.chain];
13
+ const src = req.fromToken === "native" ? ONEINCH_NATIVE : req.fromToken;
14
+ const dst = req.toToken === "native" ? ONEINCH_NATIVE : req.toToken;
15
+ const url = new URL(`https://api.1inch.dev/swap/v6.0/${chainId}/quote`);
16
+ url.searchParams.set("src", src);
17
+ url.searchParams.set("dst", dst);
18
+ url.searchParams.set("amount", req.fromAmount);
19
+ url.searchParams.set("includeTokensInfo", "true");
20
+ url.searchParams.set("includeGas", "true");
21
+ const res = await fetch(url, {
22
+ headers: {
23
+ Authorization: `Bearer ${req.apiKey}`,
24
+ Accept: "application/json",
25
+ },
26
+ });
27
+ if (!res.ok) {
28
+ const body = await res.text().catch(() => "");
29
+ throw new Error(`1inch quote ${res.status}: ${body.slice(0, 200)}`);
30
+ }
31
+ return (await res.json());
32
+ }
33
+ //# sourceMappingURL=oneinch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneinch.js","sourceRoot":"","sources":["../../../src/modules/swap/oneinch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAuB,MAAM,sBAAsB,CAAC;AAEtE;;;;;;GAMG;AAEH,6DAA6D;AAC7D,MAAM,cAAc,GAAG,4CAA4C,CAAC;AAoBpE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAwB;IAC9D,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;IACxE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;IAEpE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,mCAAmC,OAAO,QAAQ,CAAC,CAAC;IACxE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAE3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE;YACrC,MAAM,EAAE,kBAAkB;SAC3B;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ export declare const getSwapQuoteInput: z.ZodObject<{
3
+ wallet: z.ZodString;
4
+ fromChain: z.ZodEnum<[string, ...string[]]>;
5
+ toChain: z.ZodEnum<[string, ...string[]]>;
6
+ fromToken: z.ZodUnion<[z.ZodLiteral<"native">, z.ZodString]>;
7
+ toToken: z.ZodUnion<[z.ZodLiteral<"native">, z.ZodString]>;
8
+ amount: z.ZodString;
9
+ fromTokenDecimals: z.ZodOptional<z.ZodNumber>;
10
+ slippageBps: z.ZodOptional<z.ZodNumber>;
11
+ acknowledgeHighSlippage: z.ZodOptional<z.ZodBoolean>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ amount: string;
14
+ wallet: string;
15
+ fromChain: string;
16
+ toChain: string;
17
+ fromToken: string;
18
+ toToken: string;
19
+ fromTokenDecimals?: number | undefined;
20
+ slippageBps?: number | undefined;
21
+ acknowledgeHighSlippage?: boolean | undefined;
22
+ }, {
23
+ amount: string;
24
+ wallet: string;
25
+ fromChain: string;
26
+ toChain: string;
27
+ fromToken: string;
28
+ toToken: string;
29
+ fromTokenDecimals?: number | undefined;
30
+ slippageBps?: number | undefined;
31
+ acknowledgeHighSlippage?: boolean | undefined;
32
+ }>;
33
+ export declare const prepareSwapInput: z.ZodObject<{
34
+ wallet: z.ZodString;
35
+ fromChain: z.ZodEnum<[string, ...string[]]>;
36
+ toChain: z.ZodEnum<[string, ...string[]]>;
37
+ fromToken: z.ZodUnion<[z.ZodLiteral<"native">, z.ZodString]>;
38
+ toToken: z.ZodUnion<[z.ZodLiteral<"native">, z.ZodString]>;
39
+ amount: z.ZodString;
40
+ fromTokenDecimals: z.ZodOptional<z.ZodNumber>;
41
+ slippageBps: z.ZodOptional<z.ZodNumber>;
42
+ acknowledgeHighSlippage: z.ZodOptional<z.ZodBoolean>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ amount: string;
45
+ wallet: string;
46
+ fromChain: string;
47
+ toChain: string;
48
+ fromToken: string;
49
+ toToken: string;
50
+ fromTokenDecimals?: number | undefined;
51
+ slippageBps?: number | undefined;
52
+ acknowledgeHighSlippage?: boolean | undefined;
53
+ }, {
54
+ amount: string;
55
+ wallet: string;
56
+ fromChain: string;
57
+ toChain: string;
58
+ fromToken: string;
59
+ toToken: string;
60
+ fromTokenDecimals?: number | undefined;
61
+ slippageBps?: number | undefined;
62
+ acknowledgeHighSlippage?: boolean | undefined;
63
+ }>;
64
+ export type GetSwapQuoteArgs = z.infer<typeof getSwapQuoteInput>;
65
+ export type PrepareSwapArgs = z.infer<typeof prepareSwapInput>;
@@ -0,0 +1,46 @@
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}$/);
5
+ const tokenSchema = z.union([
6
+ z.literal("native"),
7
+ z.string().regex(/^0x[a-fA-F0-9]{40}$/),
8
+ ]);
9
+ const baseSwapSchema = z.object({
10
+ wallet: walletSchema,
11
+ fromChain: chainEnum,
12
+ toChain: chainEnum,
13
+ fromToken: tokenSchema,
14
+ toToken: tokenSchema,
15
+ amount: z
16
+ .string()
17
+ .describe('Human-readable decimal amount of fromToken, NOT raw wei/base units. ' +
18
+ 'Example: "1.5" for 1.5 USDC, "0.01" for 0.01 ETH. The tool resolves ' +
19
+ 'decimals on-chain and converts internally.'),
20
+ fromTokenDecimals: z
21
+ .number()
22
+ .int()
23
+ .min(0)
24
+ .max(36)
25
+ .optional()
26
+ .describe("Optional decimals hint for fromToken if on-chain lookup fails (rare). Native is 18."),
27
+ slippageBps: z
28
+ .number()
29
+ .int()
30
+ .min(1)
31
+ .max(500)
32
+ .optional()
33
+ .describe("Slippage tolerance in basis points (50 = 0.5%, 100 = 1%). Default ~50. " +
34
+ "Hard-capped at 500 (5%) — anything higher is almost always a sandwich-bait " +
35
+ "misconfiguration. If a legitimate thin-liquidity route genuinely needs >1%, " +
36
+ "also pass `acknowledgeHighSlippage: true`."),
37
+ acknowledgeHighSlippage: z
38
+ .boolean()
39
+ .optional()
40
+ .describe("Opt-in flag required when slippageBps > 100 (1%). Forces the caller to state " +
41
+ "that an unusually-high slippage is intentional — the default rejects the tx " +
42
+ "to protect the user from MEV sandwich attacks."),
43
+ });
44
+ export const getSwapQuoteInput = baseSwapSchema;
45
+ export const prepareSwapInput = baseSwapSchema;
46
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/modules/swap/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,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC;IAC1B,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC;CACxC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,YAAY;IACpB,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,CACP,sEAAsE;QACpE,sEAAsE;QACtE,4CAA4C,CAC/C;IACH,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,qFAAqF,CACtF;IACH,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yEAAyE;QACvE,6EAA6E;QAC7E,8EAA8E;QAC9E,4CAA4C,CAC/C;IACH,uBAAuB,EAAE,CAAC;SACvB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,+EAA+E;QAC7E,8EAA8E;QAC9E,gDAAgD,CACnD;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/setup.js ADDED
@@ -0,0 +1,257 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Interactive setup for Recon Crypto MCP.
4
+ *
5
+ * - Picks an RPC provider (Infura / Alchemy / custom) and validates the API key
6
+ * against a live eth_chainId call.
7
+ * - Optionally captures an Etherscan API key (improves contract-verification tools).
8
+ * - Optionally captures a WalletConnect Cloud project ID.
9
+ * - Optionally pairs Ledger Live over WalletConnect right now.
10
+ * - Persists everything to ~/.recon-crypto-mcp/config.json (0600) and prints a
11
+ * Claude Desktop config snippet the user can copy.
12
+ *
13
+ * Env vars always override the config file at runtime — the setup flow is for
14
+ * users who'd rather not manage env vars.
15
+ */
16
+ import { createInterface } from "node:readline";
17
+ import { createPublicClient, http } from "viem";
18
+ import { mainnet } from "viem/chains";
19
+ import qrcodeTerminal from "qrcode-terminal";
20
+ import { patchUserConfig, readUserConfig, getConfigPath, } from "./config/user-config.js";
21
+ /** Thin readline wrapper so each prompt is a single awaited call. */
22
+ class Prompt {
23
+ rl;
24
+ constructor() {
25
+ this.rl = createInterface({ input: process.stdin, output: process.stdout });
26
+ }
27
+ ask(question) {
28
+ return new Promise((resolve) => this.rl.question(question, (a) => resolve(a.trim())));
29
+ }
30
+ async askDefault(question, def) {
31
+ const answer = await this.ask(`${question} [${def}]: `);
32
+ return answer === "" ? def : answer;
33
+ }
34
+ async askYesNo(question, def) {
35
+ const hint = def ? "Y/n" : "y/N";
36
+ const answer = (await this.ask(`${question} (${hint}): `)).toLowerCase();
37
+ if (answer === "")
38
+ return def;
39
+ return answer === "y" || answer === "yes";
40
+ }
41
+ async askChoice(question, choices, def) {
42
+ console.log(question);
43
+ choices.forEach((c, i) => console.log(` ${i + 1}) ${c}`));
44
+ const raw = await this.ask(`Choose [${def + 1}]: `);
45
+ if (raw === "")
46
+ return def;
47
+ const n = Number(raw);
48
+ if (!Number.isInteger(n) || n < 1 || n > choices.length) {
49
+ console.log(` Invalid selection — defaulting to ${choices[def]}.`);
50
+ return def;
51
+ }
52
+ return n - 1;
53
+ }
54
+ close() {
55
+ this.rl.close();
56
+ }
57
+ }
58
+ const PROVIDER_URLS = {
59
+ infura: {
60
+ ethereum: (k) => `https://mainnet.infura.io/v3/${k}`,
61
+ arbitrum: (k) => `https://arbitrum-mainnet.infura.io/v3/${k}`,
62
+ polygon: (k) => `https://polygon-mainnet.infura.io/v3/${k}`,
63
+ },
64
+ alchemy: {
65
+ ethereum: (k) => `https://eth-mainnet.g.alchemy.com/v2/${k}`,
66
+ arbitrum: (k) => `https://arb-mainnet.g.alchemy.com/v2/${k}`,
67
+ polygon: (k) => `https://polygon-mainnet.g.alchemy.com/v2/${k}`,
68
+ },
69
+ };
70
+ /** Make a minimal eth_chainId call against the URL. Returns the numeric chain ID on success. */
71
+ async function validateRpcUrl(url) {
72
+ const client = createPublicClient({ chain: mainnet, transport: http(url, { retryCount: 0 }) });
73
+ const id = await client.getChainId();
74
+ return id;
75
+ }
76
+ async function configureRpc(p) {
77
+ console.log("\n--- RPC Provider ---");
78
+ const providerIdx = await p.askChoice("Select an RPC provider:", ["Infura", "Alchemy", "Custom (bring your own URLs)"], 0);
79
+ const provider = ["infura", "alchemy", "custom"][providerIdx];
80
+ if (provider === "custom") {
81
+ const ethUrl = await p.ask("Ethereum RPC URL: ");
82
+ const arbUrl = await p.ask("Arbitrum RPC URL (leave blank to skip): ");
83
+ const polyUrl = await p.ask("Polygon RPC URL (leave blank to skip): ");
84
+ if (ethUrl) {
85
+ try {
86
+ const id = await validateRpcUrl(ethUrl);
87
+ if (id !== 1)
88
+ console.warn(` Warning: Ethereum URL returned chain ID ${id}, expected 1.`);
89
+ else
90
+ console.log(" Ethereum URL OK.");
91
+ }
92
+ catch (e) {
93
+ console.warn(` Warning: could not validate Ethereum URL — ${e.message}`);
94
+ }
95
+ }
96
+ return {
97
+ provider: "custom",
98
+ customUrls: {
99
+ ...(ethUrl ? { ethereum: ethUrl } : {}),
100
+ ...(arbUrl ? { arbitrum: arbUrl } : {}),
101
+ ...(polyUrl ? { polygon: polyUrl } : {}),
102
+ },
103
+ };
104
+ }
105
+ // infura / alchemy
106
+ const existing = readUserConfig();
107
+ const prevKey = existing?.rpc.provider === provider ? existing.rpc.apiKey : undefined;
108
+ let apiKey = prevKey ?? "";
109
+ for (let attempt = 0; attempt < 3; attempt++) {
110
+ const prompt = prevKey
111
+ ? `${provider} API key [press enter to keep existing]: `
112
+ : `${provider} API key: `;
113
+ const entered = await p.ask(prompt);
114
+ apiKey = entered || prevKey || "";
115
+ if (!apiKey) {
116
+ console.log(" An API key is required.");
117
+ continue;
118
+ }
119
+ const testUrl = PROVIDER_URLS[provider].ethereum(apiKey);
120
+ try {
121
+ const id = await validateRpcUrl(testUrl);
122
+ if (id === 1) {
123
+ console.log(` ${provider} API key OK — Ethereum chain ID ${id}.`);
124
+ return { provider, apiKey };
125
+ }
126
+ console.warn(` Unexpected chain ID ${id} from ${provider}.`);
127
+ }
128
+ catch (e) {
129
+ console.warn(` Validation failed: ${e.message}`);
130
+ }
131
+ }
132
+ throw new Error(`Could not validate ${provider} API key after 3 attempts.`);
133
+ }
134
+ async function configureEtherscan(p) {
135
+ console.log("\n--- Etherscan (optional) ---");
136
+ console.log("Improves contract-verification tools. Skip with empty input.");
137
+ const existing = readUserConfig()?.etherscanApiKey;
138
+ const answer = await p.ask(existing
139
+ ? "Etherscan API key [press enter to keep existing]: "
140
+ : "Etherscan API key (or blank to skip): ");
141
+ if (!answer && existing)
142
+ return existing;
143
+ return answer || undefined;
144
+ }
145
+ async function configureOneInch(p) {
146
+ console.log("\n--- 1inch (optional — enables swap-quote comparison vs LiFi) ---");
147
+ console.log("Create a free key at https://portal.1inch.dev. Skip with empty input.");
148
+ const existing = readUserConfig()?.oneInchApiKey;
149
+ const answer = await p.ask(existing
150
+ ? "1inch API key [press enter to keep existing]: "
151
+ : "1inch API key (or blank to skip): ");
152
+ if (!answer && existing)
153
+ return existing;
154
+ return answer || undefined;
155
+ }
156
+ async function configureWalletConnect(p) {
157
+ console.log("\n--- WalletConnect (optional — required for Ledger Live signing) ---");
158
+ console.log("Create a free project at https://cloud.walletconnect.com.");
159
+ const existing = readUserConfig()?.walletConnect?.projectId;
160
+ const answer = await p.ask(existing
161
+ ? "WalletConnect project ID [press enter to keep existing]: "
162
+ : "WalletConnect project ID (or blank to skip): ");
163
+ if (!answer && existing)
164
+ return existing;
165
+ return answer || undefined;
166
+ }
167
+ async function pairLedgerLiveFlow(p) {
168
+ console.log("\n--- Ledger Live pairing ---");
169
+ const proceed = await p.askYesNo("Pair Ledger Live now via WalletConnect?", false);
170
+ if (!proceed)
171
+ return;
172
+ // Dynamically import so the setup still runs cleanly when WC fails to initialize.
173
+ const { initiatePairing } = await import("./signing/walletconnect.js");
174
+ let pairing;
175
+ try {
176
+ pairing = await initiatePairing();
177
+ }
178
+ catch (e) {
179
+ console.error(` Could not initiate pairing: ${e.message}`);
180
+ return;
181
+ }
182
+ console.log("\nScan this QR in Ledger Live → Discover → WalletConnect, or paste the URI:\n");
183
+ await new Promise((resolve) => qrcodeTerminal.generate(pairing.uri, { small: true }, (qr) => {
184
+ console.log(qr);
185
+ resolve();
186
+ }));
187
+ console.log(`URI: ${pairing.uri}\n`);
188
+ console.log("Waiting for you to approve the session in Ledger Live (Ctrl-C to cancel)...");
189
+ try {
190
+ await pairing.approval;
191
+ console.log("Paired. Session persisted to config.");
192
+ }
193
+ catch (e) {
194
+ console.error(`Pairing failed: ${e.message}`);
195
+ }
196
+ }
197
+ function printClaudeDesktopSnippet() {
198
+ const binPath = "recon-crypto-mcp"; // installed via `npm i -g recon-crypto-mcp`
199
+ const snippet = {
200
+ mcpServers: {
201
+ "recon-crypto-mcp": {
202
+ command: binPath,
203
+ },
204
+ },
205
+ };
206
+ console.log("\n--- Claude Desktop config snippet ---");
207
+ console.log("Add the following to `claude_desktop_config.json`:\n");
208
+ console.log(JSON.stringify(snippet, null, 2));
209
+ console.log("\nIf you're running from source rather than a global install, use:\n" +
210
+ JSON.stringify({
211
+ mcpServers: {
212
+ "recon-crypto-mcp": {
213
+ command: "node",
214
+ args: [`${process.cwd()}/dist/index.js`],
215
+ },
216
+ },
217
+ }, null, 2));
218
+ }
219
+ async function main() {
220
+ console.log("Recon Crypto MCP — interactive setup\n");
221
+ console.log(`Config path: ${getConfigPath()}`);
222
+ const p = new Prompt();
223
+ try {
224
+ const rpc = await configureRpc(p);
225
+ patchUserConfig({ rpc });
226
+ const etherscanApiKey = await configureEtherscan(p);
227
+ if (etherscanApiKey !== undefined) {
228
+ patchUserConfig({ etherscanApiKey });
229
+ }
230
+ const oneInchApiKey = await configureOneInch(p);
231
+ if (oneInchApiKey !== undefined) {
232
+ patchUserConfig({ oneInchApiKey });
233
+ }
234
+ const wcProjectId = await configureWalletConnect(p);
235
+ if (wcProjectId !== undefined) {
236
+ patchUserConfig({ walletConnect: { projectId: wcProjectId } });
237
+ }
238
+ // Pairing needs the project ID to be in config already (getSignClient reads it).
239
+ if (wcProjectId) {
240
+ await pairLedgerLiveFlow(p);
241
+ }
242
+ else {
243
+ console.log("\nSkipping Ledger Live pairing (no WalletConnect project ID set).");
244
+ }
245
+ console.log(`\nConfig written to ${getConfigPath()}.`);
246
+ printClaudeDesktopSnippet();
247
+ }
248
+ catch (err) {
249
+ console.error(`\nSetup aborted: ${err.message}`);
250
+ process.exitCode = 1;
251
+ }
252
+ finally {
253
+ p.close();
254
+ }
255
+ }
256
+ main();
257
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { UnsignedTx } from "../types/index.js";
2
+ /**
3
+ * Throws a descriptive error if `tx` looks unsafe to sign. Call synchronously
4
+ * before every WalletConnect submission. "Unsafe" is conservative: unknown
5
+ * destination + non-empty data, approves to non-allowlisted spenders, or
6
+ * selectors that don't belong to the contract we think we're calling.
7
+ */
8
+ export declare function assertTransactionSafe(tx: UnsignedTx): Promise<void>;