vacuum-sol 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.
Files changed (62) hide show
  1. package/README.md +362 -0
  2. package/dist/config.d.ts +15 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +58 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/core/detector.d.ts +36 -0
  7. package/dist/core/detector.d.ts.map +1 -0
  8. package/dist/core/detector.js +142 -0
  9. package/dist/core/detector.js.map +1 -0
  10. package/dist/core/monitor.d.ts +31 -0
  11. package/dist/core/monitor.d.ts.map +1 -0
  12. package/dist/core/monitor.js +172 -0
  13. package/dist/core/monitor.js.map +1 -0
  14. package/dist/core/reclaimer.d.ts +30 -0
  15. package/dist/core/reclaimer.d.ts.map +1 -0
  16. package/dist/core/reclaimer.js +182 -0
  17. package/dist/core/reclaimer.js.map +1 -0
  18. package/dist/core/types.d.ts +125 -0
  19. package/dist/core/types.d.ts.map +1 -0
  20. package/dist/core/types.js +2 -0
  21. package/dist/core/types.js.map +1 -0
  22. package/dist/db/accounts.d.ts +71 -0
  23. package/dist/db/accounts.d.ts.map +1 -0
  24. package/dist/db/accounts.js +205 -0
  25. package/dist/db/accounts.js.map +1 -0
  26. package/dist/db/index.d.ts +14 -0
  27. package/dist/db/index.d.ts.map +1 -0
  28. package/dist/db/index.js +104 -0
  29. package/dist/db/index.js.map +1 -0
  30. package/dist/db/operators.d.ts +48 -0
  31. package/dist/db/operators.d.ts.map +1 -0
  32. package/dist/db/operators.js +201 -0
  33. package/dist/db/operators.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +473 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/server/index.d.ts +5 -0
  39. package/dist/server/index.d.ts.map +1 -0
  40. package/dist/server/index.js +121 -0
  41. package/dist/server/index.js.map +1 -0
  42. package/dist/services/reporter.d.ts +28 -0
  43. package/dist/services/reporter.d.ts.map +1 -0
  44. package/dist/services/reporter.js +107 -0
  45. package/dist/services/reporter.js.map +1 -0
  46. package/dist/services/solana.d.ts +59 -0
  47. package/dist/services/solana.d.ts.map +1 -0
  48. package/dist/services/solana.js +162 -0
  49. package/dist/services/solana.js.map +1 -0
  50. package/dist/services/telegram.d.ts +20 -0
  51. package/dist/services/telegram.d.ts.map +1 -0
  52. package/dist/services/telegram.js +213 -0
  53. package/dist/services/telegram.js.map +1 -0
  54. package/dist/utils/helpers.d.ts +55 -0
  55. package/dist/utils/helpers.d.ts.map +1 -0
  56. package/dist/utils/helpers.js +116 -0
  57. package/dist/utils/helpers.js.map +1 -0
  58. package/dist/utils/logger.d.ts +14 -0
  59. package/dist/utils/logger.d.ts.map +1 -0
  60. package/dist/utils/logger.js +70 -0
  61. package/dist/utils/logger.js.map +1 -0
  62. package/package.json +69 -0
