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.
- package/README.md +362 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/core/detector.d.ts +36 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +142 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/monitor.d.ts +31 -0
- package/dist/core/monitor.d.ts.map +1 -0
- package/dist/core/monitor.js +172 -0
- package/dist/core/monitor.js.map +1 -0
- package/dist/core/reclaimer.d.ts +30 -0
- package/dist/core/reclaimer.d.ts.map +1 -0
- package/dist/core/reclaimer.js +182 -0
- package/dist/core/reclaimer.js.map +1 -0
- package/dist/core/types.d.ts +125 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/db/accounts.d.ts +71 -0
- package/dist/db/accounts.d.ts.map +1 -0
- package/dist/db/accounts.js +205 -0
- package/dist/db/accounts.js.map +1 -0
- package/dist/db/index.d.ts +14 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +104 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/operators.d.ts +48 -0
- package/dist/db/operators.d.ts.map +1 -0
- package/dist/db/operators.js +201 -0
- package/dist/db/operators.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +473 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +121 -0
- package/dist/server/index.js.map +1 -0
- package/dist/services/reporter.d.ts +28 -0
- package/dist/services/reporter.d.ts.map +1 -0
- package/dist/services/reporter.js +107 -0
- package/dist/services/reporter.js.map +1 -0
- package/dist/services/solana.d.ts +59 -0
- package/dist/services/solana.d.ts.map +1 -0
- package/dist/services/solana.js +162 -0
- package/dist/services/solana.js.map +1 -0
- package/dist/services/telegram.d.ts +20 -0
- package/dist/services/telegram.d.ts.map +1 -0
- package/dist/services/telegram.js +213 -0
- package/dist/services/telegram.js.map +1 -0
- package/dist/utils/helpers.d.ts +55 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +116 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +70 -0
- package/dist/utils/logger.js.map +1 -0
- 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"}
|
package/dist/db/index.js
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|