@catalyst-team/poly-mcp 0.1.1 → 0.1.2

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 (107) hide show
  1. package/README.md +240 -21
  2. package/dist/errors.d.ts +11 -0
  3. package/dist/errors.d.ts.map +1 -1
  4. package/dist/errors.js +13 -2
  5. package/dist/errors.js.map +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +98 -5
  8. package/dist/index.js.map +1 -1
  9. package/dist/sdk-instance.d.ts +27 -0
  10. package/dist/sdk-instance.d.ts.map +1 -0
  11. package/dist/sdk-instance.js +64 -0
  12. package/dist/sdk-instance.js.map +1 -0
  13. package/dist/server.d.ts +13 -1
  14. package/dist/server.d.ts.map +1 -1
  15. package/dist/server.js +29 -27
  16. package/dist/server.js.map +1 -1
  17. package/dist/tools/guide.d.ts.map +1 -1
  18. package/dist/tools/guide.js +159 -1
  19. package/dist/tools/guide.js.map +1 -1
  20. package/dist/tools/index.d.ts +8 -4
  21. package/dist/tools/index.d.ts.map +1 -1
  22. package/dist/tools/index.js +20 -4
  23. package/dist/tools/index.js.map +1 -1
  24. package/dist/tools/insider-detection.d.ts +175 -0
  25. package/dist/tools/insider-detection.d.ts.map +1 -0
  26. package/dist/tools/insider-detection.js +654 -0
  27. package/dist/tools/insider-detection.js.map +1 -0
  28. package/dist/tools/insider-signals.d.ts +56 -0
  29. package/dist/tools/insider-signals.d.ts.map +1 -0
  30. package/dist/tools/insider-signals.js +170 -0
  31. package/dist/tools/insider-signals.js.map +1 -0
  32. package/dist/tools/market.d.ts +25 -1
  33. package/dist/tools/market.d.ts.map +1 -1
  34. package/dist/tools/market.js +504 -12
  35. package/dist/tools/market.js.map +1 -1
  36. package/dist/tools/onchain.d.ts +240 -0
  37. package/dist/tools/onchain.d.ts.map +1 -0
  38. package/dist/tools/onchain.js +610 -0
  39. package/dist/tools/onchain.js.map +1 -0
  40. package/dist/tools/order.d.ts.map +1 -1
  41. package/dist/tools/order.js +13 -6
  42. package/dist/tools/order.js.map +1 -1
  43. package/dist/tools/trade.d.ts +15 -0
  44. package/dist/tools/trade.d.ts.map +1 -1
  45. package/dist/tools/trade.js +216 -39
  46. package/dist/tools/trade.js.map +1 -1
  47. package/dist/tools/trader.d.ts +4 -1
  48. package/dist/tools/trader.d.ts.map +1 -1
  49. package/dist/tools/trader.js +316 -4
  50. package/dist/tools/trader.js.map +1 -1
  51. package/dist/tools/wallet-classification.d.ts +166 -0
  52. package/dist/tools/wallet-classification.d.ts.map +1 -0
  53. package/dist/tools/wallet-classification.js +455 -0
  54. package/dist/tools/wallet-classification.js.map +1 -0
  55. package/dist/tools/wallet.d.ts +56 -7
  56. package/dist/tools/wallet.d.ts.map +1 -1
  57. package/dist/tools/wallet.js +141 -20
  58. package/dist/tools/wallet.js.map +1 -1
  59. package/dist/types.d.ts +269 -10
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/wallet-manager.d.ts +67 -0
  62. package/dist/wallet-manager.d.ts.map +1 -0
  63. package/dist/wallet-manager.js +180 -0
  64. package/dist/wallet-manager.js.map +1 -0
  65. package/docs/01-mcp.md +554 -32
  66. package/docs/02-wallet-deep-research.md +344 -0
  67. package/docs/e2e-02/00-gap-analysis.md +211 -0
  68. package/docs/e2e-02/01-test-scenarios.md +530 -0
  69. package/docs/e2e-02/02-implementation-plan.md +190 -0
  70. package/docs/e2e-02/README.md +102 -0
  71. package/docs/reports/simonbanza-strategy-analysis-2025-12-25.md +420 -0
  72. package/docs/reports/smart-money-analysis-2025-12-23-cn.md +840 -0
  73. package/docs/reports/smart-money-trading-strategies-2025-12-25.md +440 -0
  74. package/docs/reports/weekly/01-v2.5.md +352 -0
  75. package/docs/reports/weekly/01.md +402 -0
  76. package/docs/reports/weekly/02-deep.md +558 -0
  77. package/docs/reports/weekly/02.md +505 -0
  78. package/docs/reports/weekly/03.md +437 -0
  79. package/docs/reports/weekly/04.md +418 -0
  80. package/docs/reports/weekly/05.md +485 -0
  81. package/docs/reports/weekly/06.md +436 -0
  82. package/docs/reports/weekly/07.md +381 -0
  83. package/docs/reports/weekly/08.md +502 -0
  84. package/docs/reports/weekly/09.md +441 -0
  85. package/docs/reports/weekly/10.md +511 -0
  86. package/docs/reports/weekly/README.md +188 -0
  87. package/docs/reports/weekly/prompt-v2.5.md +1019 -0
  88. package/docs/reports/weekly/prompt-v3.md +432 -0
  89. package/docs/reports/weekly/prompt.md +841 -0
  90. package/package.json +3 -2
  91. package/src/errors.ts +13 -2
  92. package/src/index.ts +286 -1
  93. package/src/sdk-instance.ts +78 -0
  94. package/src/server.ts +30 -28
  95. package/src/tools/guide.ts +160 -1
  96. package/src/tools/index.ts +65 -0
  97. package/src/tools/insider-detection.ts +899 -0
  98. package/src/tools/insider-signals.ts +213 -0
  99. package/src/tools/market.ts +569 -12
  100. package/src/tools/onchain.ts +738 -0
  101. package/src/tools/order.ts +25 -12
  102. package/src/tools/trade.ts +265 -53
  103. package/src/tools/trader.ts +350 -4
  104. package/src/tools/wallet-classification.ts +587 -0
  105. package/src/tools/wallet.ts +172 -23
  106. package/src/types.ts +294 -11
  107. package/src/wallet-manager.ts +209 -0
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Wallet Manager - Multi-wallet support for poly-mcp
3
+ *
4
+ * Supports multiple private keys configuration via environment variables:
5
+ *
6
+ * Option 1: JSON format (recommended)
7
+ * POLY_WALLETS='{"main":"0x...", "trading":"0x...", "arb":"0x..."}'
8
+ *
9
+ * Option 2: Single key (backward compatible)
10
+ * POLY_PRIVATE_KEY='0x...'
11
+ *
12
+ * Option 3: Indexed keys
13
+ * POLY_PRIVATE_KEY_1='0x...'
14
+ * POLY_PRIVATE_KEY_2='0x...'
15
+ */
16
+
17
+ import { Wallet } from 'ethers';
18
+
19
+ export interface WalletInfo {
20
+ name: string;
21
+ address: string;
22
+ wallet: Wallet;
23
+ }
24
+
25
+ export class WalletManager {
26
+ private wallets: Map<string, WalletInfo> = new Map();
27
+ private walletsByAddress: Map<string, WalletInfo> = new Map();
28
+ private activeWalletName: string | null = null;
29
+
30
+ constructor() {
31
+ this.loadWalletsFromEnv();
32
+ }
33
+
34
+ private loadWalletsFromEnv(): void {
35
+ // Debug: log all POLY_* env vars
36
+ console.error('[WalletManager] Loading wallets from env...');
37
+ console.error('[WalletManager] POLY_WALLETS:', process.env.POLY_WALLETS ? 'set' : 'not set');
38
+ console.error('[WalletManager] POLY_PRIVATE_KEY:', process.env.POLY_PRIVATE_KEY ? 'set' : 'not set');
39
+ console.error('[WalletManager] POLY_PRIVATE_KEY_1:', process.env.POLY_PRIVATE_KEY_1 ? 'set' : 'not set');
40
+ console.error('[WalletManager] POLY_PRIVATE_KEY_2:', process.env.POLY_PRIVATE_KEY_2 ? 'set' : 'not set');
41
+
42
+ // Option 1: JSON format POLY_WALLETS
43
+ const walletsJson = process.env.POLY_WALLETS;
44
+ if (walletsJson) {
45
+ try {
46
+ const walletsConfig = JSON.parse(walletsJson) as Record<string, string>;
47
+ for (const [name, privateKey] of Object.entries(walletsConfig)) {
48
+ this.addWallet(name, privateKey);
49
+ }
50
+ } catch (error) {
51
+ console.error('Failed to parse POLY_WALLETS JSON:', error);
52
+ }
53
+ }
54
+
55
+ // Option 2: Single POLY_PRIVATE_KEY (backward compatible)
56
+ const singleKey = process.env.POLY_PRIVATE_KEY;
57
+ if (singleKey && !this.wallets.has('default')) {
58
+ this.addWallet('default', singleKey);
59
+ }
60
+
61
+ // Option 3: Indexed keys POLY_PRIVATE_KEY_1, POLY_PRIVATE_KEY_2, ...
62
+ for (let i = 1; i <= 10; i++) {
63
+ const key = process.env[`POLY_PRIVATE_KEY_${i}`];
64
+ if (key) {
65
+ const name = process.env[`POLY_WALLET_NAME_${i}`] || `wallet${i}`;
66
+ console.error(`[WalletManager] Found indexed key ${i}: name=${name}`);
67
+ if (!this.wallets.has(name)) {
68
+ this.addWallet(name, key);
69
+ }
70
+ }
71
+ }
72
+
73
+ // Set first wallet as active if any exist
74
+ if (this.wallets.size > 0 && !this.activeWalletName) {
75
+ this.activeWalletName = this.wallets.keys().next().value ?? null;
76
+ }
77
+ }
78
+
79
+ private addWallet(name: string, privateKey: string): boolean {
80
+ try {
81
+ const formattedKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;
82
+ const wallet = new Wallet(formattedKey);
83
+
84
+ // Check for dummy wallet
85
+ if (wallet.address === '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf') {
86
+ console.error(`Skipping dummy wallet for "${name}"`);
87
+ return false;
88
+ }
89
+
90
+ const info: WalletInfo = {
91
+ name,
92
+ address: wallet.address,
93
+ wallet,
94
+ };
95
+
96
+ this.wallets.set(name, info);
97
+ this.walletsByAddress.set(wallet.address.toLowerCase(), info);
98
+
99
+ console.error(`Wallet "${name}" loaded: ${wallet.address}`);
100
+ return true;
101
+ } catch (error) {
102
+ console.error(`Failed to create wallet "${name}":`, error);
103
+ return false;
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Get all available wallets
109
+ */
110
+ listWallets(): Array<{ name: string; address: string; isActive: boolean }> {
111
+ return Array.from(this.wallets.values()).map((info) => ({
112
+ name: info.name,
113
+ address: info.address,
114
+ isActive: info.name === this.activeWalletName,
115
+ }));
116
+ }
117
+
118
+ /**
119
+ * Get wallet by name or address
120
+ */
121
+ getWallet(nameOrAddress?: string): WalletInfo | undefined {
122
+ if (!nameOrAddress) {
123
+ // Return active wallet
124
+ if (this.activeWalletName) {
125
+ return this.wallets.get(this.activeWalletName);
126
+ }
127
+ return undefined;
128
+ }
129
+
130
+ // Try by name first
131
+ const byName = this.wallets.get(nameOrAddress);
132
+ if (byName) {
133
+ return byName;
134
+ }
135
+
136
+ // Try by address
137
+ const byAddress = this.walletsByAddress.get(nameOrAddress.toLowerCase());
138
+ if (byAddress) {
139
+ return byAddress;
140
+ }
141
+
142
+ return undefined;
143
+ }
144
+
145
+ /**
146
+ * Get the active wallet
147
+ */
148
+ getActiveWallet(): WalletInfo | undefined {
149
+ if (this.activeWalletName) {
150
+ return this.wallets.get(this.activeWalletName);
151
+ }
152
+ return undefined;
153
+ }
154
+
155
+ /**
156
+ * Set the active wallet by name or address
157
+ */
158
+ setActiveWallet(nameOrAddress: string): boolean {
159
+ const wallet = this.getWallet(nameOrAddress);
160
+ if (wallet) {
161
+ this.activeWalletName = wallet.name;
162
+ console.error(`Active wallet set to "${wallet.name}" (${wallet.address})`);
163
+ return true;
164
+ }
165
+ return false;
166
+ }
167
+
168
+ /**
169
+ * Get the private key for a wallet (for SDK initialization)
170
+ */
171
+ getPrivateKey(nameOrAddress?: string): string | undefined {
172
+ const wallet = this.getWallet(nameOrAddress);
173
+ if (wallet) {
174
+ return wallet.wallet.privateKey;
175
+ }
176
+ return undefined;
177
+ }
178
+
179
+ /**
180
+ * Check if any wallets are configured
181
+ */
182
+ hasWallets(): boolean {
183
+ return this.wallets.size > 0;
184
+ }
185
+
186
+ /**
187
+ * Get the count of configured wallets
188
+ */
189
+ get count(): number {
190
+ return this.wallets.size;
191
+ }
192
+
193
+ /**
194
+ * Get wallet addresses as array
195
+ */
196
+ getAddresses(): string[] {
197
+ return Array.from(this.wallets.values()).map((w) => w.address);
198
+ }
199
+ }
200
+
201
+ // Singleton instance
202
+ let walletManagerInstance: WalletManager | null = null;
203
+
204
+ export function getWalletManager(): WalletManager {
205
+ if (!walletManagerInstance) {
206
+ walletManagerInstance = new WalletManager();
207
+ }
208
+ return walletManagerInstance;
209
+ }