@@ -0,0 +1,205 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import { getDatabase } from './index.js';
3
+ /**
4
+ * Convert database row to TrackedAccount
5
+ */
6
+ function rowToAccount(row) {
7
+ return {
8
+ id: row.id,
9
+ pubkey: new PublicKey(row.pubkey),
10
+ accountType: row.account_type,
11
+ sponsorTx: row.sponsor_tx || undefined,
12
+ rentLamports: row.rent_lamports,
13
+ owner: row.owner ? new PublicKey(row.owner) : undefined,
14
+ mint: row.mint ? new PublicKey(row.mint) : undefined,
15
+ createdAt: new Date(row.created_at),
16
+ lastCheckedAt: new Date(row.last_checked_at),
17
+ lastActivityAt: row.last_activity_at
18
+ ? new Date(row.last_activity_at)
19
+ : undefined,
20
+ status: row.status,
21
+ };
22
+ }
23
+ // ==================== TRACKED ACCOUNTS ====================
24
+ /**
25
+ * Add a new account to track
26
+ */
27
+ export function addTrackedAccount(account) {
28
+ const db = getDatabase();
29
+ const stmt = db.prepare(`
30
+ INSERT INTO tracked_accounts (pubkey, account_type, sponsor_tx, rent_lamports, owner, mint, status)
31
+ VALUES (?, ?, ?, ?, ?, ?, ?)
32
+ ON CONFLICT(pubkey) DO UPDATE SET
33
+ account_type = excluded.account_type,
34
+ rent_lamports = excluded.rent_lamports,
35
+ owner = excluded.owner,
36
+ mint = excluded.mint,
37
+ last_checked_at = datetime('now')
38
+ `);
39
+ const result = stmt.run(account.pubkey.toBase58(), account.accountType, account.sponsorTx || null, account.rentLamports, account.owner?.toBase58() || null, account.mint?.toBase58() || null, account.status);
40
+ return result.lastInsertRowid;
41
+ }
42
+ /**
43
+ * Get all tracked accounts
44
+ */
45
+ export function getAllTrackedAccounts(operatorId) {
46
+ const db = getDatabase();
47
+ const query = operatorId
48
+ ? 'SELECT * FROM tracked_accounts WHERE operator_id = ? ORDER BY created_at DESC'
49
+ : 'SELECT * FROM tracked_accounts ORDER BY created_at DESC';
50
+ const rows = operatorId
51
+ ? db.prepare(query).all(operatorId)
52
+ : db.prepare(query).all();
53
+ return rows.map(rowToAccount);
54
+ }
55
+ /**
56
+ * Get tracked accounts by status
57
+ */
58
+ export function getAccountsByStatus(status) {
59
+ const db = getDatabase();
60
+ const rows = db
61
+ .prepare('SELECT * FROM tracked_accounts WHERE status = ? ORDER BY created_at DESC')
62
+ .all(status);
63
+ return rows.map(rowToAccount);
64
+ }
65
+ /**
66
+ * Get a specific tracked account by pubkey
67
+ */
68
+ export function getTrackedAccount(pubkey) {
69
+ const db = getDatabase();
70
+ const row = db
71
+ .prepare('SELECT * FROM tracked_accounts WHERE pubkey = ?')
72
+ .get(pubkey.toBase58());
73
+ return row ? rowToAccount(row) : null;
74
+ }
75
+ /**
76
+ * Update account status
77
+ */
78
+ export function updateAccountStatus(pubkey, status) {
79
+ const db = getDatabase();
80
+ db.prepare("UPDATE tracked_accounts SET status = ?, last_checked_at = datetime('now') WHERE pubkey = ?").run(status, pubkey.toBase58());
81
+ }
82
+ /**
83
+ * Update account after checking state
84
+ */
85
+ export function updateAccountState(pubkey, updates) {
86
+ const db = getDatabase();
87
+ const setClauses = ["last_checked_at = datetime('now')"];
88
+ const params = [];
89
+ if (updates.status !== undefined) {
90
+ setClauses.push('status = ?');
91
+ params.push(updates.status);
92
+ }
93
+ if (updates.rentLamports !== undefined) {
94
+ setClauses.push('rent_lamports = ?');
95
+ params.push(updates.rentLamports);
96
+ }
97
+ if (updates.lastActivityAt !== undefined) {
98
+ setClauses.push('last_activity_at = ?');
99
+ params.push(updates.lastActivityAt.toISOString());
100
+ }
101
+ params.push(pubkey.toBase58());
102
+ db.prepare(`UPDATE tracked_accounts SET ${setClauses.join(', ')} WHERE pubkey = ?`).run(...params);
103
+ }
104
+ /**
105
+ * Delete a tracked account
106
+ */
107
+ export function deleteTrackedAccount(pubkey) {
108
+ const db = getDatabase();
109
+ db.prepare('DELETE FROM tracked_accounts WHERE pubkey = ?').run(pubkey.toBase58());
110
+ }
111
+ /**
112
+ * Get account statistics
113
+ */
114
+ export function getAccountStats() {
115
+ const db = getDatabase();
116
+ const stats = db
117
+ .prepare(`
118
+ SELECT
119
+ COUNT(*) as total,
120
+ SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active,
121
+ SUM(CASE WHEN status = 'reclaimable' THEN 1 ELSE 0 END) as reclaimable,
122
+ SUM(CASE WHEN status = 'reclaimed' THEN 1 ELSE 0 END) as reclaimed,
123
+ SUM(CASE WHEN status = 'protected' THEN 1 ELSE 0 END) as protected,
124
+ SUM(CASE WHEN status IN ('active', 'reclaimable') THEN rent_lamports ELSE 0 END) as total_rent_locked
125
+ FROM tracked_accounts
126
+ `)
127
+ .get();
128
+ const reclaimStats = db
129
+ .prepare('SELECT COALESCE(SUM(amount_reclaimed), 0) as total FROM reclaim_history')
130
+ .get();
131
+ return {
132
+ total: stats.total || 0,
133
+ active: stats.active || 0,
134
+ reclaimable: stats.reclaimable || 0,
135
+ reclaimed: stats.reclaimed || 0,
136
+ protected: stats.protected || 0,
137
+ totalRentLocked: stats.total_rent_locked || 0,
138
+ totalRentReclaimed: reclaimStats.total || 0,
139
+ };
140
+ }
141
+ // ==================== RECLAIM HISTORY ====================
142
+ /**
143
+ * Add reclaim history entry
144
+ */
145
+ export function addReclaimHistory(accountPubkey, amountReclaimed, txSignature, reason) {
146
+ const db = getDatabase();
147
+ db.prepare(`
148
+ INSERT INTO reclaim_history (account_pubkey, amount_reclaimed, tx_signature, reason)
149
+ VALUES (?, ?, ?, ?)
150
+ `).run(accountPubkey.toBase58(), amountReclaimed, txSignature, reason);
151
+ }
152
+ /**
153
+ * Get reclaim history
154
+ */
155
+ export function getReclaimHistory(limit = 100) {
156
+ const db = getDatabase();
157
+ return db
158
+ .prepare('SELECT * FROM reclaim_history ORDER BY reclaimed_at DESC LIMIT ?')
159
+ .all(limit);
160
+ }
161
+ // ==================== PROTECTED ACCOUNTS ====================
162
+ /**
163
+ * Add account to protection list
164
+ */
165
+ export function addProtectedAccount(pubkey, reason) {
166
+ const db = getDatabase();
167
+ db.prepare(`
168
+ INSERT OR REPLACE INTO protected_accounts (pubkey, reason)
169
+ VALUES (?, ?)
170
+ `).run(pubkey.toBase58(), reason);
171
+ // Update status in tracked accounts
172
+ db.prepare("UPDATE tracked_accounts SET status = 'protected' WHERE pubkey = ?").run(pubkey.toBase58());
173
+ }
174
+ /**
175
+ * Remove account from protection list
176
+ */
177
+ export function removeProtectedAccount(pubkey) {
178
+ const db = getDatabase();
179
+ db.prepare('DELETE FROM protected_accounts WHERE pubkey = ?').run(pubkey.toBase58());
180
+ // Reset status to active
181
+ db.prepare("UPDATE tracked_accounts SET status = 'active' WHERE pubkey = ?").run(pubkey.toBase58());
182
+ }
183
+ /**
184
+ * Check if account is protected
185
+ */
186
+ export function isAccountProtected(pubkey) {
187
+ const db = getDatabase();
188
+ const row = db
189
+ .prepare('SELECT 1 FROM protected_accounts WHERE pubkey = ?')
190
+ .get(pubkey.toBase58());
191
+ return row !== undefined;
192
+ }
193
+ /**
194
+ * Get all protected accounts
195
+ */
196
+ export function getProtectedAccounts() {
197
+ const db = getDatabase();
198
+ const rows = db.prepare('SELECT * FROM protected_accounts').all();
199
+ return rows.map((row) => ({
200
+ pubkey: new PublicKey(row.pubkey),
201
+ reason: row.reason,
202
+ addedAt: new Date(row.added_at),
203
+ }));
204
+ }
205
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/db/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import Database from 'better-sqlite3';
2
+ /**
3
+ * Initialize the database with required tables
4
+ */
5
+ export declare function initDatabase(): Database.Database;
6
+ /**
7
+ * Get the database instance
8
+ */
9
+ export declare function getDatabase(): Database.Database;
10
+ /**
11
+ * Close the database connection
12
+ */
13
+ export declare function closeDatabase(): void;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAQrC;;GAEG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAsFhD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAK/C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}
@@ -0,0 +1,104 @@
1
+ import Database from 'better-sqlite3';
2
+ import { existsSync, mkdirSync } from 'fs';
3
+ import path from 'path';
4
+ import { getConfig } from '../config.js';
5
+ import { logger } from '../utils/logger.js';
6
+ let db = null;
7
+ /**
8
+ * Initialize the database with required tables
9
+ */
10
+ export function initDatabase() {
11
+ if (db)
12
+ return db;
13
+ const config = getConfig();
14
+ const dbPath = path.resolve(config.dbPath);
15
+ const dbDir = path.dirname(dbPath);
16
+ // Create data directory if it doesn't exist
17
+ if (!existsSync(dbDir)) {
18
+ mkdirSync(dbDir, { recursive: true });
19
+ logger.debug(`Created database directory: ${dbDir}`);
20
+ }
21
+ db = new Database(dbPath);
22
+ // Enable WAL mode for better concurrency
23
+ db.pragma('journal_mode = WAL');
24
+ // Create tables
25
+ db.exec(`
26
+ -- Tracked accounts sponsored by Kora
27
+ CREATE TABLE IF NOT EXISTS tracked_accounts (
28
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
29
+ pubkey TEXT UNIQUE NOT NULL,
30
+ account_type TEXT NOT NULL DEFAULT 'unknown',
31
+ sponsor_tx TEXT,
32
+ rent_lamports INTEGER NOT NULL DEFAULT 0,
33
+ owner TEXT,
34
+ mint TEXT,
35
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
36
+ last_checked_at TEXT NOT NULL DEFAULT (datetime('now')),
37
+ last_activity_at TEXT,
38
+ status TEXT NOT NULL DEFAULT 'active'
39
+ );
40
+
41
+ -- Index for faster status queries
42
+ CREATE INDEX IF NOT EXISTS idx_accounts_status ON tracked_accounts(status);
43
+ CREATE INDEX IF NOT EXISTS idx_accounts_type ON tracked_accounts(account_type);
44
+
45
+ -- Reclaim history for audit trail
46
+ CREATE TABLE IF NOT EXISTS reclaim_history (
47
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
48
+ account_pubkey TEXT NOT NULL,
49
+ amount_reclaimed INTEGER NOT NULL,
50
+ tx_signature TEXT NOT NULL,
51
+ reason TEXT,
52
+ reclaimed_at TEXT NOT NULL DEFAULT (datetime('now'))
53
+ );
54
+
55
+ -- Protected accounts (whitelist)
56
+ CREATE TABLE IF NOT EXISTS protected_accounts (
57
+ pubkey TEXT PRIMARY KEY,
58
+ reason TEXT,
59
+ added_at TEXT NOT NULL DEFAULT (datetime('now'))
60
+ );
61
+ `);
62
+ // Initialize operators table
63
+ db.exec(`
64
+ CREATE TABLE IF NOT EXISTS operators (
65
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
66
+ name TEXT UNIQUE NOT NULL,
67
+ keypair_path TEXT NOT NULL,
68
+ treasury_address TEXT NOT NULL,
69
+ created_at TEXT DEFAULT (datetime('now')),
70
+ is_default BOOLEAN DEFAULT 0
71
+ );
72
+ `);
73
+ // Add operator_id column to tracked_accounts if it doesn't exist
74
+ const columns = db
75
+ .prepare('PRAGMA table_info(tracked_accounts)')
76
+ .all();
77
+ const hasOperatorId = columns.some((col) => col.name === 'operator_id');
78
+ if (!hasOperatorId) {
79
+ db.exec('ALTER TABLE tracked_accounts ADD COLUMN operator_id INTEGER REFERENCES operators(id);');
80
+ db.exec('ALTER TABLE reclaim_history ADD COLUMN operator_id INTEGER REFERENCES operators(id);');
81
+ }
82
+ logger.info(`Database initialized at: ${dbPath}`);
83
+ return db;
84
+ }
85
+ /**
86
+ * Get the database instance
87
+ */
88
+ export function getDatabase() {
89
+ if (!db) {
90
+ return initDatabase();
91
+ }
92
+ return db;
93
+ }
94
+ /**
95
+ * Close the database connection
96
+ */
97
+ export function closeDatabase() {
98
+ if (db) {
99
+ db.close();
100
+ db = null;
101
+ logger.debug('Database connection closed');
102
+ }
103
+ }
104
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC1C,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,IAAI,EAAE,GAA6B,IAAI,CAAA;AAEvC;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAEjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAElC,4CAA4C;IAC5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;IAEzB,yCAAyC;IACzC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;IAE/B,gBAAgB;IAChB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCP,CAAC,CAAA;IAEF,6BAA6B;IAC7B,EAAE,CAAC,IAAI,CAAC;;;;;;;;;GASP,CAAC,CAAA;IAEF,iEAAiE;IACjE,MAAM,OAAO,GAAG,EAAE;SACf,OAAO,CAAC,qCAAqC,CAAC;SAC9C,GAAG,EAAW,CAAA;IACjB,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC,CAAA;IAEvE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,IAAI,CACL,uFAAuF,CACxF,CAAA;QACD,EAAE,CAAC,IAAI,CACL,sFAAsF,CACvF,CAAA;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAA;IACjD,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,YAAY,EAAE,CAAA;IACvB,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,EAAE,GAAG,IAAI,CAAA;QACT,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAA;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import Database from 'better-sqlite3';
3
+ export interface Operator {
4
+ id: number;
5
+ name: string;
6
+ keypair_path: string;
7
+ treasury_address: PublicKey;
8
+ created_at: Date;
9
+ is_default: boolean;
10
+ }
11
+ export declare function getOperatorsDb(): Database.Database;
12
+ /**
13
+ * Initialize operators table
14
+ */
15
+ export declare function initOperatorsTable(): void;
16
+ /**
17
+ * Add a new operator
18
+ */
19
+ export declare function addOperator(name: string, keypairPath: string, treasuryAddress: PublicKey, setAsDefault?: boolean): Operator;
20
+ /**
21
+ * Get all operators
22
+ */
23
+ export declare function getAllOperators(): Operator[];
24
+ /**
25
+ * Get operator by ID
26
+ */
27
+ export declare function getOperatorById(id: number): Operator | null;
28
+ /**
29
+ * Get operator by name
30
+ */
31
+ export declare function getOperatorByName(name: string): Operator | null;
32
+ /**
33
+ * Get default operator
34
+ */
35
+ export declare function getDefaultOperator(): Operator | null;
36
+ /**
37
+ * Set default operator
38
+ */
39
+ export declare function setDefaultOperator(id: number): void;
40
+ /**
41
+ * Remove operator
42
+ */
43
+ export declare function removeOperator(id: number): void;
44
+ /**
45
+ * Update operator
46
+ */
47
+ export declare function updateOperator(id: number, updates: Partial<Pick<Operator, 'name' | 'keypair_path' | 'treasury_address'>>): void;
48
+ //# sourceMappingURL=operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../src/db/operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAKrC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,SAAS,CAAA;IAC3B,UAAU,EAAE,IAAI,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB;AAID,wBAAgB,cAAc,IAAI,QAAQ,CAAC,QAAQ,CAOlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CA4BzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,SAAS,EAC1B,YAAY,UAAQ,GACnB,QAAQ,CAyBV;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,QAAQ,EAAE,CAc5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAc3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAgB/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,GAAG,IAAI,CA4BpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAUnD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAkB/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CACd,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,kBAAkB,CAAC,CAC7D,GACA,IAAI,CA8BN"}
@@ -0,0 +1,201 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import Database from 'better-sqlite3';
3
+ import path from 'path';
4
+ import { getConfig } from '../config.js';
5
+ import { logger } from '../utils/logger.js';
6
+ let operatorsDb = null;
7
+ export function getOperatorsDb() {
8
+ if (!operatorsDb) {
9
+ const config = getConfig();
10
+ const dbPath = path.resolve(config.dbPath);
11
+ operatorsDb = new Database(dbPath);
12
+ }
13
+ return operatorsDb;
14
+ }
15
+ /**
16
+ * Initialize operators table
17
+ */
18
+ export function initOperatorsTable() {
19
+ const db = getOperatorsDb();
20
+ db.exec(`
21
+ CREATE TABLE IF NOT EXISTS operators (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
23
+ name TEXT UNIQUE NOT NULL,
24
+ keypair_path TEXT NOT NULL,
25
+ treasury_address TEXT NOT NULL,
26
+ created_at TEXT DEFAULT (datetime('now')),
27
+ is_default BOOLEAN DEFAULT 0
28
+ )
29
+ `);
30
+ // Add operator_id to tracked_accounts if it doesn't exist
31
+ const columns = db
32
+ .prepare('PRAGMA table_info(tracked_accounts)')
33
+ .all();
34
+ const hasOperatorId = columns.some((col) => col.name === 'operator_id');
35
+ if (!hasOperatorId) {
36
+ db.exec(`
37
+ ALTER TABLE tracked_accounts ADD COLUMN operator_id INTEGER REFERENCES operators(id);
38
+ `);
39
+ logger.debug('Added operator_id column to tracked_accounts');
40
+ }
41
+ logger.debug('Operators table initialized');
42
+ }
43
+ /**
44
+ * Add a new operator
45
+ */
46
+ export function addOperator(name, keypairPath, treasuryAddress, setAsDefault = false) {
47
+ const db = getOperatorsDb();
48
+ if (setAsDefault) {
49
+ // Unset all current defaults
50
+ db.prepare('UPDATE operators SET is_default = 0').run();
51
+ }
52
+ const result = db
53
+ .prepare(`INSERT INTO operators (name, keypair_path, treasury_address, is_default)
54
+ VALUES (?, ?, ?, ?)`)
55
+ .run(name, keypairPath, treasuryAddress.toBase58(), setAsDefault ? 1 : 0);
56
+ logger.success(`Added operator: ${name}`);
57
+ return {
58
+ id: result.lastInsertRowid,
59
+ name,
60
+ keypair_path: keypairPath,
61
+ treasury_address: treasuryAddress,
62
+ created_at: new Date(),
63
+ is_default: setAsDefault,
64
+ };
65
+ }
66
+ /**
67
+ * Get all operators
68
+ */
69
+ export function getAllOperators() {
70
+ const db = getOperatorsDb();
71
+ const rows = db
72
+ .prepare('SELECT * FROM operators ORDER BY created_at DESC')
73
+ .all();
74
+ return rows.map((row) => ({
75
+ id: row.id,
76
+ name: row.name,
77
+ keypair_path: row.keypair_path,
78
+ treasury_address: new PublicKey(row.treasury_address),
79
+ created_at: new Date(row.created_at),
80
+ is_default: Boolean(row.is_default),
81
+ }));
82
+ }
83
+ /**
84
+ * Get operator by ID
85
+ */
86
+ export function getOperatorById(id) {
87
+ const db = getOperatorsDb();
88
+ const row = db.prepare('SELECT * FROM operators WHERE id = ?').get(id);
89
+ if (!row)
90
+ return null;
91
+ return {
92
+ id: row.id,
93
+ name: row.name,
94
+ keypair_path: row.keypair_path,
95
+ treasury_address: new PublicKey(row.treasury_address),
96
+ created_at: new Date(row.created_at),
97
+ is_default: Boolean(row.is_default),
98
+ };
99
+ }
100
+ /**
101
+ * Get operator by name
102
+ */
103
+ export function getOperatorByName(name) {
104
+ const db = getOperatorsDb();
105
+ const row = db
106
+ .prepare('SELECT * FROM operators WHERE name = ?')
107
+ .get(name);
108
+ if (!row)
109
+ return null;
110
+ return {
111
+ id: row.id,
112
+ name: row.name,
113
+ keypair_path: row.keypair_path,
114
+ treasury_address: new PublicKey(row.treasury_address),
115
+ created_at: new Date(row.created_at),
116
+ is_default: Boolean(row.is_default),
117
+ };
118
+ }
119
+ /**
120
+ * Get default operator
121
+ */
122
+ export function getDefaultOperator() {
123
+ const db = getOperatorsDb();
124
+ const row = db
125
+ .prepare('SELECT * FROM operators WHERE is_default = 1')
126
+ .get();
127
+ if (!row) {
128
+ // Return first operator if no default set
129
+ const first = db.prepare('SELECT * FROM operators LIMIT 1').get();
130
+ if (!first)
131
+ return null;
132
+ return {
133
+ id: first.id,
134
+ name: first.name,
135
+ keypair_path: first.keypair_path,
136
+ treasury_address: new PublicKey(first.treasury_address),
137
+ created_at: new Date(first.created_at),
138
+ is_default: Boolean(first.is_default),
139
+ };
140
+ }
141
+ return {
142
+ id: row.id,
143
+ name: row.name,
144
+ keypair_path: row.keypair_path,
145
+ treasury_address: new PublicKey(row.treasury_address),
146
+ created_at: new Date(row.created_at),
147
+ is_default: Boolean(row.is_default),
148
+ };
149
+ }
150
+ /**
151
+ * Set default operator
152
+ */
153
+ export function setDefaultOperator(id) {
154
+ const db = getOperatorsDb();
155
+ // Unset all defaults
156
+ db.prepare('UPDATE operators SET is_default = 0').run();
157
+ // Set new default
158
+ db.prepare('UPDATE operators SET is_default = 1 WHERE id = ?').run(id);
159
+ logger.success(`Set default operator: ID ${id}`);
160
+ }
161
+ /**
162
+ * Remove operator
163
+ */
164
+ export function removeOperator(id) {
165
+ const db = getOperatorsDb();
166
+ // Check if operator has tracked accounts
167
+ const count = db
168
+ .prepare('SELECT COUNT(*) as count FROM tracked_accounts WHERE operator_id = ?')
169
+ .get(id);
170
+ if (count.count > 0) {
171
+ throw new Error(`Cannot remove operator: ${count.count} accounts are tracked. Delete accounts first.`);
172
+ }
173
+ db.prepare('DELETE FROM operators WHERE id = ?').run(id);
174
+ logger.success(`Removed operator: ID ${id}`);
175
+ }
176
+ /**
177
+ * Update operator
178
+ */
179
+ export function updateOperator(id, updates) {
180
+ const db = getOperatorsDb();
181
+ const fields = [];
182
+ const values = [];
183
+ if (updates.name) {
184
+ fields.push('name = ?');
185
+ values.push(updates.name);
186
+ }
187
+ if (updates.keypair_path) {
188
+ fields.push('keypair_path = ?');
189
+ values.push(updates.keypair_path);
190
+ }
191
+ if (updates.treasury_address) {
192
+ fields.push('treasury_address = ?');
193
+ values.push(updates.treasury_address.toBase58());
194
+ }
195
+ if (fields.length === 0)
196
+ return;
197
+ values.push(id);
198
+ db.prepare(`UPDATE operators SET ${fields.join(', ')} WHERE id = ?`).run(...values);
199
+ logger.success(`Updated operator: ID ${id}`);
200
+ }
201
+ //# sourceMappingURL=operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../src/db/operators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}