@wopr-network/crypto-plugins 1.0.2 → 1.1.1
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/dist/solana/sweeper.d.ts +4 -5
- package/dist/solana/sweeper.d.ts.map +1 -1
- package/dist/solana/sweeper.js +230 -10
- package/dist/solana/sweeper.js.map +1 -1
- package/dist/sweep/index.js +93 -7
- package/dist/sweep/index.js.map +1 -1
- package/package.json +1 -1
- package/src/solana/sweeper.ts +269 -14
- package/src/sweep/index.ts +105 -7
package/dist/solana/sweeper.d.ts
CHANGED
|
@@ -30,17 +30,16 @@ export declare class SolanaSweeper implements ISweepStrategy {
|
|
|
30
30
|
*/
|
|
31
31
|
sweep(keys: KeyPair[], treasury: string, dryRun: boolean): Promise<SweepResult[]>;
|
|
32
32
|
/**
|
|
33
|
-
* Submit a native SOL transfer.
|
|
33
|
+
* Submit a native SOL transfer via SystemProgram.transfer.
|
|
34
34
|
*
|
|
35
|
-
* Builds
|
|
36
|
-
* and submits via sendTransaction.
|
|
35
|
+
* Builds the instruction manually, signs with Ed25519, and submits via sendTransaction.
|
|
37
36
|
*/
|
|
38
37
|
private submitSolTransfer;
|
|
39
38
|
/**
|
|
40
39
|
* Submit an SPL token transfer.
|
|
41
40
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
41
|
+
* Finds or derives the associated token accounts for sender and receiver,
|
|
42
|
+
* then builds a TokenProgram.Transfer instruction.
|
|
44
43
|
*/
|
|
45
44
|
private submitSplTransfer;
|
|
46
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweeper.d.ts","sourceRoot":"","sources":["../../src/solana/sweeper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sweeper.d.ts","sourceRoot":"","sources":["../../src/solana/sweeper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,WAAW,EACX,cAAc,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,MAAM,6CAA6C,CAAC;AAoMrD;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,IAAI,EAAE,WAAW;IAQ7B;;;;;;OAMG;IACG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAuDtE;;;;;;;OAOG;IACG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6DvF;;;;OAIG;YACW,iBAAiB;IA+B/B;;;;;OAKG;YACW,iBAAiB;CAqD/B"}
|
package/dist/solana/sweeper.js
CHANGED
|
@@ -1,6 +1,172 @@
|
|
|
1
|
+
import { ed25519 } from "@noble/curves/ed25519.js";
|
|
1
2
|
import { createSolanaRpcCaller } from "./watcher.js";
|
|
2
3
|
/** Transaction fee estimate (in lamports). */
|
|
3
4
|
const TX_FEE = 5000n;
|
|
5
|
+
/** SPL Token program ID. */
|
|
6
|
+
const TOKEN_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
7
|
+
/** System program ID. */
|
|
8
|
+
const SYSTEM_PROGRAM_ID = "11111111111111111111111111111111";
|
|
9
|
+
// --- Base58 for Solana ---
|
|
10
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
11
|
+
function base58decode(str) {
|
|
12
|
+
let num = 0n;
|
|
13
|
+
for (const ch of str) {
|
|
14
|
+
const idx = BASE58_ALPHABET.indexOf(ch);
|
|
15
|
+
if (idx < 0)
|
|
16
|
+
throw new Error(`Invalid Base58 char: ${ch}`);
|
|
17
|
+
num = num * 58n + BigInt(idx);
|
|
18
|
+
}
|
|
19
|
+
const bytes = [];
|
|
20
|
+
while (num > 0n) {
|
|
21
|
+
bytes.unshift(Number(num % 256n));
|
|
22
|
+
num = num / 256n;
|
|
23
|
+
}
|
|
24
|
+
let leadingZeros = 0;
|
|
25
|
+
for (const ch of str) {
|
|
26
|
+
if (ch !== "1")
|
|
27
|
+
break;
|
|
28
|
+
leadingZeros++;
|
|
29
|
+
}
|
|
30
|
+
return new Uint8Array([...new Array(leadingZeros).fill(0), ...bytes]);
|
|
31
|
+
}
|
|
32
|
+
function base58encode(data) {
|
|
33
|
+
let num = 0n;
|
|
34
|
+
for (const byte of data)
|
|
35
|
+
num = num * 256n + BigInt(byte);
|
|
36
|
+
let encoded = "";
|
|
37
|
+
while (num > 0n) {
|
|
38
|
+
encoded = BASE58_ALPHABET[Number(num % 58n)] + encoded;
|
|
39
|
+
num = num / 58n;
|
|
40
|
+
}
|
|
41
|
+
for (const byte of data) {
|
|
42
|
+
if (byte !== 0)
|
|
43
|
+
break;
|
|
44
|
+
encoded = `1${encoded}`;
|
|
45
|
+
}
|
|
46
|
+
return encoded || "1";
|
|
47
|
+
}
|
|
48
|
+
// --- Solana transaction helpers ---
|
|
49
|
+
/** Compact-u16 encoding used by Solana for array lengths. */
|
|
50
|
+
function encodeCompactU16(value) {
|
|
51
|
+
if (value < 0x80)
|
|
52
|
+
return new Uint8Array([value]);
|
|
53
|
+
if (value < 0x4000)
|
|
54
|
+
return new Uint8Array([(value & 0x7f) | 0x80, value >> 7]);
|
|
55
|
+
return new Uint8Array([(value & 0x7f) | 0x80, ((value >> 7) & 0x7f) | 0x80, value >> 14]);
|
|
56
|
+
}
|
|
57
|
+
/** Write a u32 as little-endian bytes. */
|
|
58
|
+
function writeU32LE(value) {
|
|
59
|
+
const buf = new Uint8Array(4);
|
|
60
|
+
buf[0] = value & 0xff;
|
|
61
|
+
buf[1] = (value >> 8) & 0xff;
|
|
62
|
+
buf[2] = (value >> 16) & 0xff;
|
|
63
|
+
buf[3] = (value >> 24) & 0xff;
|
|
64
|
+
return buf;
|
|
65
|
+
}
|
|
66
|
+
/** Write a u64 as little-endian bytes. */
|
|
67
|
+
function writeU64LE(value) {
|
|
68
|
+
const buf = new Uint8Array(8);
|
|
69
|
+
for (let i = 0; i < 8; i++) {
|
|
70
|
+
buf[i] = Number(value & 0xffn);
|
|
71
|
+
value = value >> 8n;
|
|
72
|
+
}
|
|
73
|
+
return buf;
|
|
74
|
+
}
|
|
75
|
+
/** Concatenate multiple Uint8Arrays. */
|
|
76
|
+
function concatBytes(...arrays) {
|
|
77
|
+
const total = arrays.reduce((sum, a) => sum + a.length, 0);
|
|
78
|
+
const result = new Uint8Array(total);
|
|
79
|
+
let offset = 0;
|
|
80
|
+
for (const a of arrays) {
|
|
81
|
+
result.set(a, offset);
|
|
82
|
+
offset += a.length;
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build a Solana transaction message (v0 legacy format).
|
|
88
|
+
* Returns the serialized message bytes for signing.
|
|
89
|
+
*/
|
|
90
|
+
function buildTransactionMessage(recentBlockhash, feePayer, instructions) {
|
|
91
|
+
// Collect all unique accounts
|
|
92
|
+
const accountMap = new Map();
|
|
93
|
+
const feePayerKey = base58encode(feePayer);
|
|
94
|
+
accountMap.set(feePayerKey, { pubkey: feePayer, isSigner: true, isWritable: true });
|
|
95
|
+
for (const ix of instructions) {
|
|
96
|
+
const progKey = base58encode(ix.programId);
|
|
97
|
+
if (!accountMap.has(progKey)) {
|
|
98
|
+
accountMap.set(progKey, { pubkey: ix.programId, isSigner: false, isWritable: false });
|
|
99
|
+
}
|
|
100
|
+
for (const acc of ix.accounts) {
|
|
101
|
+
const key = base58encode(acc.pubkey);
|
|
102
|
+
const existing = accountMap.get(key);
|
|
103
|
+
if (existing) {
|
|
104
|
+
existing.isSigner = existing.isSigner || acc.isSigner;
|
|
105
|
+
existing.isWritable = existing.isWritable || acc.isWritable;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
accountMap.set(key, { ...acc });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Sort: signers+writable first, then signers+readonly, then non-signers+writable, then non-signers+readonly
|
|
113
|
+
// Fee payer is always first
|
|
114
|
+
const accounts = [...accountMap.values()];
|
|
115
|
+
accounts.sort((a, b) => {
|
|
116
|
+
const aKey = base58encode(a.pubkey);
|
|
117
|
+
const bKey = base58encode(b.pubkey);
|
|
118
|
+
if (aKey === feePayerKey)
|
|
119
|
+
return -1;
|
|
120
|
+
if (bKey === feePayerKey)
|
|
121
|
+
return 1;
|
|
122
|
+
if (a.isSigner !== b.isSigner)
|
|
123
|
+
return a.isSigner ? -1 : 1;
|
|
124
|
+
if (a.isWritable !== b.isWritable)
|
|
125
|
+
return a.isWritable ? -1 : 1;
|
|
126
|
+
return 0;
|
|
127
|
+
});
|
|
128
|
+
const numRequiredSignatures = accounts.filter((a) => a.isSigner).length;
|
|
129
|
+
const numReadonlySignedAccounts = accounts.filter((a) => a.isSigner && !a.isWritable).length;
|
|
130
|
+
const numReadonlyUnsignedAccounts = accounts.filter((a) => !a.isSigner && !a.isWritable).length;
|
|
131
|
+
const accountKeyIndex = new Map();
|
|
132
|
+
for (let i = 0; i < accounts.length; i++) {
|
|
133
|
+
accountKeyIndex.set(base58encode(accounts[i].pubkey), i);
|
|
134
|
+
}
|
|
135
|
+
// Serialize message
|
|
136
|
+
const header = new Uint8Array([numRequiredSignatures, numReadonlySignedAccounts, numReadonlyUnsignedAccounts]);
|
|
137
|
+
const accountKeysLen = encodeCompactU16(accounts.length);
|
|
138
|
+
const accountKeysData = concatBytes(...accounts.map((a) => a.pubkey));
|
|
139
|
+
const blockhashBytes = base58decode(recentBlockhash);
|
|
140
|
+
const instructionsLen = encodeCompactU16(instructions.length);
|
|
141
|
+
const ixData = [];
|
|
142
|
+
for (const ix of instructions) {
|
|
143
|
+
const progIdx = accountKeyIndex.get(base58encode(ix.programId));
|
|
144
|
+
if (progIdx === undefined)
|
|
145
|
+
throw new Error("Program ID not in account list");
|
|
146
|
+
const accountIdxs = ix.accounts.map((a) => {
|
|
147
|
+
const idx = accountKeyIndex.get(base58encode(a.pubkey));
|
|
148
|
+
if (idx === undefined)
|
|
149
|
+
throw new Error("Account not in account list");
|
|
150
|
+
return idx;
|
|
151
|
+
});
|
|
152
|
+
ixData.push(concatBytes(new Uint8Array([progIdx]), encodeCompactU16(accountIdxs.length), new Uint8Array(accountIdxs), encodeCompactU16(ix.data.length), ix.data));
|
|
153
|
+
}
|
|
154
|
+
return concatBytes(header, accountKeysLen, accountKeysData, blockhashBytes, instructionsLen, ...ixData);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Sign and serialize a full Solana transaction (legacy format).
|
|
158
|
+
* Returns base58-encoded wire format ready for sendTransaction.
|
|
159
|
+
*/
|
|
160
|
+
function signAndSerialize(messageBytes, signers) {
|
|
161
|
+
const signatures = [];
|
|
162
|
+
for (const secretKey of signers) {
|
|
163
|
+
const sig = ed25519.sign(messageBytes, secretKey.slice(0, 32));
|
|
164
|
+
signatures.push(sig);
|
|
165
|
+
}
|
|
166
|
+
const numSigs = encodeCompactU16(signatures.length);
|
|
167
|
+
const wire = concatBytes(numSigs, ...signatures, messageBytes);
|
|
168
|
+
return base58encode(wire);
|
|
169
|
+
}
|
|
4
170
|
/**
|
|
5
171
|
* Solana sweep strategy.
|
|
6
172
|
*
|
|
@@ -126,26 +292,80 @@ export class SolanaSweeper {
|
|
|
126
292
|
return results;
|
|
127
293
|
}
|
|
128
294
|
/**
|
|
129
|
-
* Submit a native SOL transfer.
|
|
295
|
+
* Submit a native SOL transfer via SystemProgram.transfer.
|
|
130
296
|
*
|
|
131
|
-
* Builds
|
|
132
|
-
* and submits via sendTransaction.
|
|
297
|
+
* Builds the instruction manually, signs with Ed25519, and submits via sendTransaction.
|
|
133
298
|
*/
|
|
134
299
|
async submitSolTransfer(key, treasury, lamports) {
|
|
135
|
-
// Get recent blockhash
|
|
136
300
|
const blockhashResult = (await this.rpc("getLatestBlockhash", [{ commitment: "finalized" }]));
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
301
|
+
const fromPubkey = base58decode(key.address);
|
|
302
|
+
const toPubkey = base58decode(treasury);
|
|
303
|
+
const systemProgramId = base58decode(SYSTEM_PROGRAM_ID);
|
|
304
|
+
// SystemProgram.Transfer instruction: index 2, followed by u64 lamports
|
|
305
|
+
const ixData = concatBytes(writeU32LE(2), writeU64LE(lamports));
|
|
306
|
+
const message = buildTransactionMessage(blockhashResult.value.blockhash, fromPubkey, [
|
|
307
|
+
{
|
|
308
|
+
programId: systemProgramId,
|
|
309
|
+
accounts: [
|
|
310
|
+
{ pubkey: fromPubkey, isSigner: true, isWritable: true },
|
|
311
|
+
{ pubkey: toPubkey, isSigner: false, isWritable: true },
|
|
312
|
+
],
|
|
313
|
+
data: ixData,
|
|
314
|
+
},
|
|
315
|
+
]);
|
|
316
|
+
// Ed25519 signing requires the 64-byte secret key (32-byte seed + 32-byte pubkey)
|
|
317
|
+
const secretKey = concatBytes(key.privateKey, fromPubkey);
|
|
318
|
+
const serialized = signAndSerialize(message, [secretKey]);
|
|
319
|
+
const result = (await this.rpc("sendTransaction", [serialized, { encoding: "base58" }]));
|
|
320
|
+
return result;
|
|
140
321
|
}
|
|
141
322
|
/**
|
|
142
323
|
* Submit an SPL token transfer.
|
|
143
324
|
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
325
|
+
* Finds or derives the associated token accounts for sender and receiver,
|
|
326
|
+
* then builds a TokenProgram.Transfer instruction.
|
|
146
327
|
*/
|
|
147
328
|
async submitSplTransfer(key, treasury, mint, amount) {
|
|
148
|
-
|
|
329
|
+
const blockhashResult = (await this.rpc("getLatestBlockhash", [{ commitment: "finalized" }]));
|
|
330
|
+
const fromPubkey = base58decode(key.address);
|
|
331
|
+
const tokenProgramId = base58decode(TOKEN_PROGRAM_ID);
|
|
332
|
+
// Find sender's token account for this mint
|
|
333
|
+
const senderAccounts = (await this.rpc("getTokenAccountsByOwner", [
|
|
334
|
+
key.address,
|
|
335
|
+
{ mint },
|
|
336
|
+
{ encoding: "jsonParsed" },
|
|
337
|
+
]));
|
|
338
|
+
if (senderAccounts.value.length === 0) {
|
|
339
|
+
throw new Error(`No token account found for ${key.address} mint ${mint}`);
|
|
340
|
+
}
|
|
341
|
+
const senderTokenAccount = base58decode(senderAccounts.value[0].pubkey);
|
|
342
|
+
// Find receiver's token account for this mint
|
|
343
|
+
const receiverAccounts = (await this.rpc("getTokenAccountsByOwner", [
|
|
344
|
+
treasury,
|
|
345
|
+
{ mint },
|
|
346
|
+
{ encoding: "jsonParsed" },
|
|
347
|
+
]));
|
|
348
|
+
if (receiverAccounts.value.length === 0) {
|
|
349
|
+
throw new Error(`No token account found for treasury ${treasury} mint ${mint} — create ATA first`);
|
|
350
|
+
}
|
|
351
|
+
const receiverTokenAccount = base58decode(receiverAccounts.value[0].pubkey);
|
|
352
|
+
// SPL Token Transfer instruction: index 3, followed by u64 amount
|
|
353
|
+
const ixData = concatBytes(new Uint8Array([3]), writeU64LE(amount));
|
|
354
|
+
const message = buildTransactionMessage(blockhashResult.value.blockhash, fromPubkey, [
|
|
355
|
+
{
|
|
356
|
+
programId: tokenProgramId,
|
|
357
|
+
accounts: [
|
|
358
|
+
{ pubkey: senderTokenAccount, isSigner: false, isWritable: true },
|
|
359
|
+
{ pubkey: receiverTokenAccount, isSigner: false, isWritable: true },
|
|
360
|
+
{ pubkey: fromPubkey, isSigner: true, isWritable: false },
|
|
361
|
+
],
|
|
362
|
+
data: ixData,
|
|
363
|
+
},
|
|
364
|
+
]);
|
|
365
|
+
const secretKey = concatBytes(key.privateKey, fromPubkey);
|
|
366
|
+
const serialized = signAndSerialize(message, [secretKey]);
|
|
367
|
+
const result = (await this.rpc("sendTransaction", [serialized, { encoding: "base58" }]));
|
|
368
|
+
return result;
|
|
149
369
|
}
|
|
150
370
|
}
|
|
151
371
|
//# sourceMappingURL=sweeper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweeper.js","sourceRoot":"","sources":["../../src/solana/sweeper.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sweeper.js","sourceRoot":"","sources":["../../src/solana/sweeper.ts"],"names":[],"mappings":"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"}
|
package/dist/sweep/index.js
CHANGED
|
@@ -24,6 +24,7 @@ import { HDKey } from "@scure/bip32";
|
|
|
24
24
|
import * as bip39 from "@scure/bip39";
|
|
25
25
|
import { wordlist } from "@scure/bip39/wordlists/english.js";
|
|
26
26
|
import { privateKeyToAccount } from "viem/accounts";
|
|
27
|
+
import { SolanaSweeper } from "../solana/sweeper.js";
|
|
27
28
|
import { sha256 } from "../tron/sha256.js";
|
|
28
29
|
import { EvmSweeper } from "./evm-sweeper.js";
|
|
29
30
|
import { TronSweeper } from "./tron-sweeper.js";
|
|
@@ -33,6 +34,7 @@ const CRYPTO_SERVICE_URL = process.env.CRYPTO_SERVICE_URL;
|
|
|
33
34
|
const CRYPTO_SERVICE_KEY = process.env.CRYPTO_SERVICE_KEY;
|
|
34
35
|
const DRY_RUN = process.env.SWEEP_DRY_RUN !== "false";
|
|
35
36
|
const MAX_INDEX = Number(process.env.MAX_ADDRESSES ?? "200");
|
|
37
|
+
const SUBCOMMAND = process.argv[2]; // "sweep" (default) or "pool-replenish"
|
|
36
38
|
// Coin type to BIP-44 path and chain family
|
|
37
39
|
const COIN_TYPE_FAMILIES = {
|
|
38
40
|
0: "utxo", // BTC
|
|
@@ -150,14 +152,14 @@ async function main() {
|
|
|
150
152
|
console.error("Invalid mnemonic");
|
|
151
153
|
process.exit(1);
|
|
152
154
|
}
|
|
153
|
-
// Fetch
|
|
154
|
-
console.log(`Fetching chains from ${CRYPTO_SERVICE_URL}/chains...`);
|
|
155
|
+
// Fetch full payment method records from admin endpoint (includes rpc_url, coin_type, etc.)
|
|
156
|
+
console.log(`Fetching chains from ${CRYPTO_SERVICE_URL}/admin/chains...`);
|
|
155
157
|
const headers = {
|
|
156
158
|
"Content-Type": "application/json",
|
|
157
159
|
};
|
|
158
160
|
if (CRYPTO_SERVICE_KEY)
|
|
159
161
|
headers.Authorization = `Bearer ${CRYPTO_SERVICE_KEY}`;
|
|
160
|
-
const res = await fetch(`${CRYPTO_SERVICE_URL}/chains`, { headers });
|
|
162
|
+
const res = await fetch(`${CRYPTO_SERVICE_URL}/admin/chains`, { headers });
|
|
161
163
|
if (!res.ok)
|
|
162
164
|
throw new Error(`Chain server returned ${res.status}`);
|
|
163
165
|
const methods = await res.json();
|
|
@@ -261,6 +263,45 @@ async function main() {
|
|
|
261
263
|
allResults.push(...results);
|
|
262
264
|
continue;
|
|
263
265
|
}
|
|
266
|
+
if (family === "solana") {
|
|
267
|
+
// Solana uses Ed25519 — pre-derived pool keys come from the chain server
|
|
268
|
+
const rpcUrl = group[0]?.rpc_url;
|
|
269
|
+
if (!rpcUrl) {
|
|
270
|
+
console.log(" Skipping solana -- no rpc_url in chain config");
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
// For Solana, fetch pre-derived pool addresses from the chain server
|
|
274
|
+
console.log(`\n--- Solana (${group.length} tokens) ---`);
|
|
275
|
+
console.log(" Note: Solana uses Ed25519 pre-derived keys -- sweep requires pool keys from chain server");
|
|
276
|
+
for (const method of group) {
|
|
277
|
+
const sweeper = new SolanaSweeper({
|
|
278
|
+
rpcUrl,
|
|
279
|
+
rpcHeaders: method.rpc_headers ?? {},
|
|
280
|
+
chain: method.chain,
|
|
281
|
+
token: method.token,
|
|
282
|
+
decimals: method.decimals,
|
|
283
|
+
contractAddress: method.contractAddress ?? undefined,
|
|
284
|
+
});
|
|
285
|
+
// For Solana, we can't derive keys from the secp256k1 master — skip if no pool keys.
|
|
286
|
+
// In production, pool keys would be fetched from the chain server's admin API.
|
|
287
|
+
console.log(` ${method.token}: scan-only (pool key sweep requires admin/pool/export endpoint)`);
|
|
288
|
+
try {
|
|
289
|
+
const deposits = await sweeper.scan([], treasury.address);
|
|
290
|
+
if (deposits.length > 0) {
|
|
291
|
+
for (const d of deposits) {
|
|
292
|
+
console.log(` [${d.index}] ${d.address}: ${d.nativeBalance} lamports`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
console.log(" No deposits found");
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
console.log(` Scan error: ${err.message}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
264
305
|
console.log(` Skipping ${family} -- no sweeper implemented`);
|
|
265
306
|
}
|
|
266
307
|
// Summary
|
|
@@ -283,8 +324,53 @@ async function main() {
|
|
|
283
324
|
}
|
|
284
325
|
console.log("\nDone.");
|
|
285
326
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
327
|
+
// --- Pool replenish subcommand ---
|
|
328
|
+
async function poolReplenish() {
|
|
329
|
+
if (!CRYPTO_SERVICE_URL) {
|
|
330
|
+
console.error("CRYPTO_SERVICE_URL is required");
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
const count = Number(process.env.POOL_COUNT ?? "100");
|
|
334
|
+
const chain = process.env.POOL_CHAIN;
|
|
335
|
+
if (!chain) {
|
|
336
|
+
console.error("POOL_CHAIN is required (e.g. 'solana')");
|
|
337
|
+
process.exit(1);
|
|
338
|
+
}
|
|
339
|
+
console.log(`Replenishing ${count} addresses for chain "${chain}"...`);
|
|
340
|
+
const headers = { "Content-Type": "application/json" };
|
|
341
|
+
if (CRYPTO_SERVICE_KEY)
|
|
342
|
+
headers.Authorization = `Bearer ${CRYPTO_SERVICE_KEY}`;
|
|
343
|
+
const res = await fetch(`${CRYPTO_SERVICE_URL}/admin/pool/replenish`, {
|
|
344
|
+
method: "POST",
|
|
345
|
+
headers,
|
|
346
|
+
body: JSON.stringify({ chain, count }),
|
|
347
|
+
});
|
|
348
|
+
if (!res.ok) {
|
|
349
|
+
const body = await res.text();
|
|
350
|
+
console.error(`Pool replenish failed: ${res.status} ${body}`);
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
const result = (await res.json());
|
|
354
|
+
console.log(`Added ${result.added} addresses (total pool: ${result.total})`);
|
|
355
|
+
// Check pool status
|
|
356
|
+
const statusRes = await fetch(`${CRYPTO_SERVICE_URL}/admin/pool/status?chain=${chain}`, { headers });
|
|
357
|
+
if (statusRes.ok) {
|
|
358
|
+
const status = (await statusRes.json());
|
|
359
|
+
console.log(`Pool status: ${status.available} available, ${status.claimed} claimed, ${status.total} total`);
|
|
360
|
+
}
|
|
361
|
+
console.log("Done.");
|
|
362
|
+
}
|
|
363
|
+
// --- Entry point ---
|
|
364
|
+
if (SUBCOMMAND === "pool-replenish") {
|
|
365
|
+
poolReplenish().catch((err) => {
|
|
366
|
+
console.error(err);
|
|
367
|
+
process.exit(1);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
main().catch((err) => {
|
|
372
|
+
console.error(err);
|
|
373
|
+
process.exit(1);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
290
376
|
//# sourceMappingURL=index.js.map
|
package/dist/sweep/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sweep/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,iBAAiB;AAEjB,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC1D,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,OAAO,CAAC;AACtD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC;AAmB7D,4CAA4C;AAC5C,MAAM,kBAAkB,GAA2B;IAClD,CAAC,EAAE,MAAM,EAAE,MAAM;IACjB,CAAC,EAAE,MAAM,EAAE,MAAM;IACjB,CAAC,EAAE,MAAM,EAAE,OAAO;IAClB,EAAE,EAAE,KAAK,EAAE,mBAAmB;IAC9B,GAAG,EAAE,MAAM,EAAE,MAAM;IACnB,GAAG,EAAE,QAAQ,EAAE,MAAM;CACrB,CAAC;AAEF,6BAA6B;AAE7B,4BAA4B;AAC5B,MAAM,eAAe,GAAG,4DAA4D,CAAC;AAErF,SAAS,YAAY,CAAC,IAAgB;IACrC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,IAAI;QAAE,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO,GAAG,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;QACvD,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM;QACtB,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,oDAAoD;AACpD,MAAM,eAAe,GACpB,SAKA,CAAC,eAAe,CAAC;AAElB,SAAS,KAAK,CAAC,IAAgB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB;IAC9C,MAAM,YAAY,GAAe,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,cAAc,CACtB,MAAa,EACb,QAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,UAAkB;IAElB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAc,EAAE,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,SAAS;QAEpD,IAAI,OAAe,CAAC;QACpB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAmB,CAAC;YAChE,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;QAChD,CAAC;aAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACP,wDAAwD;YACxD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO;YACP,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAa,EAAE,QAAgB,EAAE,MAAc;IAC7E,yCAAyC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;IAEnH,IAAI,OAAe,CAAC;IACpB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAmB,CAAC;QAChE,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;IAChD,CAAC;SAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACP,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACN,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO;QACP,KAAK,EAAE,CAAC;KACR,CAAC;AACH,CAAC;AAED,eAAe;AAEf,KAAK,UAAU,IAAI;IAClB,wBAAwB;IACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAEhE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,kDAAkD;IAClD,OAAO,CAAC,GAAG,CAAC,wBAAwB,kBAAkB,YAAY,CAAC,CAAC;IACpE,MAAM,OAAO,GAA2B;QACvC,cAAc,EAAE,kBAAkB;KAClC,CAAC;IACF,IAAI,kBAAkB;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,kBAAkB,EAAE,CAAC;IAE/E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,kBAAkB,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpE,MAAM,OAAO,GAAkB,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAEzD,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC;QAC7B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC;YAChE,SAAS;QACV,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,uBAAuB;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,IAAI,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAkB,EAAE,CAAC;IAErC,+BAA+B;IAC/B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,wBAAwB,CAAC,CAAC;YACpE,SAAS;QACV,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,QAAQ,KAAK,MAAM,gBAAgB,UAAU,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAElH,4CAA4C;QAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,yBAAyB,CAAC,CAAC;QAE5D,6EAA6E;QAC7E,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE3C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,SAAS;QACV,CAAC;QAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACtB,0DAA0D;YAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;YAED,KAAK,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,CAAC;gBACjD,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;gBACxC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACb,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,gCAAgC,CAAC,CAAC;oBACrE,SAAS;gBACV,CAAC;gBAED,MAAM,MAAM,GAAe,YAAY;qBACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;qBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACZ,IAAI,EAAE,CAAC,CAAC,KAAK;oBACb,OAAO,EAAE,CAAC,CAAC,eAAgC;oBAC3C,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACpB,CAAC,CAAC,CAAC;gBAEL,OAAO,CAAC,GAAG,CAAC,SAAS,SAAS,KAAK,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;gBACvE,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;oBAC9B,MAAM;oBACN,SAAS;oBACT,MAAM;iBACN,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACxE,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YAC7B,CAAC;YACD,SAAS;QACV,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;gBAC7D,SAAS;YACV,CAAC;YAED,MAAM,MAAM,GAAgB,KAAK;iBAC/B,MAAM,CAAC,CAAC,CAAC,EAAkD,EAAE,CAAC,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC;iBACxF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACZ,IAAI,EAAE,CAAC,CAAC,KAAK;gBACb,eAAe,EAAE,CAAC,CAAC,eAAe;gBAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACpB,CAAC,CAAC,CAAC;YAEL,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;gBAC/B,MAAM;gBACN,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,kBAAkB,CAAC;gBACnD,MAAM;aACN,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxE,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YAC5B,SAAS;QACV,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,4BAA4B,CAAC,CAAC;IAC/D,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAEjC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAChC,CAAC;IACF,CAAC;SAAM,CAAC;QACP,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACxB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sweep/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/solana/sweeper.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ed25519 } from "@noble/curves/ed25519.js";
|
|
1
2
|
import type {
|
|
2
3
|
DepositInfo,
|
|
3
4
|
ISweepStrategy,
|
|
@@ -11,6 +12,195 @@ import { createSolanaRpcCaller } from "./watcher.js";
|
|
|
11
12
|
/** Transaction fee estimate (in lamports). */
|
|
12
13
|
const TX_FEE = 5_000n;
|
|
13
14
|
|
|
15
|
+
/** SPL Token program ID. */
|
|
16
|
+
const TOKEN_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
17
|
+
|
|
18
|
+
/** System program ID. */
|
|
19
|
+
const SYSTEM_PROGRAM_ID = "11111111111111111111111111111111";
|
|
20
|
+
|
|
21
|
+
// --- Base58 for Solana ---
|
|
22
|
+
|
|
23
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
24
|
+
|
|
25
|
+
function base58decode(str: string): Uint8Array {
|
|
26
|
+
let num = 0n;
|
|
27
|
+
for (const ch of str) {
|
|
28
|
+
const idx = BASE58_ALPHABET.indexOf(ch);
|
|
29
|
+
if (idx < 0) throw new Error(`Invalid Base58 char: ${ch}`);
|
|
30
|
+
num = num * 58n + BigInt(idx);
|
|
31
|
+
}
|
|
32
|
+
const bytes: number[] = [];
|
|
33
|
+
while (num > 0n) {
|
|
34
|
+
bytes.unshift(Number(num % 256n));
|
|
35
|
+
num = num / 256n;
|
|
36
|
+
}
|
|
37
|
+
let leadingZeros = 0;
|
|
38
|
+
for (const ch of str) {
|
|
39
|
+
if (ch !== "1") break;
|
|
40
|
+
leadingZeros++;
|
|
41
|
+
}
|
|
42
|
+
return new Uint8Array([...new Array(leadingZeros).fill(0), ...bytes]);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function base58encode(data: Uint8Array): string {
|
|
46
|
+
let num = 0n;
|
|
47
|
+
for (const byte of data) num = num * 256n + BigInt(byte);
|
|
48
|
+
let encoded = "";
|
|
49
|
+
while (num > 0n) {
|
|
50
|
+
encoded = BASE58_ALPHABET[Number(num % 58n)] + encoded;
|
|
51
|
+
num = num / 58n;
|
|
52
|
+
}
|
|
53
|
+
for (const byte of data) {
|
|
54
|
+
if (byte !== 0) break;
|
|
55
|
+
encoded = `1${encoded}`;
|
|
56
|
+
}
|
|
57
|
+
return encoded || "1";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// --- Solana transaction helpers ---
|
|
61
|
+
|
|
62
|
+
/** Compact-u16 encoding used by Solana for array lengths. */
|
|
63
|
+
function encodeCompactU16(value: number): Uint8Array {
|
|
64
|
+
if (value < 0x80) return new Uint8Array([value]);
|
|
65
|
+
if (value < 0x4000) return new Uint8Array([(value & 0x7f) | 0x80, value >> 7]);
|
|
66
|
+
return new Uint8Array([(value & 0x7f) | 0x80, ((value >> 7) & 0x7f) | 0x80, value >> 14]);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Write a u32 as little-endian bytes. */
|
|
70
|
+
function writeU32LE(value: number): Uint8Array {
|
|
71
|
+
const buf = new Uint8Array(4);
|
|
72
|
+
buf[0] = value & 0xff;
|
|
73
|
+
buf[1] = (value >> 8) & 0xff;
|
|
74
|
+
buf[2] = (value >> 16) & 0xff;
|
|
75
|
+
buf[3] = (value >> 24) & 0xff;
|
|
76
|
+
return buf;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Write a u64 as little-endian bytes. */
|
|
80
|
+
function writeU64LE(value: bigint): Uint8Array {
|
|
81
|
+
const buf = new Uint8Array(8);
|
|
82
|
+
for (let i = 0; i < 8; i++) {
|
|
83
|
+
buf[i] = Number(value & 0xffn);
|
|
84
|
+
value = value >> 8n;
|
|
85
|
+
}
|
|
86
|
+
return buf;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Concatenate multiple Uint8Arrays. */
|
|
90
|
+
function concatBytes(...arrays: Uint8Array[]): Uint8Array {
|
|
91
|
+
const total = arrays.reduce((sum, a) => sum + a.length, 0);
|
|
92
|
+
const result = new Uint8Array(total);
|
|
93
|
+
let offset = 0;
|
|
94
|
+
for (const a of arrays) {
|
|
95
|
+
result.set(a, offset);
|
|
96
|
+
offset += a.length;
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Build a Solana transaction message (v0 legacy format).
|
|
103
|
+
* Returns the serialized message bytes for signing.
|
|
104
|
+
*/
|
|
105
|
+
function buildTransactionMessage(
|
|
106
|
+
recentBlockhash: string,
|
|
107
|
+
feePayer: Uint8Array,
|
|
108
|
+
instructions: Array<{
|
|
109
|
+
programId: Uint8Array;
|
|
110
|
+
accounts: Array<{ pubkey: Uint8Array; isSigner: boolean; isWritable: boolean }>;
|
|
111
|
+
data: Uint8Array;
|
|
112
|
+
}>,
|
|
113
|
+
): Uint8Array {
|
|
114
|
+
// Collect all unique accounts
|
|
115
|
+
const accountMap = new Map<string, { pubkey: Uint8Array; isSigner: boolean; isWritable: boolean }>();
|
|
116
|
+
const feePayerKey = base58encode(feePayer);
|
|
117
|
+
accountMap.set(feePayerKey, { pubkey: feePayer, isSigner: true, isWritable: true });
|
|
118
|
+
|
|
119
|
+
for (const ix of instructions) {
|
|
120
|
+
const progKey = base58encode(ix.programId);
|
|
121
|
+
if (!accountMap.has(progKey)) {
|
|
122
|
+
accountMap.set(progKey, { pubkey: ix.programId, isSigner: false, isWritable: false });
|
|
123
|
+
}
|
|
124
|
+
for (const acc of ix.accounts) {
|
|
125
|
+
const key = base58encode(acc.pubkey);
|
|
126
|
+
const existing = accountMap.get(key);
|
|
127
|
+
if (existing) {
|
|
128
|
+
existing.isSigner = existing.isSigner || acc.isSigner;
|
|
129
|
+
existing.isWritable = existing.isWritable || acc.isWritable;
|
|
130
|
+
} else {
|
|
131
|
+
accountMap.set(key, { ...acc });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Sort: signers+writable first, then signers+readonly, then non-signers+writable, then non-signers+readonly
|
|
137
|
+
// Fee payer is always first
|
|
138
|
+
const accounts = [...accountMap.values()];
|
|
139
|
+
accounts.sort((a, b) => {
|
|
140
|
+
const aKey = base58encode(a.pubkey);
|
|
141
|
+
const bKey = base58encode(b.pubkey);
|
|
142
|
+
if (aKey === feePayerKey) return -1;
|
|
143
|
+
if (bKey === feePayerKey) return 1;
|
|
144
|
+
if (a.isSigner !== b.isSigner) return a.isSigner ? -1 : 1;
|
|
145
|
+
if (a.isWritable !== b.isWritable) return a.isWritable ? -1 : 1;
|
|
146
|
+
return 0;
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const numRequiredSignatures = accounts.filter((a) => a.isSigner).length;
|
|
150
|
+
const numReadonlySignedAccounts = accounts.filter((a) => a.isSigner && !a.isWritable).length;
|
|
151
|
+
const numReadonlyUnsignedAccounts = accounts.filter((a) => !a.isSigner && !a.isWritable).length;
|
|
152
|
+
|
|
153
|
+
const accountKeyIndex = new Map<string, number>();
|
|
154
|
+
for (let i = 0; i < accounts.length; i++) {
|
|
155
|
+
accountKeyIndex.set(base58encode(accounts[i].pubkey), i);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Serialize message
|
|
159
|
+
const header = new Uint8Array([numRequiredSignatures, numReadonlySignedAccounts, numReadonlyUnsignedAccounts]);
|
|
160
|
+
const accountKeysLen = encodeCompactU16(accounts.length);
|
|
161
|
+
const accountKeysData = concatBytes(...accounts.map((a) => a.pubkey));
|
|
162
|
+
const blockhashBytes = base58decode(recentBlockhash);
|
|
163
|
+
const instructionsLen = encodeCompactU16(instructions.length);
|
|
164
|
+
|
|
165
|
+
const ixData: Uint8Array[] = [];
|
|
166
|
+
for (const ix of instructions) {
|
|
167
|
+
const progIdx = accountKeyIndex.get(base58encode(ix.programId));
|
|
168
|
+
if (progIdx === undefined) throw new Error("Program ID not in account list");
|
|
169
|
+
const accountIdxs = ix.accounts.map((a) => {
|
|
170
|
+
const idx = accountKeyIndex.get(base58encode(a.pubkey));
|
|
171
|
+
if (idx === undefined) throw new Error("Account not in account list");
|
|
172
|
+
return idx;
|
|
173
|
+
});
|
|
174
|
+
ixData.push(
|
|
175
|
+
concatBytes(
|
|
176
|
+
new Uint8Array([progIdx]),
|
|
177
|
+
encodeCompactU16(accountIdxs.length),
|
|
178
|
+
new Uint8Array(accountIdxs),
|
|
179
|
+
encodeCompactU16(ix.data.length),
|
|
180
|
+
ix.data,
|
|
181
|
+
),
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return concatBytes(header, accountKeysLen, accountKeysData, blockhashBytes, instructionsLen, ...ixData);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Sign and serialize a full Solana transaction (legacy format).
|
|
190
|
+
* Returns base58-encoded wire format ready for sendTransaction.
|
|
191
|
+
*/
|
|
192
|
+
function signAndSerialize(messageBytes: Uint8Array, signers: Uint8Array[]): string {
|
|
193
|
+
const signatures: Uint8Array[] = [];
|
|
194
|
+
for (const secretKey of signers) {
|
|
195
|
+
const sig = ed25519.sign(messageBytes, secretKey.slice(0, 32));
|
|
196
|
+
signatures.push(sig);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const numSigs = encodeCompactU16(signatures.length);
|
|
200
|
+
const wire = concatBytes(numSigs, ...signatures, messageBytes);
|
|
201
|
+
return base58encode(wire);
|
|
202
|
+
}
|
|
203
|
+
|
|
14
204
|
/**
|
|
15
205
|
* Solana sweep strategy.
|
|
16
206
|
*
|
|
@@ -164,33 +354,98 @@ export class SolanaSweeper implements ISweepStrategy {
|
|
|
164
354
|
}
|
|
165
355
|
|
|
166
356
|
/**
|
|
167
|
-
* Submit a native SOL transfer.
|
|
357
|
+
* Submit a native SOL transfer via SystemProgram.transfer.
|
|
168
358
|
*
|
|
169
|
-
* Builds
|
|
170
|
-
* and submits via sendTransaction.
|
|
359
|
+
* Builds the instruction manually, signs with Ed25519, and submits via sendTransaction.
|
|
171
360
|
*/
|
|
172
361
|
private async submitSolTransfer(key: KeyPair, treasury: string, lamports: bigint): Promise<string> {
|
|
173
|
-
// Get recent blockhash
|
|
174
362
|
const blockhashResult = (await this.rpc("getLatestBlockhash", [{ commitment: "finalized" }])) as {
|
|
175
363
|
value: { blockhash: string; lastValidBlockHeight: number };
|
|
176
364
|
};
|
|
177
365
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
366
|
+
const fromPubkey = base58decode(key.address);
|
|
367
|
+
const toPubkey = base58decode(treasury);
|
|
368
|
+
const systemProgramId = base58decode(SYSTEM_PROGRAM_ID);
|
|
369
|
+
|
|
370
|
+
// SystemProgram.Transfer instruction: index 2, followed by u64 lamports
|
|
371
|
+
const ixData = concatBytes(writeU32LE(2), writeU64LE(lamports));
|
|
372
|
+
|
|
373
|
+
const message = buildTransactionMessage(blockhashResult.value.blockhash, fromPubkey, [
|
|
374
|
+
{
|
|
375
|
+
programId: systemProgramId,
|
|
376
|
+
accounts: [
|
|
377
|
+
{ pubkey: fromPubkey, isSigner: true, isWritable: true },
|
|
378
|
+
{ pubkey: toPubkey, isSigner: false, isWritable: true },
|
|
379
|
+
],
|
|
380
|
+
data: ixData,
|
|
381
|
+
},
|
|
382
|
+
]);
|
|
383
|
+
|
|
384
|
+
// Ed25519 signing requires the 64-byte secret key (32-byte seed + 32-byte pubkey)
|
|
385
|
+
const secretKey = concatBytes(key.privateKey, fromPubkey);
|
|
386
|
+
const serialized = signAndSerialize(message, [secretKey]);
|
|
387
|
+
|
|
388
|
+
const result = (await this.rpc("sendTransaction", [serialized, { encoding: "base58" }])) as string;
|
|
389
|
+
return result;
|
|
183
390
|
}
|
|
184
391
|
|
|
185
392
|
/**
|
|
186
393
|
* Submit an SPL token transfer.
|
|
187
394
|
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
395
|
+
* Finds or derives the associated token accounts for sender and receiver,
|
|
396
|
+
* then builds a TokenProgram.Transfer instruction.
|
|
190
397
|
*/
|
|
191
398
|
private async submitSplTransfer(key: KeyPair, treasury: string, mint: string, amount: bigint): Promise<string> {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
399
|
+
const blockhashResult = (await this.rpc("getLatestBlockhash", [{ commitment: "finalized" }])) as {
|
|
400
|
+
value: { blockhash: string; lastValidBlockHeight: number };
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
const fromPubkey = base58decode(key.address);
|
|
404
|
+
const tokenProgramId = base58decode(TOKEN_PROGRAM_ID);
|
|
405
|
+
|
|
406
|
+
// Find sender's token account for this mint
|
|
407
|
+
const senderAccounts = (await this.rpc("getTokenAccountsByOwner", [
|
|
408
|
+
key.address,
|
|
409
|
+
{ mint },
|
|
410
|
+
{ encoding: "jsonParsed" },
|
|
411
|
+
])) as { value: Array<{ pubkey: string }> };
|
|
412
|
+
|
|
413
|
+
if (senderAccounts.value.length === 0) {
|
|
414
|
+
throw new Error(`No token account found for ${key.address} mint ${mint}`);
|
|
415
|
+
}
|
|
416
|
+
const senderTokenAccount = base58decode(senderAccounts.value[0].pubkey);
|
|
417
|
+
|
|
418
|
+
// Find receiver's token account for this mint
|
|
419
|
+
const receiverAccounts = (await this.rpc("getTokenAccountsByOwner", [
|
|
420
|
+
treasury,
|
|
421
|
+
{ mint },
|
|
422
|
+
{ encoding: "jsonParsed" },
|
|
423
|
+
])) as { value: Array<{ pubkey: string }> };
|
|
424
|
+
|
|
425
|
+
if (receiverAccounts.value.length === 0) {
|
|
426
|
+
throw new Error(`No token account found for treasury ${treasury} mint ${mint} — create ATA first`);
|
|
427
|
+
}
|
|
428
|
+
const receiverTokenAccount = base58decode(receiverAccounts.value[0].pubkey);
|
|
429
|
+
|
|
430
|
+
// SPL Token Transfer instruction: index 3, followed by u64 amount
|
|
431
|
+
const ixData = concatBytes(new Uint8Array([3]), writeU64LE(amount));
|
|
432
|
+
|
|
433
|
+
const message = buildTransactionMessage(blockhashResult.value.blockhash, fromPubkey, [
|
|
434
|
+
{
|
|
435
|
+
programId: tokenProgramId,
|
|
436
|
+
accounts: [
|
|
437
|
+
{ pubkey: senderTokenAccount, isSigner: false, isWritable: true },
|
|
438
|
+
{ pubkey: receiverTokenAccount, isSigner: false, isWritable: true },
|
|
439
|
+
{ pubkey: fromPubkey, isSigner: true, isWritable: false },
|
|
440
|
+
],
|
|
441
|
+
data: ixData,
|
|
442
|
+
},
|
|
443
|
+
]);
|
|
444
|
+
|
|
445
|
+
const secretKey = concatBytes(key.privateKey, fromPubkey);
|
|
446
|
+
const serialized = signAndSerialize(message, [secretKey]);
|
|
447
|
+
|
|
448
|
+
const result = (await this.rpc("sendTransaction", [serialized, { encoding: "base58" }])) as string;
|
|
449
|
+
return result;
|
|
195
450
|
}
|
|
196
451
|
}
|
package/src/sweep/index.ts
CHANGED
|
@@ -27,6 +27,7 @@ import * as bip39 from "@scure/bip39";
|
|
|
27
27
|
import { wordlist } from "@scure/bip39/wordlists/english.js";
|
|
28
28
|
import type { KeyPair, SweepResult } from "@wopr-network/platform-crypto-server/plugin";
|
|
29
29
|
import { privateKeyToAccount } from "viem/accounts";
|
|
30
|
+
import { SolanaSweeper } from "../solana/sweeper.js";
|
|
30
31
|
import { sha256 } from "../tron/sha256.js";
|
|
31
32
|
import { EvmSweeper, type EvmToken } from "./evm-sweeper.js";
|
|
32
33
|
import { TronSweeper, type TronToken } from "./tron-sweeper.js";
|
|
@@ -38,6 +39,7 @@ const CRYPTO_SERVICE_URL = process.env.CRYPTO_SERVICE_URL;
|
|
|
38
39
|
const CRYPTO_SERVICE_KEY = process.env.CRYPTO_SERVICE_KEY;
|
|
39
40
|
const DRY_RUN = process.env.SWEEP_DRY_RUN !== "false";
|
|
40
41
|
const MAX_INDEX = Number(process.env.MAX_ADDRESSES ?? "200");
|
|
42
|
+
const SUBCOMMAND = process.argv[2]; // "sweep" (default) or "pool-replenish"
|
|
41
43
|
|
|
42
44
|
// --- Chain server types ---
|
|
43
45
|
|
|
@@ -196,14 +198,14 @@ async function main() {
|
|
|
196
198
|
process.exit(1);
|
|
197
199
|
}
|
|
198
200
|
|
|
199
|
-
// Fetch
|
|
200
|
-
console.log(`Fetching chains from ${CRYPTO_SERVICE_URL}/chains...`);
|
|
201
|
+
// Fetch full payment method records from admin endpoint (includes rpc_url, coin_type, etc.)
|
|
202
|
+
console.log(`Fetching chains from ${CRYPTO_SERVICE_URL}/admin/chains...`);
|
|
201
203
|
const headers: Record<string, string> = {
|
|
202
204
|
"Content-Type": "application/json",
|
|
203
205
|
};
|
|
204
206
|
if (CRYPTO_SERVICE_KEY) headers.Authorization = `Bearer ${CRYPTO_SERVICE_KEY}`;
|
|
205
207
|
|
|
206
|
-
const res = await fetch(`${CRYPTO_SERVICE_URL}/chains`, { headers });
|
|
208
|
+
const res = await fetch(`${CRYPTO_SERVICE_URL}/admin/chains`, { headers });
|
|
207
209
|
if (!res.ok) throw new Error(`Chain server returned ${res.status}`);
|
|
208
210
|
|
|
209
211
|
const methods: ChainMethod[] = await res.json();
|
|
@@ -323,6 +325,47 @@ async function main() {
|
|
|
323
325
|
continue;
|
|
324
326
|
}
|
|
325
327
|
|
|
328
|
+
if (family === "solana") {
|
|
329
|
+
// Solana uses Ed25519 — pre-derived pool keys come from the chain server
|
|
330
|
+
const rpcUrl = group[0]?.rpc_url;
|
|
331
|
+
if (!rpcUrl) {
|
|
332
|
+
console.log(" Skipping solana -- no rpc_url in chain config");
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// For Solana, fetch pre-derived pool addresses from the chain server
|
|
337
|
+
console.log(`\n--- Solana (${group.length} tokens) ---`);
|
|
338
|
+
console.log(" Note: Solana uses Ed25519 pre-derived keys -- sweep requires pool keys from chain server");
|
|
339
|
+
|
|
340
|
+
for (const method of group) {
|
|
341
|
+
const sweeper = new SolanaSweeper({
|
|
342
|
+
rpcUrl,
|
|
343
|
+
rpcHeaders: method.rpc_headers ?? {},
|
|
344
|
+
chain: method.chain,
|
|
345
|
+
token: method.token,
|
|
346
|
+
decimals: method.decimals,
|
|
347
|
+
contractAddress: method.contractAddress ?? undefined,
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// For Solana, we can't derive keys from the secp256k1 master — skip if no pool keys.
|
|
351
|
+
// In production, pool keys would be fetched from the chain server's admin API.
|
|
352
|
+
console.log(` ${method.token}: scan-only (pool key sweep requires admin/pool/export endpoint)`);
|
|
353
|
+
try {
|
|
354
|
+
const deposits = await sweeper.scan([], treasury.address);
|
|
355
|
+
if (deposits.length > 0) {
|
|
356
|
+
for (const d of deposits) {
|
|
357
|
+
console.log(` [${d.index}] ${d.address}: ${d.nativeBalance} lamports`);
|
|
358
|
+
}
|
|
359
|
+
} else {
|
|
360
|
+
console.log(" No deposits found");
|
|
361
|
+
}
|
|
362
|
+
} catch (err) {
|
|
363
|
+
console.log(` Scan error: ${(err as Error).message}`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
|
|
326
369
|
console.log(` Skipping ${family} -- no sweeper implemented`);
|
|
327
370
|
}
|
|
328
371
|
|
|
@@ -347,7 +390,62 @@ async function main() {
|
|
|
347
390
|
console.log("\nDone.");
|
|
348
391
|
}
|
|
349
392
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
393
|
+
// --- Pool replenish subcommand ---
|
|
394
|
+
|
|
395
|
+
async function poolReplenish() {
|
|
396
|
+
if (!CRYPTO_SERVICE_URL) {
|
|
397
|
+
console.error("CRYPTO_SERVICE_URL is required");
|
|
398
|
+
process.exit(1);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const count = Number(process.env.POOL_COUNT ?? "100");
|
|
402
|
+
const chain = process.env.POOL_CHAIN;
|
|
403
|
+
|
|
404
|
+
if (!chain) {
|
|
405
|
+
console.error("POOL_CHAIN is required (e.g. 'solana')");
|
|
406
|
+
process.exit(1);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
console.log(`Replenishing ${count} addresses for chain "${chain}"...`);
|
|
410
|
+
|
|
411
|
+
const headers: Record<string, string> = { "Content-Type": "application/json" };
|
|
412
|
+
if (CRYPTO_SERVICE_KEY) headers.Authorization = `Bearer ${CRYPTO_SERVICE_KEY}`;
|
|
413
|
+
|
|
414
|
+
const res = await fetch(`${CRYPTO_SERVICE_URL}/admin/pool/replenish`, {
|
|
415
|
+
method: "POST",
|
|
416
|
+
headers,
|
|
417
|
+
body: JSON.stringify({ chain, count }),
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
if (!res.ok) {
|
|
421
|
+
const body = await res.text();
|
|
422
|
+
console.error(`Pool replenish failed: ${res.status} ${body}`);
|
|
423
|
+
process.exit(1);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const result = (await res.json()) as { added: number; total: number };
|
|
427
|
+
console.log(`Added ${result.added} addresses (total pool: ${result.total})`);
|
|
428
|
+
|
|
429
|
+
// Check pool status
|
|
430
|
+
const statusRes = await fetch(`${CRYPTO_SERVICE_URL}/admin/pool/status?chain=${chain}`, { headers });
|
|
431
|
+
if (statusRes.ok) {
|
|
432
|
+
const status = (await statusRes.json()) as { available: number; claimed: number; total: number };
|
|
433
|
+
console.log(`Pool status: ${status.available} available, ${status.claimed} claimed, ${status.total} total`);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
console.log("Done.");
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// --- Entry point ---
|
|
440
|
+
|
|
441
|
+
if (SUBCOMMAND === "pool-replenish") {
|
|
442
|
+
poolReplenish().catch((err) => {
|
|
443
|
+
console.error(err);
|
|
444
|
+
process.exit(1);
|
|
445
|
+
});
|
|
446
|
+
} else {
|
|
447
|
+
main().catch((err) => {
|
|
448
|
+
console.error(err);
|
|
449
|
+
process.exit(1);
|
|
450
|
+
});
|
|
451
|
+
}
|