@wopr-network/crypto-plugins 1.0.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/.github/workflows/ci.yml +33 -0
- package/.github/workflows/publish.yml +12 -0
- package/biome.json +23 -0
- package/dist/__tests__/bitcoin-encoder.test.d.ts +2 -0
- package/dist/__tests__/bitcoin-encoder.test.d.ts.map +1 -0
- package/dist/__tests__/bitcoin-encoder.test.js +97 -0
- package/dist/__tests__/bitcoin-encoder.test.js.map +1 -0
- package/dist/__tests__/dogecoin-encoder.test.d.ts +2 -0
- package/dist/__tests__/dogecoin-encoder.test.d.ts.map +1 -0
- package/dist/__tests__/dogecoin-encoder.test.js +57 -0
- package/dist/__tests__/dogecoin-encoder.test.js.map +1 -0
- package/dist/__tests__/litecoin-encoder.test.d.ts +2 -0
- package/dist/__tests__/litecoin-encoder.test.d.ts.map +1 -0
- package/dist/__tests__/litecoin-encoder.test.js +44 -0
- package/dist/__tests__/litecoin-encoder.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +75 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/rpc.test.d.ts +2 -0
- package/dist/__tests__/rpc.test.d.ts.map +1 -0
- package/dist/__tests__/rpc.test.js +31 -0
- package/dist/__tests__/rpc.test.js.map +1 -0
- package/dist/__tests__/solana-encoder.test.d.ts +2 -0
- package/dist/__tests__/solana-encoder.test.d.ts.map +1 -0
- package/dist/__tests__/solana-encoder.test.js +85 -0
- package/dist/__tests__/solana-encoder.test.js.map +1 -0
- package/dist/__tests__/solana-watcher.test.d.ts +2 -0
- package/dist/__tests__/solana-watcher.test.d.ts.map +1 -0
- package/dist/__tests__/solana-watcher.test.js +281 -0
- package/dist/__tests__/solana-watcher.test.js.map +1 -0
- package/dist/__tests__/sweep-key-parity.test.d.ts +2 -0
- package/dist/__tests__/sweep-key-parity.test.d.ts.map +1 -0
- package/dist/__tests__/sweep-key-parity.test.js +236 -0
- package/dist/__tests__/sweep-key-parity.test.js.map +1 -0
- package/dist/__tests__/tron-encoder.test.d.ts +2 -0
- package/dist/__tests__/tron-encoder.test.d.ts.map +1 -0
- package/dist/__tests__/tron-encoder.test.js +93 -0
- package/dist/__tests__/tron-encoder.test.js.map +1 -0
- package/dist/__tests__/utxo-watcher.test.d.ts +2 -0
- package/dist/__tests__/utxo-watcher.test.d.ts.map +1 -0
- package/dist/__tests__/utxo-watcher.test.js +218 -0
- package/dist/__tests__/utxo-watcher.test.js.map +1 -0
- package/dist/bitcoin/encoder.d.ts +15 -0
- package/dist/bitcoin/encoder.d.ts.map +1 -0
- package/dist/bitcoin/encoder.js +286 -0
- package/dist/bitcoin/encoder.js.map +1 -0
- package/dist/bitcoin/index.d.ts +4 -0
- package/dist/bitcoin/index.d.ts.map +1 -0
- package/dist/bitcoin/index.js +20 -0
- package/dist/bitcoin/index.js.map +1 -0
- package/dist/dogecoin/encoder.d.ts +19 -0
- package/dist/dogecoin/encoder.d.ts.map +1 -0
- package/dist/dogecoin/encoder.js +145 -0
- package/dist/dogecoin/encoder.js.map +1 -0
- package/dist/dogecoin/index.d.ts +4 -0
- package/dist/dogecoin/index.d.ts.map +1 -0
- package/dist/dogecoin/index.js +20 -0
- package/dist/dogecoin/index.js.map +1 -0
- package/dist/evm/encoder.d.ts +7 -0
- package/dist/evm/encoder.d.ts.map +1 -0
- package/dist/evm/encoder.js +43 -0
- package/dist/evm/encoder.js.map +1 -0
- package/dist/evm/eth-watcher.d.ts +38 -0
- package/dist/evm/eth-watcher.d.ts.map +1 -0
- package/dist/evm/eth-watcher.js +138 -0
- package/dist/evm/eth-watcher.js.map +1 -0
- package/dist/evm/index.d.ts +16 -0
- package/dist/evm/index.d.ts.map +1 -0
- package/dist/evm/index.js +34 -0
- package/dist/evm/index.js.map +1 -0
- package/dist/evm/types.d.ts +43 -0
- package/dist/evm/types.d.ts.map +1 -0
- package/dist/evm/types.js +101 -0
- package/dist/evm/types.js.map +1 -0
- package/dist/evm/watcher.d.ts +42 -0
- package/dist/evm/watcher.d.ts.map +1 -0
- package/dist/evm/watcher.js +162 -0
- package/dist/evm/watcher.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/litecoin/encoder.d.ts +8 -0
- package/dist/litecoin/encoder.d.ts.map +1 -0
- package/dist/litecoin/encoder.js +16 -0
- package/dist/litecoin/encoder.js.map +1 -0
- package/dist/litecoin/index.d.ts +4 -0
- package/dist/litecoin/index.d.ts.map +1 -0
- package/dist/litecoin/index.js +20 -0
- package/dist/litecoin/index.js.map +1 -0
- package/dist/shared/test-helpers/index.d.ts +9 -0
- package/dist/shared/test-helpers/index.d.ts.map +1 -0
- package/dist/shared/test-helpers/index.js +30 -0
- package/dist/shared/test-helpers/index.js.map +1 -0
- package/dist/shared/utxo/index.d.ts +5 -0
- package/dist/shared/utxo/index.d.ts.map +1 -0
- package/dist/shared/utxo/index.js +3 -0
- package/dist/shared/utxo/index.js.map +1 -0
- package/dist/shared/utxo/rpc.d.ts +24 -0
- package/dist/shared/utxo/rpc.d.ts.map +1 -0
- package/dist/shared/utxo/rpc.js +75 -0
- package/dist/shared/utxo/rpc.js.map +1 -0
- package/dist/shared/utxo/types.d.ts +40 -0
- package/dist/shared/utxo/types.d.ts.map +1 -0
- package/dist/shared/utxo/types.js +2 -0
- package/dist/shared/utxo/types.js.map +1 -0
- package/dist/shared/utxo/watcher.d.ts +55 -0
- package/dist/shared/utxo/watcher.d.ts.map +1 -0
- package/dist/shared/utxo/watcher.js +150 -0
- package/dist/shared/utxo/watcher.js.map +1 -0
- package/dist/solana/encoder.d.ts +13 -0
- package/dist/solana/encoder.d.ts.map +1 -0
- package/dist/solana/encoder.js +62 -0
- package/dist/solana/encoder.js.map +1 -0
- package/dist/solana/index.d.ts +17 -0
- package/dist/solana/index.d.ts.map +1 -0
- package/dist/solana/index.js +32 -0
- package/dist/solana/index.js.map +1 -0
- package/dist/solana/sweeper.d.ts +47 -0
- package/dist/solana/sweeper.d.ts.map +1 -0
- package/dist/solana/sweeper.js +151 -0
- package/dist/solana/sweeper.js.map +1 -0
- package/dist/solana/types.d.ts +49 -0
- package/dist/solana/types.d.ts.map +1 -0
- package/dist/solana/types.js +2 -0
- package/dist/solana/types.js.map +1 -0
- package/dist/solana/watcher.d.ts +59 -0
- package/dist/solana/watcher.d.ts.map +1 -0
- package/dist/solana/watcher.js +251 -0
- package/dist/solana/watcher.js.map +1 -0
- package/dist/sweep/evm-sweeper.d.ts +31 -0
- package/dist/sweep/evm-sweeper.d.ts.map +1 -0
- package/dist/sweep/evm-sweeper.js +229 -0
- package/dist/sweep/evm-sweeper.js.map +1 -0
- package/dist/sweep/index.d.ts +22 -0
- package/dist/sweep/index.d.ts.map +1 -0
- package/dist/sweep/index.js +290 -0
- package/dist/sweep/index.js.map +1 -0
- package/dist/sweep/tron-sweeper.d.ts +40 -0
- package/dist/sweep/tron-sweeper.d.ts.map +1 -0
- package/dist/sweep/tron-sweeper.js +363 -0
- package/dist/sweep/tron-sweeper.js.map +1 -0
- package/dist/sweep/utxo-sweeper.d.ts +14 -0
- package/dist/sweep/utxo-sweeper.d.ts.map +1 -0
- package/dist/sweep/utxo-sweeper.js +13 -0
- package/dist/sweep/utxo-sweeper.js.map +1 -0
- package/dist/tron/address-convert.d.ts +15 -0
- package/dist/tron/address-convert.d.ts.map +1 -0
- package/dist/tron/address-convert.js +95 -0
- package/dist/tron/address-convert.js.map +1 -0
- package/dist/tron/encoder.d.ts +20 -0
- package/dist/tron/encoder.d.ts.map +1 -0
- package/dist/tron/encoder.js +67 -0
- package/dist/tron/encoder.js.map +1 -0
- package/dist/tron/index.d.ts +6 -0
- package/dist/tron/index.d.ts.map +1 -0
- package/dist/tron/index.js +20 -0
- package/dist/tron/index.js.map +1 -0
- package/dist/tron/sha256.d.ts +6 -0
- package/dist/tron/sha256.d.ts.map +1 -0
- package/dist/tron/sha256.js +90 -0
- package/dist/tron/sha256.js.map +1 -0
- package/dist/tron/watcher.d.ts +42 -0
- package/dist/tron/watcher.d.ts.map +1 -0
- package/dist/tron/watcher.js +168 -0
- package/dist/tron/watcher.js.map +1 -0
- package/package.json +47 -0
- package/src/__tests__/bitcoin-encoder.test.ts +115 -0
- package/src/__tests__/dogecoin-encoder.test.ts +66 -0
- package/src/__tests__/litecoin-encoder.test.ts +51 -0
- package/src/__tests__/registry.test.ts +91 -0
- package/src/__tests__/rpc.test.ts +36 -0
- package/src/__tests__/solana-encoder.test.ts +103 -0
- package/src/__tests__/solana-watcher.test.ts +316 -0
- package/src/__tests__/sweep-key-parity.test.ts +302 -0
- package/src/__tests__/tron-encoder.test.ts +108 -0
- package/src/__tests__/utxo-watcher.test.ts +252 -0
- package/src/bitcoin/encoder.ts +320 -0
- package/src/bitcoin/index.ts +23 -0
- package/src/dogecoin/encoder.ts +161 -0
- package/src/dogecoin/index.ts +23 -0
- package/src/evm/encoder.ts +49 -0
- package/src/evm/eth-watcher.ts +168 -0
- package/src/evm/index.ts +46 -0
- package/src/evm/types.ts +146 -0
- package/src/evm/watcher.ts +189 -0
- package/src/index.ts +21 -0
- package/src/litecoin/encoder.ts +18 -0
- package/src/litecoin/index.ts +23 -0
- package/src/shared/test-helpers/index.ts +36 -0
- package/src/shared/utxo/index.ts +12 -0
- package/src/shared/utxo/rpc.ts +80 -0
- package/src/shared/utxo/types.ts +43 -0
- package/src/shared/utxo/watcher.ts +195 -0
- package/src/solana/encoder.ts +72 -0
- package/src/solana/index.ts +36 -0
- package/src/solana/sweeper.ts +196 -0
- package/src/solana/types.ts +52 -0
- package/src/solana/watcher.ts +282 -0
- package/src/sweep/evm-sweeper.ts +296 -0
- package/src/sweep/index.ts +353 -0
- package/src/sweep/tron-sweeper.ts +467 -0
- package/src/sweep/utxo-sweeper.ts +23 -0
- package/src/tron/address-convert.ts +91 -0
- package/src/tron/encoder.ts +74 -0
- package/src/tron/index.ts +23 -0
- package/src/tron/sha256.ts +100 -0
- package/src/tron/watcher.ts +208 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Unified crypto sweep CLI -- consolidates deposits from all chains to treasury.
|
|
4
|
+
*
|
|
5
|
+
* Reads mnemonic from stdin, fetches chain config from chain server,
|
|
6
|
+
* dispatches to per-chain sweep strategies.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -d -pass pass:<passphrase> \
|
|
10
|
+
* -in "/mnt/g/My Drive/paperclip-wallet.enc" \
|
|
11
|
+
* | CRYPTO_SERVICE_URL=http://167.71.118.221:3100 \
|
|
12
|
+
* CRYPTO_SERVICE_KEY=sk-chain-2026 \
|
|
13
|
+
* crypto-sweep
|
|
14
|
+
*
|
|
15
|
+
* Env vars:
|
|
16
|
+
* CRYPTO_SERVICE_URL -- Chain server URL (required)
|
|
17
|
+
* CRYPTO_SERVICE_KEY -- Chain server auth key (optional)
|
|
18
|
+
* SWEEP_DRY_RUN -- set to "false" to actually broadcast (default: true)
|
|
19
|
+
* MAX_ADDRESSES -- how many deposit addresses to scan (default: 200)
|
|
20
|
+
*/
|
|
21
|
+
import { secp256k1 } from "@noble/curves/secp256k1.js";
|
|
22
|
+
import { keccak_256 } from "@noble/hashes/sha3.js";
|
|
23
|
+
import { HDKey } from "@scure/bip32";
|
|
24
|
+
import * as bip39 from "@scure/bip39";
|
|
25
|
+
import { wordlist } from "@scure/bip39/wordlists/english.js";
|
|
26
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
27
|
+
import { sha256 } from "../tron/sha256.js";
|
|
28
|
+
import { EvmSweeper } from "./evm-sweeper.js";
|
|
29
|
+
import { TronSweeper } from "./tron-sweeper.js";
|
|
30
|
+
import { UtxoSweeper } from "./utxo-sweeper.js";
|
|
31
|
+
// --- Config ---
|
|
32
|
+
const CRYPTO_SERVICE_URL = process.env.CRYPTO_SERVICE_URL;
|
|
33
|
+
const CRYPTO_SERVICE_KEY = process.env.CRYPTO_SERVICE_KEY;
|
|
34
|
+
const DRY_RUN = process.env.SWEEP_DRY_RUN !== "false";
|
|
35
|
+
const MAX_INDEX = Number(process.env.MAX_ADDRESSES ?? "200");
|
|
36
|
+
// Coin type to BIP-44 path and chain family
|
|
37
|
+
const COIN_TYPE_FAMILIES = {
|
|
38
|
+
0: "utxo", // BTC
|
|
39
|
+
2: "utxo", // LTC
|
|
40
|
+
3: "utxo", // DOGE
|
|
41
|
+
60: "evm", // ETH / EVM chains
|
|
42
|
+
195: "tron", // TRX
|
|
43
|
+
501: "solana", // SOL
|
|
44
|
+
};
|
|
45
|
+
// --- Address derivation ---
|
|
46
|
+
// Base58 for Tron addresses
|
|
47
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
48
|
+
function base58encode(data) {
|
|
49
|
+
let num = 0n;
|
|
50
|
+
for (const byte of data)
|
|
51
|
+
num = num * 256n + BigInt(byte);
|
|
52
|
+
let encoded = "";
|
|
53
|
+
while (num > 0n) {
|
|
54
|
+
encoded = BASE58_ALPHABET[Number(num % 58n)] + encoded;
|
|
55
|
+
num = num / 58n;
|
|
56
|
+
}
|
|
57
|
+
for (const byte of data) {
|
|
58
|
+
if (byte !== 0)
|
|
59
|
+
break;
|
|
60
|
+
encoded = `1${encoded}`;
|
|
61
|
+
}
|
|
62
|
+
return encoded;
|
|
63
|
+
}
|
|
64
|
+
// secp256k1.ProjectivePoint for point decompression
|
|
65
|
+
const ProjectivePoint = secp256k1.ProjectivePoint;
|
|
66
|
+
function toHex(data) {
|
|
67
|
+
return Array.from(data, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
68
|
+
}
|
|
69
|
+
function pubkeyToTronAddress(pubkey) {
|
|
70
|
+
const uncompressed = ProjectivePoint.fromHex(toHex(pubkey)).toRawBytes(false);
|
|
71
|
+
const hash = keccak_256(uncompressed.slice(1));
|
|
72
|
+
const addressBytes = hash.slice(-20);
|
|
73
|
+
const payload = new Uint8Array(21);
|
|
74
|
+
payload[0] = 0x41;
|
|
75
|
+
payload.set(addressBytes, 1);
|
|
76
|
+
const checksum = sha256(sha256(payload));
|
|
77
|
+
const full = new Uint8Array(25);
|
|
78
|
+
full.set(payload);
|
|
79
|
+
full.set(checksum.slice(0, 4), 21);
|
|
80
|
+
return base58encode(full);
|
|
81
|
+
}
|
|
82
|
+
function deriveKeyPairs(master, coinType, family, maxIndex, chainIndex) {
|
|
83
|
+
const account = master.derive(`m/44'/${coinType}'/0'`);
|
|
84
|
+
const chain = account.deriveChild(chainIndex);
|
|
85
|
+
const keys = [];
|
|
86
|
+
for (let i = 0; i < maxIndex; i++) {
|
|
87
|
+
const child = chain.deriveChild(i);
|
|
88
|
+
if (!child.privateKey || !child.publicKey)
|
|
89
|
+
continue;
|
|
90
|
+
let address;
|
|
91
|
+
if (family === "evm") {
|
|
92
|
+
const privHex = `0x${toHex(child.privateKey)}`;
|
|
93
|
+
address = privateKeyToAccount(privHex).address;
|
|
94
|
+
}
|
|
95
|
+
else if (family === "tron") {
|
|
96
|
+
address = pubkeyToTronAddress(child.publicKey);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// UTXO / other -- use hex pubkey as placeholder address
|
|
100
|
+
address = toHex(child.publicKey);
|
|
101
|
+
}
|
|
102
|
+
keys.push({
|
|
103
|
+
privateKey: child.privateKey,
|
|
104
|
+
publicKey: child.publicKey,
|
|
105
|
+
address,
|
|
106
|
+
index: i,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return keys;
|
|
110
|
+
}
|
|
111
|
+
function deriveTreasuryAddress(master, coinType, family) {
|
|
112
|
+
// Treasury = internal chain (1), index 0
|
|
113
|
+
const account = master.derive(`m/44'/${coinType}'/0'`);
|
|
114
|
+
const chain = account.deriveChild(1);
|
|
115
|
+
const child = chain.deriveChild(0);
|
|
116
|
+
if (!child.privateKey || !child.publicKey)
|
|
117
|
+
throw new Error(`Cannot derive treasury key for coin_type ${coinType}`);
|
|
118
|
+
let address;
|
|
119
|
+
if (family === "evm") {
|
|
120
|
+
const privHex = `0x${toHex(child.privateKey)}`;
|
|
121
|
+
address = privateKeyToAccount(privHex).address;
|
|
122
|
+
}
|
|
123
|
+
else if (family === "tron") {
|
|
124
|
+
address = pubkeyToTronAddress(child.publicKey);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
address = toHex(child.publicKey);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
privateKey: child.privateKey,
|
|
131
|
+
publicKey: child.publicKey,
|
|
132
|
+
address,
|
|
133
|
+
index: 0,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// --- Main ---
|
|
137
|
+
async function main() {
|
|
138
|
+
// Validate required env
|
|
139
|
+
if (!CRYPTO_SERVICE_URL) {
|
|
140
|
+
console.error("CRYPTO_SERVICE_URL is required");
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
// Read mnemonic from stdin
|
|
144
|
+
const chunks = [];
|
|
145
|
+
for await (const chunk of process.stdin) {
|
|
146
|
+
chunks.push(chunk);
|
|
147
|
+
}
|
|
148
|
+
const mnemonic = Buffer.concat(chunks).toString("utf-8").trim();
|
|
149
|
+
if (!bip39.validateMnemonic(mnemonic, wordlist)) {
|
|
150
|
+
console.error("Invalid mnemonic");
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
// Fetch enabled payment methods from chain server
|
|
154
|
+
console.log(`Fetching chains from ${CRYPTO_SERVICE_URL}/chains...`);
|
|
155
|
+
const headers = {
|
|
156
|
+
"Content-Type": "application/json",
|
|
157
|
+
};
|
|
158
|
+
if (CRYPTO_SERVICE_KEY)
|
|
159
|
+
headers.Authorization = `Bearer ${CRYPTO_SERVICE_KEY}`;
|
|
160
|
+
const res = await fetch(`${CRYPTO_SERVICE_URL}/chains`, { headers });
|
|
161
|
+
if (!res.ok)
|
|
162
|
+
throw new Error(`Chain server returned ${res.status}`);
|
|
163
|
+
const methods = await res.json();
|
|
164
|
+
console.log(`Found ${methods.length} payment methods\n`);
|
|
165
|
+
// Group by coin_type
|
|
166
|
+
const byCoinType = new Map();
|
|
167
|
+
for (const m of methods) {
|
|
168
|
+
const coinType = m.coin_type;
|
|
169
|
+
if (coinType === undefined || coinType === null) {
|
|
170
|
+
console.log(` Skipping ${m.token}/${m.chain} -- no coin_type`);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const group = byCoinType.get(coinType) ?? [];
|
|
174
|
+
group.push(m);
|
|
175
|
+
byCoinType.set(coinType, group);
|
|
176
|
+
}
|
|
177
|
+
// Derive master HD key
|
|
178
|
+
const seed = bip39.mnemonicToSeedSync(mnemonic);
|
|
179
|
+
const master = HDKey.fromMasterSeed(seed);
|
|
180
|
+
console.log(`Dry run: ${DRY_RUN}`);
|
|
181
|
+
console.log(`Max addresses: ${MAX_INDEX}\n`);
|
|
182
|
+
const allResults = [];
|
|
183
|
+
// Process each coin type group
|
|
184
|
+
for (const [coinType, group] of byCoinType) {
|
|
185
|
+
const family = COIN_TYPE_FAMILIES[coinType];
|
|
186
|
+
if (!family) {
|
|
187
|
+
console.log(`Skipping coin_type ${coinType} -- unsupported family`);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const chainNames = [...new Set(group.map((m) => m.chain))].join(", ");
|
|
191
|
+
console.log(`\n${"=".repeat(60)}\nCoin type ${coinType} (${family}) -- chains: ${chainNames}\n${"=".repeat(60)}`);
|
|
192
|
+
// Derive deposit keys at chain=0 (external)
|
|
193
|
+
const depositKeys = deriveKeyPairs(master, coinType, family, MAX_INDEX, 0);
|
|
194
|
+
const treasury = deriveTreasuryAddress(master, coinType, family);
|
|
195
|
+
console.log(`Treasury: ${treasury.address}`);
|
|
196
|
+
console.log(`Scanning ${MAX_INDEX} deposit addresses...\n`);
|
|
197
|
+
// Include treasury key in the key set so sweepers can use it for gas funding
|
|
198
|
+
const allKeys = [...depositKeys, treasury];
|
|
199
|
+
if (family === "utxo") {
|
|
200
|
+
const sweeper = new UtxoSweeper(chainNames);
|
|
201
|
+
try {
|
|
202
|
+
await sweeper.sweep(allKeys, treasury.address, DRY_RUN);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.log(` ${err.message}`);
|
|
206
|
+
}
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (family === "evm") {
|
|
210
|
+
// Group EVM methods by chain (each chain has its own RPC)
|
|
211
|
+
const byChain = new Map();
|
|
212
|
+
for (const m of group) {
|
|
213
|
+
const chain = byChain.get(m.chain) ?? [];
|
|
214
|
+
chain.push(m);
|
|
215
|
+
byChain.set(m.chain, chain);
|
|
216
|
+
}
|
|
217
|
+
for (const [chainName, chainMethods] of byChain) {
|
|
218
|
+
const rpcUrl = chainMethods[0]?.rpc_url;
|
|
219
|
+
if (!rpcUrl) {
|
|
220
|
+
console.log(` Skipping ${chainName} -- no rpc_url in chain config`);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const tokens = chainMethods
|
|
224
|
+
.filter((m) => m.contractAddress)
|
|
225
|
+
.map((m) => ({
|
|
226
|
+
name: m.token,
|
|
227
|
+
address: m.contractAddress,
|
|
228
|
+
decimals: m.decimals,
|
|
229
|
+
}));
|
|
230
|
+
console.log(`\n--- ${chainName} (${tokens.length} ERC-20 tokens) ---`);
|
|
231
|
+
const sweeper = new EvmSweeper({
|
|
232
|
+
rpcUrl,
|
|
233
|
+
chainName,
|
|
234
|
+
tokens,
|
|
235
|
+
});
|
|
236
|
+
const results = await sweeper.sweep(allKeys, treasury.address, DRY_RUN);
|
|
237
|
+
allResults.push(...results);
|
|
238
|
+
}
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (family === "tron") {
|
|
242
|
+
const rpcUrl = group[0]?.rpc_url;
|
|
243
|
+
if (!rpcUrl) {
|
|
244
|
+
console.log(" Skipping tron -- no rpc_url in chain config");
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const tokens = group
|
|
248
|
+
.filter((m) => m.contractAddress != null)
|
|
249
|
+
.map((m) => ({
|
|
250
|
+
name: m.token,
|
|
251
|
+
contractAddress: m.contractAddress,
|
|
252
|
+
decimals: m.decimals,
|
|
253
|
+
}));
|
|
254
|
+
console.log(`\n--- Tron (${tokens.length} TRC-20 tokens) ---`);
|
|
255
|
+
const sweeper = new TronSweeper({
|
|
256
|
+
rpcUrl,
|
|
257
|
+
apiKey: group[0]?.rpc_headers?.["TRON-PRO-API-KEY"],
|
|
258
|
+
tokens,
|
|
259
|
+
});
|
|
260
|
+
const results = await sweeper.sweep(allKeys, treasury.address, DRY_RUN);
|
|
261
|
+
allResults.push(...results);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
console.log(` Skipping ${family} -- no sweeper implemented`);
|
|
265
|
+
}
|
|
266
|
+
// Summary
|
|
267
|
+
console.log(`\n${"=".repeat(60)}`);
|
|
268
|
+
console.log("SWEEP SUMMARY");
|
|
269
|
+
console.log(`${"=".repeat(60)}`);
|
|
270
|
+
if (allResults.length === 0) {
|
|
271
|
+
if (DRY_RUN) {
|
|
272
|
+
console.log("Dry run complete. Set SWEEP_DRY_RUN=false to broadcast.");
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.log("No funds swept.");
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
for (const r of allResults) {
|
|
280
|
+
console.log(` [${r.index}] ${r.address}: ${r.amount} ${r.token} -> ${r.txHash}`);
|
|
281
|
+
}
|
|
282
|
+
console.log(`\nTotal: ${allResults.length} transactions`);
|
|
283
|
+
}
|
|
284
|
+
console.log("\nDone.");
|
|
285
|
+
}
|
|
286
|
+
main().catch((err) => {
|
|
287
|
+
console.error(err);
|
|
288
|
+
process.exit(1);
|
|
289
|
+
});
|
|
290
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sweep/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tron sweep strategy -- consolidates TRX + TRC-20s from deposit addresses to treasury.
|
|
3
|
+
*
|
|
4
|
+
* Uses Tron HTTP API (not EVM JSON-RPC).
|
|
5
|
+
*
|
|
6
|
+
* 3-phase sweep:
|
|
7
|
+
* 1. Sweep TRX first -- deposit addresses self-fund bandwidth, treasury receives TRX
|
|
8
|
+
* 2. Fund energy -- treasury sends TRX to TRC-20 deposit addresses
|
|
9
|
+
* 3. Sweep TRC-20s -- deposit addresses send all tokens to treasury
|
|
10
|
+
*/
|
|
11
|
+
import type { DepositInfo, ISweepStrategy, KeyPair, SweepResult } from "@wopr-network/platform-core/crypto-plugin";
|
|
12
|
+
export interface TronToken {
|
|
13
|
+
name: string;
|
|
14
|
+
contractAddress: string;
|
|
15
|
+
decimals: number;
|
|
16
|
+
}
|
|
17
|
+
export interface TronSweeperOpts {
|
|
18
|
+
rpcUrl: string;
|
|
19
|
+
apiKey?: string;
|
|
20
|
+
tokens: TronToken[];
|
|
21
|
+
}
|
|
22
|
+
export declare class TronSweeper implements ISweepStrategy {
|
|
23
|
+
private readonly rpcUrl;
|
|
24
|
+
private readonly apiKey?;
|
|
25
|
+
private readonly tokens;
|
|
26
|
+
private readonly tokenHexMap;
|
|
27
|
+
constructor(opts: TronSweeperOpts);
|
|
28
|
+
private headers;
|
|
29
|
+
private post;
|
|
30
|
+
private getTrxBalance;
|
|
31
|
+
private getTrc20Balance;
|
|
32
|
+
private createTrxTransfer;
|
|
33
|
+
private createTrc20Transfer;
|
|
34
|
+
private signTransaction;
|
|
35
|
+
private broadcastTransaction;
|
|
36
|
+
private keyToTronHex;
|
|
37
|
+
scan(keys: KeyPair[], _treasury: string): Promise<DepositInfo[]>;
|
|
38
|
+
sweep(keys: KeyPair[], treasury: string, dryRun: boolean): Promise<SweepResult[]>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=tron-sweeper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tron-sweeper.d.ts","sourceRoot":"","sources":["../../src/sweep/tron-sweeper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAmBnH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,EAAE,CAAC;CACpB;AAuFD,qBAAa,WAAY,YAAW,cAAc;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;gBAEtC,IAAI,EAAE,eAAe;IAOjC,OAAO,CAAC,OAAO;YAQD,IAAI;YAUJ,aAAa;YAQb,eAAe;YAgBf,iBAAiB;YAejB,mBAAmB;IAqCjC,OAAO,CAAC,eAAe;YAsBT,oBAAoB;IAUlC,OAAO,CAAC,YAAY;IAId,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2ChE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAmJvF"}
|