sms-wallet-agent 1.0.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.
- package/README.md +162 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/handlers/sms.d.ts +7 -0
- package/dist/handlers/sms.d.ts.map +1 -0
- package/dist/handlers/sms.js +53 -0
- package/dist/handlers/sms.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/intent.d.ts +5 -0
- package/dist/parser/intent.d.ts.map +1 -0
- package/dist/parser/intent.js +49 -0
- package/dist/parser/intent.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +50 -0
- package/dist/server.js.map +1 -0
- package/dist/services/tracker.d.ts +17 -0
- package/dist/services/tracker.d.ts.map +1 -0
- package/dist/services/tracker.js +120 -0
- package/dist/services/tracker.js.map +1 -0
- package/dist/services/wallet.d.ts +21 -0
- package/dist/services/wallet.d.ts.map +1 -0
- package/dist/services/wallet.js +263 -0
- package/dist/services/wallet.js.map +1 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +103 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/types/index.d.ts +93 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +15 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +7 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +36 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WalletService = void 0;
|
|
7
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const validation_1 = require("../utils/validation");
|
|
10
|
+
const KNOWN_TOKENS = {
|
|
11
|
+
'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v': 'USDC',
|
|
12
|
+
'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB': 'USDT',
|
|
13
|
+
'DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263': 'BONK',
|
|
14
|
+
'JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN': 'JUP',
|
|
15
|
+
'mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So': 'mSOL',
|
|
16
|
+
};
|
|
17
|
+
class WalletService {
|
|
18
|
+
connection;
|
|
19
|
+
constructor(rpcUrl) {
|
|
20
|
+
this.connection = new web3_js_1.Connection(rpcUrl, 'confirmed');
|
|
21
|
+
}
|
|
22
|
+
validateWallet(address) {
|
|
23
|
+
if (!(0, validation_1.isValidSolanaAddress)(address)) {
|
|
24
|
+
return 'Invalid Solana wallet address.';
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
async getBalance(wallet) {
|
|
29
|
+
const error = this.validateWallet(wallet);
|
|
30
|
+
if (error)
|
|
31
|
+
return error;
|
|
32
|
+
const pubkey = new web3_js_1.PublicKey(wallet);
|
|
33
|
+
const lamports = await this.connection.getBalance(pubkey);
|
|
34
|
+
return `Balance:\n${(0, validation_1.formatSol)(lamports)}`;
|
|
35
|
+
}
|
|
36
|
+
async getActivity(wallet) {
|
|
37
|
+
const error = this.validateWallet(wallet);
|
|
38
|
+
if (error)
|
|
39
|
+
return error;
|
|
40
|
+
const activity = await this.fetchRecentActivity(wallet, 5);
|
|
41
|
+
const lines = activity.items.map((item) => `• ${item.summary}`);
|
|
42
|
+
const body = lines.length > 0 ? lines.join('\n') : '• No recent activity found';
|
|
43
|
+
return truncateActivity(`Recent Activity:\n\n${body}\n\nView:\nhttps://solscan.io/account/${wallet}`);
|
|
44
|
+
}
|
|
45
|
+
async getPortfolio(wallet) {
|
|
46
|
+
const error = this.validateWallet(wallet);
|
|
47
|
+
if (error)
|
|
48
|
+
return error;
|
|
49
|
+
const portfolio = await this.fetchPortfolio(wallet);
|
|
50
|
+
const lines = [];
|
|
51
|
+
lines.push(`SOL: ${portfolio.solBalance.toFixed(2)}`);
|
|
52
|
+
const topTokens = portfolio.tokens.slice(0, 5);
|
|
53
|
+
if (topTokens.length > 0) {
|
|
54
|
+
lines.push('');
|
|
55
|
+
lines.push('Top Tokens:');
|
|
56
|
+
for (const token of topTokens) {
|
|
57
|
+
const amount = token.amount >= 1
|
|
58
|
+
? token.amount.toFixed(2)
|
|
59
|
+
: token.amount.toFixed(4);
|
|
60
|
+
lines.push(`• ${token.symbol}: ${amount}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (portfolio.estimatedValueUsd !== undefined) {
|
|
64
|
+
lines.push('');
|
|
65
|
+
lines.push(`Est. Value: ~$${portfolio.estimatedValueUsd.toFixed(2)}`);
|
|
66
|
+
}
|
|
67
|
+
return `Portfolio:\n\n${lines.join('\n')}`;
|
|
68
|
+
}
|
|
69
|
+
async fetchRecentActivity(wallet, limit = 5) {
|
|
70
|
+
const pubkey = new web3_js_1.PublicKey(wallet);
|
|
71
|
+
const signatures = await this.connection.getSignaturesForAddress(pubkey, { limit });
|
|
72
|
+
const items = [];
|
|
73
|
+
for (const sig of signatures.slice(0, limit)) {
|
|
74
|
+
const summary = await this.summarizeSignature(sig, wallet);
|
|
75
|
+
if (summary)
|
|
76
|
+
items.push({ summary });
|
|
77
|
+
}
|
|
78
|
+
return { wallet, items };
|
|
79
|
+
}
|
|
80
|
+
async fetchPortfolio(wallet) {
|
|
81
|
+
const pubkey = new web3_js_1.PublicKey(wallet);
|
|
82
|
+
const lamports = await this.connection.getBalance(pubkey);
|
|
83
|
+
const solBalance = lamports / 1_000_000_000;
|
|
84
|
+
const tokenAccounts = await this.connection.getParsedTokenAccountsByOwner(pubkey, {
|
|
85
|
+
programId: new web3_js_1.PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'),
|
|
86
|
+
});
|
|
87
|
+
const tokens = [];
|
|
88
|
+
for (const { account } of tokenAccounts.value) {
|
|
89
|
+
const parsed = account.data.parsed.info;
|
|
90
|
+
const mint = parsed.mint;
|
|
91
|
+
const amount = Number(parsed.tokenAmount.uiAmount ?? 0);
|
|
92
|
+
if (amount <= 0)
|
|
93
|
+
continue;
|
|
94
|
+
tokens.push({
|
|
95
|
+
symbol: KNOWN_TOKENS[mint] ?? mint.slice(0, 4) + '...',
|
|
96
|
+
amount,
|
|
97
|
+
mint,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
tokens.sort((a, b) => b.amount - a.amount);
|
|
101
|
+
let estimatedValueUsd;
|
|
102
|
+
try {
|
|
103
|
+
estimatedValueUsd = await this.fetchEstimatedValue(wallet);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Optional enrichment
|
|
107
|
+
}
|
|
108
|
+
return { solBalance, tokens, estimatedValueUsd };
|
|
109
|
+
}
|
|
110
|
+
async detectNewEvents(wallet, lastSignature) {
|
|
111
|
+
const pubkey = new web3_js_1.PublicKey(wallet);
|
|
112
|
+
const signatures = await this.connection.getSignaturesForAddress(pubkey, { limit: 10 });
|
|
113
|
+
if (signatures.length === 0)
|
|
114
|
+
return [];
|
|
115
|
+
const events = [];
|
|
116
|
+
for (const sig of signatures) {
|
|
117
|
+
if (sig.signature === lastSignature)
|
|
118
|
+
break;
|
|
119
|
+
const event = await this.detectEventFromSignature(sig, wallet);
|
|
120
|
+
if (event)
|
|
121
|
+
events.push(event);
|
|
122
|
+
}
|
|
123
|
+
return events.reverse();
|
|
124
|
+
}
|
|
125
|
+
getLatestSignature(wallet) {
|
|
126
|
+
const pubkey = new web3_js_1.PublicKey(wallet);
|
|
127
|
+
return this.connection
|
|
128
|
+
.getSignaturesForAddress(pubkey, { limit: 1 })
|
|
129
|
+
.then((sigs) => sigs[0]?.signature);
|
|
130
|
+
}
|
|
131
|
+
async summarizeSignature(sig, wallet) {
|
|
132
|
+
const event = await this.detectEventFromSignature(sig, wallet);
|
|
133
|
+
return event?.event ?? 'Transaction';
|
|
134
|
+
}
|
|
135
|
+
async detectEventFromSignature(sig, wallet) {
|
|
136
|
+
if (sig.err)
|
|
137
|
+
return null;
|
|
138
|
+
const tx = await this.connection.getParsedTransaction(sig.signature, {
|
|
139
|
+
maxSupportedTransactionVersion: 0,
|
|
140
|
+
});
|
|
141
|
+
if (!tx)
|
|
142
|
+
return null;
|
|
143
|
+
const classification = this.classifyTransaction(tx, wallet);
|
|
144
|
+
return {
|
|
145
|
+
wallet,
|
|
146
|
+
event: classification.event,
|
|
147
|
+
amount: classification.amount,
|
|
148
|
+
signature: sig.signature,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
classifyTransaction(tx, wallet) {
|
|
152
|
+
const logs = tx.meta?.logMessages ?? [];
|
|
153
|
+
const logText = logs.join(' ').toLowerCase();
|
|
154
|
+
const preBalances = tx.meta?.preBalances ?? [];
|
|
155
|
+
const postBalances = tx.meta?.postBalances ?? [];
|
|
156
|
+
const accountKeys = tx.transaction.message.accountKeys.map((k) => typeof k === 'string' ? k : k.pubkey.toBase58());
|
|
157
|
+
const walletIndex = accountKeys.indexOf(wallet);
|
|
158
|
+
let solDelta = 0;
|
|
159
|
+
if (walletIndex >= 0) {
|
|
160
|
+
solDelta = (postBalances[walletIndex] ?? 0) - (preBalances[walletIndex] ?? 0);
|
|
161
|
+
}
|
|
162
|
+
if (logText.includes('swap') || logText.includes('jupiter') || logText.includes('raydium')) {
|
|
163
|
+
const swapDetail = this.extractSwapDetail(tx);
|
|
164
|
+
return {
|
|
165
|
+
event: swapDetail ? `Swapped ${swapDetail}` : 'Token Swap',
|
|
166
|
+
amount: solDelta !== 0 ? (0, validation_1.formatSol)(Math.abs(solDelta)) : undefined,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (logText.includes('sale') || logText.includes('sold') || logText.includes('magic eden')) {
|
|
170
|
+
return {
|
|
171
|
+
event: 'NFT Sale',
|
|
172
|
+
amount: solDelta > 0 ? (0, validation_1.formatSol)(solDelta) : undefined,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
if (logText.includes('nft') || logText.includes('metaplex') || logText.includes('token metadata')) {
|
|
176
|
+
return { event: 'NFT Transfer' };
|
|
177
|
+
}
|
|
178
|
+
const tokenTransfer = this.detectTokenTransfer(tx, wallet);
|
|
179
|
+
if (tokenTransfer) {
|
|
180
|
+
return { event: tokenTransfer };
|
|
181
|
+
}
|
|
182
|
+
if (solDelta > 0) {
|
|
183
|
+
return { event: 'SOL received', amount: (0, validation_1.formatSol)(solDelta) };
|
|
184
|
+
}
|
|
185
|
+
if (solDelta < 0) {
|
|
186
|
+
return { event: 'SOL sent', amount: (0, validation_1.formatSol)(Math.abs(solDelta)) };
|
|
187
|
+
}
|
|
188
|
+
return { event: 'Wallet Activity' };
|
|
189
|
+
}
|
|
190
|
+
detectTokenTransfer(tx, wallet) {
|
|
191
|
+
const instructions = tx.transaction.message.instructions;
|
|
192
|
+
for (const ix of instructions) {
|
|
193
|
+
if (!('parsed' in ix))
|
|
194
|
+
continue;
|
|
195
|
+
const parsed = ix.parsed;
|
|
196
|
+
if (parsed?.type === 'transfer' || parsed?.type === 'transferChecked') {
|
|
197
|
+
const info = parsed.info;
|
|
198
|
+
if (info?.destination === wallet)
|
|
199
|
+
return 'Token received';
|
|
200
|
+
if (info?.source === wallet)
|
|
201
|
+
return 'Token transfer';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const inner = tx.meta?.innerInstructions ?? [];
|
|
205
|
+
for (const group of inner) {
|
|
206
|
+
for (const ix of group.instructions) {
|
|
207
|
+
if (!('parsed' in ix))
|
|
208
|
+
continue;
|
|
209
|
+
const parsed = ix.parsed;
|
|
210
|
+
if (parsed?.type === 'transfer' || parsed?.type === 'transferChecked') {
|
|
211
|
+
return 'Token transfer';
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
extractSwapDetail(tx) {
|
|
218
|
+
const pre = tx.meta?.preTokenBalances ?? [];
|
|
219
|
+
const post = tx.meta?.postTokenBalances ?? [];
|
|
220
|
+
const decreased = [];
|
|
221
|
+
const increased = [];
|
|
222
|
+
for (const postBal of post) {
|
|
223
|
+
const preBal = pre.find((p) => p.accountIndex === postBal.accountIndex);
|
|
224
|
+
const preAmt = Number(preBal?.uiTokenAmount?.uiAmount ?? 0);
|
|
225
|
+
const postAmt = Number(postBal.uiTokenAmount?.uiAmount ?? 0);
|
|
226
|
+
const symbol = KNOWN_TOKENS[postBal.mint] ?? 'Token';
|
|
227
|
+
if (postAmt < preAmt)
|
|
228
|
+
decreased.push(symbol);
|
|
229
|
+
if (postAmt > preAmt)
|
|
230
|
+
increased.push(symbol);
|
|
231
|
+
}
|
|
232
|
+
if (decreased.length > 0 && increased.length > 0) {
|
|
233
|
+
return `${decreased[0]} -> ${increased[0]}`;
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
async fetchEstimatedValue(wallet) {
|
|
238
|
+
const response = await axios_1.default.get(`https://public-api.solscan.io/account/${wallet}`, { timeout: 5000, headers: { Accept: 'application/json' } });
|
|
239
|
+
const value = response.data?.lamports
|
|
240
|
+
? response.data.lamports / 1_000_000_000
|
|
241
|
+
: undefined;
|
|
242
|
+
if (value === undefined)
|
|
243
|
+
return undefined;
|
|
244
|
+
const solPrice = await this.fetchSolPrice();
|
|
245
|
+
return value * (solPrice ?? 0);
|
|
246
|
+
}
|
|
247
|
+
async fetchSolPrice() {
|
|
248
|
+
try {
|
|
249
|
+
const response = await axios_1.default.get('https://api.coingecko.com/api/v3/simple/price?ids=solana&vs_currencies=usd', { timeout: 5000 });
|
|
250
|
+
return response.data?.solana?.usd;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
exports.WalletService = WalletService;
|
|
258
|
+
function truncateActivity(text) {
|
|
259
|
+
if (text.length <= 1500)
|
|
260
|
+
return text;
|
|
261
|
+
return text.slice(0, 1497) + '...';
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/services/wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Config, State, TrackedWallet } from '../types';
|
|
2
|
+
export declare function getConfigDir(): string;
|
|
3
|
+
export declare function loadConfig(): Config;
|
|
4
|
+
export declare function saveConfig(config: Config): void;
|
|
5
|
+
export declare function loadTrackedWallets(): TrackedWallet[];
|
|
6
|
+
export declare function saveTrackedWallets(wallets: TrackedWallet[]): void;
|
|
7
|
+
export declare function addTrackedWallet(phone: string, wallet: string): TrackedWallet;
|
|
8
|
+
export declare function removeTrackedWallet(phone: string, wallet: string): boolean;
|
|
9
|
+
export declare function getTrackedWalletsForPhone(phone: string): TrackedWallet[];
|
|
10
|
+
export declare function getAllTrackedWallets(): TrackedWallet[];
|
|
11
|
+
export declare function loadState(): State;
|
|
12
|
+
export declare function saveState(state: State): void;
|
|
13
|
+
export declare function updateWalletState(wallet: string, update: Partial<State[string]>): void;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,MAAM,EAEN,KAAK,EAEL,aAAa,EAEd,MAAM,UAAU,CAAC;AA+BlB,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,kBAAkB,IAAI,aAAa,EAAE,CAGpD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CAKjE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAa7E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM1E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAExE;AAED,wBAAgB,oBAAoB,IAAI,aAAa,EAAE,CAEtD;AAED,wBAAgB,SAAS,IAAI,KAAK,CAGjC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAE5C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAItF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getConfigDir = getConfigDir;
|
|
7
|
+
exports.loadConfig = loadConfig;
|
|
8
|
+
exports.saveConfig = saveConfig;
|
|
9
|
+
exports.loadTrackedWallets = loadTrackedWallets;
|
|
10
|
+
exports.saveTrackedWallets = saveTrackedWallets;
|
|
11
|
+
exports.addTrackedWallet = addTrackedWallet;
|
|
12
|
+
exports.removeTrackedWallet = removeTrackedWallet;
|
|
13
|
+
exports.getTrackedWalletsForPhone = getTrackedWalletsForPhone;
|
|
14
|
+
exports.getAllTrackedWallets = getAllTrackedWallets;
|
|
15
|
+
exports.loadState = loadState;
|
|
16
|
+
exports.saveState = saveState;
|
|
17
|
+
exports.updateWalletState = updateWalletState;
|
|
18
|
+
const fs_1 = __importDefault(require("fs"));
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const os_1 = __importDefault(require("os"));
|
|
21
|
+
const types_1 = require("../types");
|
|
22
|
+
const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.config', 'sms-wallet-agent');
|
|
23
|
+
const PATHS = {
|
|
24
|
+
config: path_1.default.join(CONFIG_DIR, 'config.json'),
|
|
25
|
+
tracked: path_1.default.join(CONFIG_DIR, 'tracked-wallets.json'),
|
|
26
|
+
state: path_1.default.join(CONFIG_DIR, 'state.json'),
|
|
27
|
+
};
|
|
28
|
+
function ensureDir() {
|
|
29
|
+
if (!fs_1.default.existsSync(CONFIG_DIR)) {
|
|
30
|
+
fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function readJson(filePath, fallback) {
|
|
34
|
+
ensureDir();
|
|
35
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
36
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify(fallback, null, 2));
|
|
37
|
+
return fallback;
|
|
38
|
+
}
|
|
39
|
+
const raw = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
40
|
+
return JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
function writeJson(filePath, data) {
|
|
43
|
+
ensureDir();
|
|
44
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify(data, null, 2));
|
|
45
|
+
}
|
|
46
|
+
function getConfigDir() {
|
|
47
|
+
return CONFIG_DIR;
|
|
48
|
+
}
|
|
49
|
+
function loadConfig() {
|
|
50
|
+
const data = readJson(PATHS.config, { port: 3000, rpcUrl: 'https://api.mainnet-beta.solana.com' });
|
|
51
|
+
return types_1.ConfigSchema.parse(data);
|
|
52
|
+
}
|
|
53
|
+
function saveConfig(config) {
|
|
54
|
+
writeJson(PATHS.config, types_1.ConfigSchema.parse(config));
|
|
55
|
+
}
|
|
56
|
+
function loadTrackedWallets() {
|
|
57
|
+
const data = readJson(PATHS.tracked, []);
|
|
58
|
+
return data.map((item) => types_1.TrackedWalletSchema.parse(item));
|
|
59
|
+
}
|
|
60
|
+
function saveTrackedWallets(wallets) {
|
|
61
|
+
writeJson(PATHS.tracked, wallets.map((w) => types_1.TrackedWalletSchema.parse(w)));
|
|
62
|
+
}
|
|
63
|
+
function addTrackedWallet(phone, wallet) {
|
|
64
|
+
const wallets = loadTrackedWallets();
|
|
65
|
+
const existing = wallets.find((w) => w.phone === phone && w.wallet === wallet);
|
|
66
|
+
if (existing)
|
|
67
|
+
return existing;
|
|
68
|
+
const entry = {
|
|
69
|
+
phone,
|
|
70
|
+
wallet,
|
|
71
|
+
addedAt: new Date().toISOString(),
|
|
72
|
+
};
|
|
73
|
+
wallets.push(entry);
|
|
74
|
+
saveTrackedWallets(wallets);
|
|
75
|
+
return entry;
|
|
76
|
+
}
|
|
77
|
+
function removeTrackedWallet(phone, wallet) {
|
|
78
|
+
const wallets = loadTrackedWallets();
|
|
79
|
+
const filtered = wallets.filter((w) => !(w.phone === phone && w.wallet === wallet));
|
|
80
|
+
if (filtered.length === wallets.length)
|
|
81
|
+
return false;
|
|
82
|
+
saveTrackedWallets(filtered);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
function getTrackedWalletsForPhone(phone) {
|
|
86
|
+
return loadTrackedWallets().filter((w) => w.phone === phone);
|
|
87
|
+
}
|
|
88
|
+
function getAllTrackedWallets() {
|
|
89
|
+
return loadTrackedWallets();
|
|
90
|
+
}
|
|
91
|
+
function loadState() {
|
|
92
|
+
const data = readJson(PATHS.state, {});
|
|
93
|
+
return types_1.StateSchema.parse(data);
|
|
94
|
+
}
|
|
95
|
+
function saveState(state) {
|
|
96
|
+
writeJson(PATHS.state, types_1.StateSchema.parse(state));
|
|
97
|
+
}
|
|
98
|
+
function updateWalletState(wallet, update) {
|
|
99
|
+
const state = loadState();
|
|
100
|
+
state[wallet] = { ...state[wallet], ...update };
|
|
101
|
+
saveState(state);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
3
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
4
|
+
rpcUrl: z.ZodDefault<z.ZodString>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
port: number;
|
|
7
|
+
rpcUrl: string;
|
|
8
|
+
}, {
|
|
9
|
+
port?: number | undefined;
|
|
10
|
+
rpcUrl?: string | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
13
|
+
export declare const TrackedWalletSchema: z.ZodObject<{
|
|
14
|
+
phone: z.ZodString;
|
|
15
|
+
wallet: z.ZodString;
|
|
16
|
+
addedAt: z.ZodString;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
phone: string;
|
|
19
|
+
wallet: string;
|
|
20
|
+
addedAt: string;
|
|
21
|
+
}, {
|
|
22
|
+
phone: string;
|
|
23
|
+
wallet: string;
|
|
24
|
+
addedAt: string;
|
|
25
|
+
}>;
|
|
26
|
+
export type TrackedWallet = z.infer<typeof TrackedWalletSchema>;
|
|
27
|
+
export declare const WalletStateSchema: z.ZodObject<{
|
|
28
|
+
lastSignature: z.ZodOptional<z.ZodString>;
|
|
29
|
+
lastChecked: z.ZodOptional<z.ZodString>;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
lastSignature?: string | undefined;
|
|
32
|
+
lastChecked?: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
lastSignature?: string | undefined;
|
|
35
|
+
lastChecked?: string | undefined;
|
|
36
|
+
}>;
|
|
37
|
+
export type WalletState = z.infer<typeof WalletStateSchema>;
|
|
38
|
+
export declare const StateSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
39
|
+
lastSignature: z.ZodOptional<z.ZodString>;
|
|
40
|
+
lastChecked: z.ZodOptional<z.ZodString>;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
lastSignature?: string | undefined;
|
|
43
|
+
lastChecked?: string | undefined;
|
|
44
|
+
}, {
|
|
45
|
+
lastSignature?: string | undefined;
|
|
46
|
+
lastChecked?: string | undefined;
|
|
47
|
+
}>>;
|
|
48
|
+
export type State = z.infer<typeof StateSchema>;
|
|
49
|
+
export type Command = {
|
|
50
|
+
type: 'help';
|
|
51
|
+
} | {
|
|
52
|
+
type: 'balance';
|
|
53
|
+
wallet: string;
|
|
54
|
+
} | {
|
|
55
|
+
type: 'activity';
|
|
56
|
+
wallet: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'portfolio';
|
|
59
|
+
wallet: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'track';
|
|
62
|
+
wallet: string;
|
|
63
|
+
} | {
|
|
64
|
+
type: 'stop';
|
|
65
|
+
wallet: string;
|
|
66
|
+
} | {
|
|
67
|
+
type: 'unknown';
|
|
68
|
+
raw: string;
|
|
69
|
+
};
|
|
70
|
+
export interface ActivityItem {
|
|
71
|
+
summary: string;
|
|
72
|
+
}
|
|
73
|
+
export interface TokenHolding {
|
|
74
|
+
symbol: string;
|
|
75
|
+
amount: number;
|
|
76
|
+
mint: string;
|
|
77
|
+
}
|
|
78
|
+
export interface WalletActivity {
|
|
79
|
+
items: ActivityItem[];
|
|
80
|
+
wallet: string;
|
|
81
|
+
}
|
|
82
|
+
export interface WalletPortfolio {
|
|
83
|
+
solBalance: number;
|
|
84
|
+
tokens: TokenHolding[];
|
|
85
|
+
estimatedValueUsd?: number;
|
|
86
|
+
}
|
|
87
|
+
export interface DetectedEvent {
|
|
88
|
+
wallet: string;
|
|
89
|
+
event: string;
|
|
90
|
+
amount?: string;
|
|
91
|
+
signature: string;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;EAGvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAI9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,WAAW;;;;;;;;;GAA0C,CAAC;AAEnE,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEhD,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StateSchema = exports.WalletStateSchema = exports.TrackedWalletSchema = exports.ConfigSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
exports.ConfigSchema = zod_1.z.object({
|
|
6
|
+
port: zod_1.z.number().default(3000),
|
|
7
|
+
rpcUrl: zod_1.z.string().url().default('https://api.mainnet-beta.solana.com'),
|
|
8
|
+
});
|
|
9
|
+
exports.TrackedWalletSchema = zod_1.z.object({
|
|
10
|
+
phone: zod_1.z.string(),
|
|
11
|
+
wallet: zod_1.z.string(),
|
|
12
|
+
addedAt: zod_1.z.string(),
|
|
13
|
+
});
|
|
14
|
+
exports.WalletStateSchema = zod_1.z.object({
|
|
15
|
+
lastSignature: zod_1.z.string().optional(),
|
|
16
|
+
lastChecked: zod_1.z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
exports.StateSchema = zod_1.z.record(zod_1.z.string(), exports.WalletStateSchema);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC;CACxE,CAAC,CAAC;AAIU,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAIU,QAAA,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAIU,QAAA,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,yBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG;uBACK,MAAM;oBACT,MAAM;oBACN,MAAM;qBACL,MAAM;qBACN,MAAM;CACxB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.log = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
exports.log = {
|
|
9
|
+
success: (message) => console.log(chalk_1.default.green('✓'), message),
|
|
10
|
+
info: (message) => console.log(chalk_1.default.blue('ℹ'), message),
|
|
11
|
+
warn: (message) => console.log(chalk_1.default.yellow('⚠'), message),
|
|
12
|
+
error: (message) => console.error(chalk_1.default.red('✗'), message),
|
|
13
|
+
plain: (message) => console.log(message),
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAEb,QAAA,GAAG,GAAG;IACjB,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACpE,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAChE,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAClE,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAClE,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;CACjD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isValidSolanaAddress(address: string): boolean;
|
|
2
|
+
export declare function truncateAddress(address: string, chars?: number): string;
|
|
3
|
+
export declare function formatSol(lamports: number): string;
|
|
4
|
+
export declare function formatTokenAmount(amount: number, decimals: number): number;
|
|
5
|
+
/** Keep SMS responses under ~1600 chars (Twilio concatenated limit). */
|
|
6
|
+
export declare function truncateForSms(text: string, maxLength?: number): string;
|
|
7
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAGlE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,MAAM,CAGrE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidSolanaAddress = isValidSolanaAddress;
|
|
4
|
+
exports.truncateAddress = truncateAddress;
|
|
5
|
+
exports.formatSol = formatSol;
|
|
6
|
+
exports.formatTokenAmount = formatTokenAmount;
|
|
7
|
+
exports.truncateForSms = truncateForSms;
|
|
8
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
9
|
+
function isValidSolanaAddress(address) {
|
|
10
|
+
try {
|
|
11
|
+
new web3_js_1.PublicKey(address);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function truncateAddress(address, chars = 4) {
|
|
19
|
+
if (address.length <= chars * 2 + 3)
|
|
20
|
+
return address;
|
|
21
|
+
return `${address.slice(0, chars)}...${address.slice(-chars)}`;
|
|
22
|
+
}
|
|
23
|
+
function formatSol(lamports) {
|
|
24
|
+
const sol = lamports / 1_000_000_000;
|
|
25
|
+
return `${sol.toFixed(2)} SOL`;
|
|
26
|
+
}
|
|
27
|
+
function formatTokenAmount(amount, decimals) {
|
|
28
|
+
return amount / Math.pow(10, decimals);
|
|
29
|
+
}
|
|
30
|
+
/** Keep SMS responses under ~1600 chars (Twilio concatenated limit). */
|
|
31
|
+
function truncateForSms(text, maxLength = 1500) {
|
|
32
|
+
if (text.length <= maxLength)
|
|
33
|
+
return text;
|
|
34
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":";;AAEA,oDAOC;AAED,0CAGC;AAED,8BAGC;AAED,8CAEC;AAGD,wCAGC;AA7BD,6CAA4C;AAE5C,SAAgB,oBAAoB,CAAC,OAAe;IAClD,IAAI,CAAC;QACH,IAAI,mBAAS,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe,EAAE,KAAK,GAAG,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAgB,SAAS,CAAC,QAAgB;IACxC,MAAM,GAAG,GAAG,QAAQ,GAAG,aAAa,CAAC;IACrC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACjC,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAc,EAAE,QAAgB;IAChE,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,wEAAwE;AACxE,SAAgB,cAAc,CAAC,IAAY,EAAE,SAAS,GAAG,IAAI;IAC3D,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC9C,CAAC"}
|