@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.
- package/README.md +240 -21
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +13 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -5
- package/dist/index.js.map +1 -1
- package/dist/sdk-instance.d.ts +27 -0
- package/dist/sdk-instance.d.ts.map +1 -0
- package/dist/sdk-instance.js +64 -0
- package/dist/sdk-instance.js.map +1 -0
- package/dist/server.d.ts +13 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -27
- package/dist/server.js.map +1 -1
- package/dist/tools/guide.d.ts.map +1 -1
- package/dist/tools/guide.js +159 -1
- package/dist/tools/guide.js.map +1 -1
- package/dist/tools/index.d.ts +8 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +20 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/insider-detection.d.ts +175 -0
- package/dist/tools/insider-detection.d.ts.map +1 -0
- package/dist/tools/insider-detection.js +654 -0
- package/dist/tools/insider-detection.js.map +1 -0
- package/dist/tools/insider-signals.d.ts +56 -0
- package/dist/tools/insider-signals.d.ts.map +1 -0
- package/dist/tools/insider-signals.js +170 -0
- package/dist/tools/insider-signals.js.map +1 -0
- package/dist/tools/market.d.ts +25 -1
- package/dist/tools/market.d.ts.map +1 -1
- package/dist/tools/market.js +504 -12
- package/dist/tools/market.js.map +1 -1
- package/dist/tools/onchain.d.ts +240 -0
- package/dist/tools/onchain.d.ts.map +1 -0
- package/dist/tools/onchain.js +610 -0
- package/dist/tools/onchain.js.map +1 -0
- package/dist/tools/order.d.ts.map +1 -1
- package/dist/tools/order.js +13 -6
- package/dist/tools/order.js.map +1 -1
- package/dist/tools/trade.d.ts +15 -0
- package/dist/tools/trade.d.ts.map +1 -1
- package/dist/tools/trade.js +216 -39
- package/dist/tools/trade.js.map +1 -1
- package/dist/tools/trader.d.ts +4 -1
- package/dist/tools/trader.d.ts.map +1 -1
- package/dist/tools/trader.js +316 -4
- package/dist/tools/trader.js.map +1 -1
- package/dist/tools/wallet-classification.d.ts +166 -0
- package/dist/tools/wallet-classification.d.ts.map +1 -0
- package/dist/tools/wallet-classification.js +455 -0
- package/dist/tools/wallet-classification.js.map +1 -0
- package/dist/tools/wallet.d.ts +56 -7
- package/dist/tools/wallet.d.ts.map +1 -1
- package/dist/tools/wallet.js +141 -20
- package/dist/tools/wallet.js.map +1 -1
- package/dist/types.d.ts +269 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/wallet-manager.d.ts +67 -0
- package/dist/wallet-manager.d.ts.map +1 -0
- package/dist/wallet-manager.js +180 -0
- package/dist/wallet-manager.js.map +1 -0
- package/docs/01-mcp.md +554 -32
- package/docs/02-wallet-deep-research.md +344 -0
- package/docs/e2e-02/00-gap-analysis.md +211 -0
- package/docs/e2e-02/01-test-scenarios.md +530 -0
- package/docs/e2e-02/02-implementation-plan.md +190 -0
- package/docs/e2e-02/README.md +102 -0
- package/docs/reports/simonbanza-strategy-analysis-2025-12-25.md +420 -0
- package/docs/reports/smart-money-analysis-2025-12-23-cn.md +840 -0
- package/docs/reports/smart-money-trading-strategies-2025-12-25.md +440 -0
- package/docs/reports/weekly/01-v2.5.md +352 -0
- package/docs/reports/weekly/01.md +402 -0
- package/docs/reports/weekly/02-deep.md +558 -0
- package/docs/reports/weekly/02.md +505 -0
- package/docs/reports/weekly/03.md +437 -0
- package/docs/reports/weekly/04.md +418 -0
- package/docs/reports/weekly/05.md +485 -0
- package/docs/reports/weekly/06.md +436 -0
- package/docs/reports/weekly/07.md +381 -0
- package/docs/reports/weekly/08.md +502 -0
- package/docs/reports/weekly/09.md +441 -0
- package/docs/reports/weekly/10.md +511 -0
- package/docs/reports/weekly/README.md +188 -0
- package/docs/reports/weekly/prompt-v2.5.md +1019 -0
- package/docs/reports/weekly/prompt-v3.md +432 -0
- package/docs/reports/weekly/prompt.md +841 -0
- package/package.json +3 -2
- package/src/errors.ts +13 -2
- package/src/index.ts +286 -1
- package/src/sdk-instance.ts +78 -0
- package/src/server.ts +30 -28
- package/src/tools/guide.ts +160 -1
- package/src/tools/index.ts +65 -0
- package/src/tools/insider-detection.ts +899 -0
- package/src/tools/insider-signals.ts +213 -0
- package/src/tools/market.ts +569 -12
- package/src/tools/onchain.ts +738 -0
- package/src/tools/order.ts +25 -12
- package/src/tools/trade.ts +265 -53
- package/src/tools/trader.ts +350 -4
- package/src/tools/wallet-classification.ts +587 -0
- package/src/tools/wallet.ts +172 -23
- package/src/types.ts +294 -11
- 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
|
+
}
|