@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,363 @@
|
|
|
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 { secp256k1 } from "@noble/curves/secp256k1.js";
|
|
12
|
+
import { keccak_256 } from "@noble/hashes/sha3.js";
|
|
13
|
+
import { sha256 } from "../tron/sha256.js";
|
|
14
|
+
// TRX has 6 decimals (1 TRX = 1,000,000 SUN)
|
|
15
|
+
const SUN_PER_TRX = 1000000n;
|
|
16
|
+
// Min TRX to keep for a simple TRX transfer (~1.1 TRX in SUN)
|
|
17
|
+
const TRX_TRANSFER_COST = 1100000n;
|
|
18
|
+
// Energy needed for TRC-20 transfer (~15 TRX in SUN, conservative)
|
|
19
|
+
const TRC20_ENERGY_COST = 15000000n;
|
|
20
|
+
// secp256k1.ProjectivePoint for point decompression
|
|
21
|
+
const ProjectivePoint = secp256k1.ProjectivePoint;
|
|
22
|
+
// --- Base58 ---
|
|
23
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
24
|
+
function base58encode(data) {
|
|
25
|
+
let num = 0n;
|
|
26
|
+
for (const byte of data)
|
|
27
|
+
num = num * 256n + BigInt(byte);
|
|
28
|
+
let encoded = "";
|
|
29
|
+
while (num > 0n) {
|
|
30
|
+
encoded = BASE58_ALPHABET[Number(num % 58n)] + encoded;
|
|
31
|
+
num = num / 58n;
|
|
32
|
+
}
|
|
33
|
+
for (const byte of data) {
|
|
34
|
+
if (byte !== 0)
|
|
35
|
+
break;
|
|
36
|
+
encoded = `1${encoded}`;
|
|
37
|
+
}
|
|
38
|
+
return encoded;
|
|
39
|
+
}
|
|
40
|
+
function base58decode(str) {
|
|
41
|
+
let num = 0n;
|
|
42
|
+
for (const ch of str) {
|
|
43
|
+
const idx = BASE58_ALPHABET.indexOf(ch);
|
|
44
|
+
if (idx < 0)
|
|
45
|
+
throw new Error(`Invalid Base58 char: ${ch}`);
|
|
46
|
+
num = num * 58n + BigInt(idx);
|
|
47
|
+
}
|
|
48
|
+
const hex = num.toString(16).padStart(50, "0"); // 25 bytes = 50 hex chars
|
|
49
|
+
const pairs = hex.match(/.{2}/g) ?? [];
|
|
50
|
+
const bytes = new Uint8Array(pairs.map((h) => Number.parseInt(h, 16)));
|
|
51
|
+
let leadingZeros = 0;
|
|
52
|
+
for (const ch of str) {
|
|
53
|
+
if (ch !== "1")
|
|
54
|
+
break;
|
|
55
|
+
leadingZeros++;
|
|
56
|
+
}
|
|
57
|
+
const result = new Uint8Array(leadingZeros + bytes.length);
|
|
58
|
+
result.set(bytes, leadingZeros);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
// --- Hex helpers ---
|
|
62
|
+
function toHex(data) {
|
|
63
|
+
return Array.from(data, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
64
|
+
}
|
|
65
|
+
function fromHex(hex) {
|
|
66
|
+
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
67
|
+
const pairs = clean.match(/.{2}/g) ?? [];
|
|
68
|
+
return new Uint8Array(pairs.map((h) => Number.parseInt(h, 16)));
|
|
69
|
+
}
|
|
70
|
+
// --- Address helpers ---
|
|
71
|
+
function pubkeyToTronAddress(pubkey) {
|
|
72
|
+
const uncompressed = ProjectivePoint.fromHex(toHex(pubkey)).toRawBytes(false);
|
|
73
|
+
const hash = keccak_256(uncompressed.slice(1));
|
|
74
|
+
const addressBytes = hash.slice(-20);
|
|
75
|
+
const payload = new Uint8Array(21);
|
|
76
|
+
payload[0] = 0x41;
|
|
77
|
+
payload.set(addressBytes, 1);
|
|
78
|
+
const checksum = sha256(sha256(payload));
|
|
79
|
+
const full = new Uint8Array(25);
|
|
80
|
+
full.set(payload);
|
|
81
|
+
full.set(checksum.slice(0, 4), 21);
|
|
82
|
+
return base58encode(full);
|
|
83
|
+
}
|
|
84
|
+
function tronAddressToHex(tAddr) {
|
|
85
|
+
const decoded = base58decode(tAddr);
|
|
86
|
+
return toHex(decoded.slice(0, 21));
|
|
87
|
+
}
|
|
88
|
+
function formatTrx(sun) {
|
|
89
|
+
const whole = sun / SUN_PER_TRX;
|
|
90
|
+
const frac = sun % SUN_PER_TRX;
|
|
91
|
+
if (frac === 0n)
|
|
92
|
+
return `${whole}`;
|
|
93
|
+
return `${whole}.${frac.toString().padStart(6, "0").replace(/0+$/, "")}`;
|
|
94
|
+
}
|
|
95
|
+
function formatTokenAmount(amount, decimals) {
|
|
96
|
+
return (Number(amount) / 10 ** decimals).toString();
|
|
97
|
+
}
|
|
98
|
+
// --- Tron RPC ---
|
|
99
|
+
export class TronSweeper {
|
|
100
|
+
rpcUrl;
|
|
101
|
+
apiKey;
|
|
102
|
+
tokens;
|
|
103
|
+
tokenHexMap;
|
|
104
|
+
constructor(opts) {
|
|
105
|
+
this.rpcUrl = opts.rpcUrl;
|
|
106
|
+
this.apiKey = opts.apiKey;
|
|
107
|
+
this.tokens = opts.tokens;
|
|
108
|
+
this.tokenHexMap = new Map(opts.tokens.map((t) => [t.name, tronAddressToHex(t.contractAddress)]));
|
|
109
|
+
}
|
|
110
|
+
headers() {
|
|
111
|
+
const h = {
|
|
112
|
+
"Content-Type": "application/json",
|
|
113
|
+
};
|
|
114
|
+
if (this.apiKey)
|
|
115
|
+
h["TRON-PRO-API-KEY"] = this.apiKey;
|
|
116
|
+
return h;
|
|
117
|
+
}
|
|
118
|
+
async post(path, body) {
|
|
119
|
+
const res = await fetch(`${this.rpcUrl}${path}`, {
|
|
120
|
+
method: "POST",
|
|
121
|
+
headers: this.headers(),
|
|
122
|
+
body: JSON.stringify(body),
|
|
123
|
+
});
|
|
124
|
+
if (!res.ok)
|
|
125
|
+
throw new Error(`Tron RPC ${path} returned ${res.status}: ${await res.text()}`);
|
|
126
|
+
return res.json();
|
|
127
|
+
}
|
|
128
|
+
async getTrxBalance(addressHex) {
|
|
129
|
+
const result = (await this.post("/wallet/getaccount", {
|
|
130
|
+
address: addressHex,
|
|
131
|
+
visible: false,
|
|
132
|
+
}));
|
|
133
|
+
return BigInt(result.balance ?? 0);
|
|
134
|
+
}
|
|
135
|
+
async getTrc20Balance(ownerHex, contractHex) {
|
|
136
|
+
const ownerBytes = ownerHex.startsWith("41") ? ownerHex.slice(2) : ownerHex;
|
|
137
|
+
const parameter = ownerBytes.padStart(64, "0");
|
|
138
|
+
const result = (await this.post("/wallet/triggerconstantcontract", {
|
|
139
|
+
owner_address: ownerHex,
|
|
140
|
+
contract_address: contractHex,
|
|
141
|
+
function_selector: "balanceOf(address)",
|
|
142
|
+
parameter,
|
|
143
|
+
visible: false,
|
|
144
|
+
}));
|
|
145
|
+
if (!result.constant_result?.[0])
|
|
146
|
+
return 0n;
|
|
147
|
+
return BigInt(`0x${result.constant_result[0]}`);
|
|
148
|
+
}
|
|
149
|
+
async createTrxTransfer(fromHexAddr, toHexAddr, amountSun) {
|
|
150
|
+
const result = (await this.post("/wallet/createtransaction", {
|
|
151
|
+
owner_address: fromHexAddr,
|
|
152
|
+
to_address: toHexAddr,
|
|
153
|
+
amount: Number(amountSun),
|
|
154
|
+
visible: false,
|
|
155
|
+
}));
|
|
156
|
+
if (!result.txID)
|
|
157
|
+
throw new Error(`Failed to create TRX transfer: ${JSON.stringify(result)}`);
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
async createTrc20Transfer(fromHexAddr, contractHex, toHexAddr, amount) {
|
|
161
|
+
const toBytes = toHexAddr.startsWith("41") ? toHexAddr.slice(2) : toHexAddr;
|
|
162
|
+
const amountHex = amount.toString(16).padStart(64, "0");
|
|
163
|
+
const parameter = toBytes.padStart(64, "0") + amountHex;
|
|
164
|
+
const result = (await this.post("/wallet/triggersmartcontract", {
|
|
165
|
+
owner_address: fromHexAddr,
|
|
166
|
+
contract_address: contractHex,
|
|
167
|
+
function_selector: "transfer(address,uint256)",
|
|
168
|
+
parameter,
|
|
169
|
+
fee_limit: 100_000_000,
|
|
170
|
+
visible: false,
|
|
171
|
+
}));
|
|
172
|
+
if (!result.result?.result)
|
|
173
|
+
throw new Error(`Failed to create TRC-20 transfer: ${JSON.stringify(result)}`);
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
signTransaction(tx, privateKey) {
|
|
177
|
+
const txHash = fromHex(tx.txID);
|
|
178
|
+
// secp256k1.sign returns RecoveredSignature with toCompactRawBytes() and recovery
|
|
179
|
+
const sig = secp256k1.sign(txHash, privateKey, { lowS: true });
|
|
180
|
+
// Tron signature = r (32) + s (32) + recovery (1)
|
|
181
|
+
const sigBytes = new Uint8Array(65);
|
|
182
|
+
sigBytes.set(sig.toCompactRawBytes(), 0);
|
|
183
|
+
sigBytes[64] = sig.recovery;
|
|
184
|
+
return { ...tx, signature: [toHex(sigBytes)] };
|
|
185
|
+
}
|
|
186
|
+
async broadcastTransaction(signedTx) {
|
|
187
|
+
const result = (await this.post("/wallet/broadcasttransaction", signedTx));
|
|
188
|
+
if (!result.result)
|
|
189
|
+
throw new Error(`Broadcast failed: ${result.message ?? JSON.stringify(result)}`);
|
|
190
|
+
return result.txid ?? signedTx.txID;
|
|
191
|
+
}
|
|
192
|
+
keyToTronHex(key) {
|
|
193
|
+
return tronAddressToHex(key.address.startsWith("T") ? key.address : pubkeyToTronAddress(key.publicKey));
|
|
194
|
+
}
|
|
195
|
+
async scan(keys, _treasury) {
|
|
196
|
+
const deposits = [];
|
|
197
|
+
for (let i = 0; i < keys.length; i++) {
|
|
198
|
+
const key = keys[i];
|
|
199
|
+
if (!key)
|
|
200
|
+
continue;
|
|
201
|
+
const addrHex = this.keyToTronHex(key);
|
|
202
|
+
const trxBalance = await this.getTrxBalance(addrHex);
|
|
203
|
+
const tokenBalances = [];
|
|
204
|
+
for (const token of this.tokens) {
|
|
205
|
+
const contractHex = this.tokenHexMap.get(token.name);
|
|
206
|
+
if (!contractHex)
|
|
207
|
+
continue;
|
|
208
|
+
try {
|
|
209
|
+
const balance = await this.getTrc20Balance(addrHex, contractHex);
|
|
210
|
+
if (balance > 0n) {
|
|
211
|
+
tokenBalances.push({
|
|
212
|
+
token: token.name,
|
|
213
|
+
balance,
|
|
214
|
+
decimals: token.decimals,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// Contract call failed
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (trxBalance > 0n || tokenBalances.length > 0) {
|
|
223
|
+
deposits.push({
|
|
224
|
+
index: key.index,
|
|
225
|
+
address: key.address,
|
|
226
|
+
nativeBalance: trxBalance,
|
|
227
|
+
tokenBalances,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// Rate limit protection
|
|
231
|
+
if (i % 10 === 9)
|
|
232
|
+
await sleep(200);
|
|
233
|
+
}
|
|
234
|
+
return deposits;
|
|
235
|
+
}
|
|
236
|
+
async sweep(keys, treasury, dryRun) {
|
|
237
|
+
const treasuryHex = tronAddressToHex(treasury);
|
|
238
|
+
const deposits = await this.scan(keys, treasury);
|
|
239
|
+
if (deposits.length === 0) {
|
|
240
|
+
console.log(" No Tron deposits with balances.");
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
const trxDeposits = deposits.filter((d) => d.nativeBalance > TRX_TRANSFER_COST);
|
|
244
|
+
const tokenDeposits = deposits.filter((d) => d.tokenBalances.length > 0);
|
|
245
|
+
const totalTrx = trxDeposits.reduce((sum, d) => sum + d.nativeBalance, 0n);
|
|
246
|
+
// Print scan summary
|
|
247
|
+
console.log(` Found ${trxDeposits.length} TRX deposits (${formatTrx(totalTrx)} TRX)`);
|
|
248
|
+
for (const token of this.tokens) {
|
|
249
|
+
const total = tokenDeposits.reduce((sum, d) => sum + (d.tokenBalances.find((t) => t.token === token.name)?.balance ?? 0n), 0n);
|
|
250
|
+
if (total > 0n) {
|
|
251
|
+
console.log(` ${formatTokenAmount(total, token.decimals)} ${token.name}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (dryRun)
|
|
255
|
+
return [];
|
|
256
|
+
const results = [];
|
|
257
|
+
const keyMap = new Map(keys.map((k) => [k.index, k]));
|
|
258
|
+
// Phase 1: Sweep TRX (self-funded)
|
|
259
|
+
if (trxDeposits.length > 0) {
|
|
260
|
+
console.log(" Phase 1: Sweeping TRX to treasury");
|
|
261
|
+
for (const dep of trxDeposits) {
|
|
262
|
+
const key = keyMap.get(dep.index);
|
|
263
|
+
if (!key)
|
|
264
|
+
continue;
|
|
265
|
+
const sweepAmount = dep.nativeBalance - TRX_TRANSFER_COST;
|
|
266
|
+
if (sweepAmount <= 0n) {
|
|
267
|
+
console.log(` [${dep.index}] Balance too low to cover fees, skipping`);
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
const depHex = this.keyToTronHex(key);
|
|
272
|
+
const tx = await this.createTrxTransfer(depHex, treasuryHex, sweepAmount);
|
|
273
|
+
const signed = this.signTransaction(tx, key.privateKey);
|
|
274
|
+
const txId = await this.broadcastTransaction(signed);
|
|
275
|
+
console.log(` [${dep.index}] Swept ${formatTrx(sweepAmount)} TRX: ${txId}`);
|
|
276
|
+
await sleep(3000);
|
|
277
|
+
results.push({
|
|
278
|
+
index: dep.index,
|
|
279
|
+
address: dep.address,
|
|
280
|
+
token: "TRX",
|
|
281
|
+
amount: formatTrx(sweepAmount),
|
|
282
|
+
txHash: txId,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
console.error(` [${dep.index}] Failed: ${err}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Phase 2: Fund energy for TRC-20 sweeps
|
|
291
|
+
if (tokenDeposits.length > 0) {
|
|
292
|
+
const treasuryTrx = await this.getTrxBalance(treasuryHex);
|
|
293
|
+
const totalEnergyNeeded = TRC20_ENERGY_COST * BigInt(tokenDeposits.reduce((n, d) => n + d.tokenBalances.length, 0));
|
|
294
|
+
console.log(" Phase 2: Funding energy for TRC-20 sweeps");
|
|
295
|
+
console.log(` Treasury TRX: ${formatTrx(treasuryTrx)}, energy cost: ${formatTrx(totalEnergyNeeded)}`);
|
|
296
|
+
if (treasuryTrx < totalEnergyNeeded) {
|
|
297
|
+
console.error(` Insufficient treasury TRX. Need ${formatTrx(totalEnergyNeeded)}, have ${formatTrx(treasuryTrx)}.`);
|
|
298
|
+
return results;
|
|
299
|
+
}
|
|
300
|
+
// Find treasury key
|
|
301
|
+
const treasuryKey = keys.find((k) => k.address === treasury);
|
|
302
|
+
if (!treasuryKey) {
|
|
303
|
+
console.error(" Cannot fund energy: treasury private key not available");
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
for (const dep of tokenDeposits) {
|
|
307
|
+
const depHex = tronAddressToHex(dep.address);
|
|
308
|
+
const depTrx = await this.getTrxBalance(depHex);
|
|
309
|
+
const needed = TRC20_ENERGY_COST * BigInt(dep.tokenBalances.length);
|
|
310
|
+
if (depTrx >= needed) {
|
|
311
|
+
console.log(` [${dep.index}] Already has energy TRX, skipping`);
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
const fundAmount = needed - depTrx;
|
|
316
|
+
const tx = await this.createTrxTransfer(treasuryHex, depHex, fundAmount);
|
|
317
|
+
const signed = this.signTransaction(tx, treasuryKey.privateKey);
|
|
318
|
+
const txId = await this.broadcastTransaction(signed);
|
|
319
|
+
console.log(` [${dep.index}] Funded ${formatTrx(fundAmount)} TRX: ${txId}`);
|
|
320
|
+
await sleep(3000);
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
console.error(` [${dep.index}] Fund failed: ${err}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Phase 3: Sweep TRC-20s
|
|
327
|
+
console.log(" Phase 3: Sweeping TRC-20s to treasury");
|
|
328
|
+
for (const dep of tokenDeposits) {
|
|
329
|
+
const key = keyMap.get(dep.index);
|
|
330
|
+
if (!key)
|
|
331
|
+
continue;
|
|
332
|
+
const depHex = this.keyToTronHex(key);
|
|
333
|
+
for (const tokenBal of dep.tokenBalances) {
|
|
334
|
+
const contractHex = this.tokenHexMap.get(tokenBal.token);
|
|
335
|
+
if (!contractHex)
|
|
336
|
+
continue;
|
|
337
|
+
try {
|
|
338
|
+
const { transaction: tx } = await this.createTrc20Transfer(depHex, contractHex, treasuryHex, tokenBal.balance);
|
|
339
|
+
const signed = this.signTransaction(tx, key.privateKey);
|
|
340
|
+
const txId = await this.broadcastTransaction(signed);
|
|
341
|
+
console.log(` [${dep.index}] Swept ${formatTokenAmount(tokenBal.balance, tokenBal.decimals)} ${tokenBal.token}: ${txId}`);
|
|
342
|
+
await sleep(3000);
|
|
343
|
+
results.push({
|
|
344
|
+
index: dep.index,
|
|
345
|
+
address: dep.address,
|
|
346
|
+
token: tokenBal.token,
|
|
347
|
+
amount: formatTokenAmount(tokenBal.balance, tokenBal.decimals),
|
|
348
|
+
txHash: txId,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
console.error(` [${dep.index}] ${tokenBal.token} sweep failed: ${err}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return results;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function sleep(ms) {
|
|
361
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=tron-sweeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tron-sweeper.js","sourceRoot":"","sources":["../../src/sweep/tron-sweeper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UTXO sweep stub -- BTC/LTC/DOGE sweeps are manual via wallet software.
|
|
3
|
+
*
|
|
4
|
+
* UTXO chains require coin selection, fee estimation, and input signing
|
|
5
|
+
* that is best handled by dedicated wallet software (Electrum, Sparrow, etc.).
|
|
6
|
+
*/
|
|
7
|
+
import type { DepositInfo, ISweepStrategy, KeyPair, SweepResult } from "@wopr-network/platform-core/crypto-plugin";
|
|
8
|
+
export declare class UtxoSweeper implements ISweepStrategy {
|
|
9
|
+
private readonly chain;
|
|
10
|
+
constructor(chain: string);
|
|
11
|
+
scan(_keys: KeyPair[], _treasury: string): Promise<DepositInfo[]>;
|
|
12
|
+
sweep(_keys: KeyPair[], _treasury: string, _dryRun: boolean): Promise<SweepResult[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=utxo-sweeper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxo-sweeper.d.ts","sourceRoot":"","sources":["../../src/sweep/utxo-sweeper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAEnH,qBAAa,WAAY,YAAW,cAAc;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,EAAE,MAAM;IAInB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAIjE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAG1F"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class UtxoSweeper {
|
|
2
|
+
chain;
|
|
3
|
+
constructor(chain) {
|
|
4
|
+
this.chain = chain;
|
|
5
|
+
}
|
|
6
|
+
async scan(_keys, _treasury) {
|
|
7
|
+
throw new Error(`UTXO sweep not implemented for ${this.chain} -- use wallet software (Electrum/Sparrow)`);
|
|
8
|
+
}
|
|
9
|
+
async sweep(_keys, _treasury, _dryRun) {
|
|
10
|
+
throw new Error(`UTXO sweep not implemented for ${this.chain} -- use wallet software (Electrum/Sparrow)`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=utxo-sweeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utxo-sweeper.js","sourceRoot":"","sources":["../../src/sweep/utxo-sweeper.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,WAAW;IACN,KAAK,CAAS;IAE/B,YAAY,KAAa;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAgB,EAAE,SAAiB;QAC7C,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,KAAK,4CAA4C,CAAC,CAAC;IAC3G,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAgB,EAAE,SAAiB,EAAE,OAAgB;QAChE,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,KAAK,4CAA4C,CAAC,CAAC;IAC3G,CAAC;CACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a Tron T... address to 0x hex (20 bytes, no 0x41 prefix).
|
|
3
|
+
* For feeding addresses to the EVM watcher JSON-RPC filters.
|
|
4
|
+
*/
|
|
5
|
+
export declare function tronToHex(tronAddr: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Convert a 0x hex address (20 bytes) back to Tron T... Base58Check.
|
|
8
|
+
* For converting watcher event addresses back to DB format.
|
|
9
|
+
*/
|
|
10
|
+
export declare function hexToTron(hexAddr: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Check if an address is a Tron T... address.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isTronAddress(addr: string): boolean;
|
|
15
|
+
//# sourceMappingURL=address-convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-convert.d.ts","sourceRoot":"","sources":["../../src/tron/address-convert.ts"],"names":[],"mappings":"AAgDA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAajD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tron address conversion -- T... Base58Check <-> 0x hex.
|
|
3
|
+
*
|
|
4
|
+
* Tron addresses are 21 bytes: 0x41 prefix + 20-byte address.
|
|
5
|
+
* The JSON-RPC layer strips the 0x41 and returns standard 0x-prefixed hex.
|
|
6
|
+
* We need to convert between the two at the watcher boundary.
|
|
7
|
+
*/
|
|
8
|
+
import { sha256 } from "./sha256.js";
|
|
9
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
10
|
+
function base58decode(s) {
|
|
11
|
+
let leadingZeros = 0;
|
|
12
|
+
for (const ch of s) {
|
|
13
|
+
if (ch !== "1")
|
|
14
|
+
break;
|
|
15
|
+
leadingZeros++;
|
|
16
|
+
}
|
|
17
|
+
let num = 0n;
|
|
18
|
+
for (const ch of s) {
|
|
19
|
+
const idx = BASE58_ALPHABET.indexOf(ch);
|
|
20
|
+
if (idx < 0)
|
|
21
|
+
throw new Error(`Invalid base58 character: ${ch}`);
|
|
22
|
+
num = num * 58n + BigInt(idx);
|
|
23
|
+
}
|
|
24
|
+
const hex = num.toString(16).padStart(2, "0");
|
|
25
|
+
// Ensure even length for byte parsing
|
|
26
|
+
const paddedHex = hex.length % 2 ? `0${hex}` : hex;
|
|
27
|
+
const dataBytes = new Uint8Array(paddedHex.length / 2);
|
|
28
|
+
for (let i = 0; i < dataBytes.length; i++)
|
|
29
|
+
dataBytes[i] = Number.parseInt(paddedHex.slice(i * 2, i * 2 + 2), 16);
|
|
30
|
+
const result = new Uint8Array(leadingZeros + dataBytes.length);
|
|
31
|
+
result.set(dataBytes, leadingZeros);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
function base58encode(data) {
|
|
35
|
+
let num = 0n;
|
|
36
|
+
for (const byte of data)
|
|
37
|
+
num = num * 256n + BigInt(byte);
|
|
38
|
+
let encoded = "";
|
|
39
|
+
while (num > 0n) {
|
|
40
|
+
encoded = BASE58_ALPHABET[Number(num % 58n)] + encoded;
|
|
41
|
+
num = num / 58n;
|
|
42
|
+
}
|
|
43
|
+
for (const byte of data) {
|
|
44
|
+
if (byte !== 0)
|
|
45
|
+
break;
|
|
46
|
+
encoded = `1${encoded}`;
|
|
47
|
+
}
|
|
48
|
+
return encoded;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Convert a Tron T... address to 0x hex (20 bytes, no 0x41 prefix).
|
|
52
|
+
* For feeding addresses to the EVM watcher JSON-RPC filters.
|
|
53
|
+
*/
|
|
54
|
+
export function tronToHex(tronAddr) {
|
|
55
|
+
if (!tronAddr.startsWith("T"))
|
|
56
|
+
throw new Error(`Not a Tron address: ${tronAddr}`);
|
|
57
|
+
const decoded = base58decode(tronAddr);
|
|
58
|
+
// decoded: [0x41, ...20 bytes address..., ...4 bytes checksum]
|
|
59
|
+
const payload = decoded.slice(0, 21);
|
|
60
|
+
const checksum = sha256(sha256(payload)).slice(0, 4);
|
|
61
|
+
for (let i = 0; i < 4; i++) {
|
|
62
|
+
if (decoded[21 + i] !== checksum[i])
|
|
63
|
+
throw new Error(`Invalid checksum for Tron address: ${tronAddr}`);
|
|
64
|
+
}
|
|
65
|
+
// Strip 0x41 prefix, return 20-byte hex with 0x prefix
|
|
66
|
+
const addrBytes = payload.slice(1);
|
|
67
|
+
return `0x${Array.from(addrBytes, (b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Convert a 0x hex address (20 bytes) back to Tron T... Base58Check.
|
|
71
|
+
* For converting watcher event addresses back to DB format.
|
|
72
|
+
*/
|
|
73
|
+
export function hexToTron(hexAddr) {
|
|
74
|
+
const hex = hexAddr.startsWith("0x") ? hexAddr.slice(2) : hexAddr;
|
|
75
|
+
if (hex.length !== 40)
|
|
76
|
+
throw new Error(`Invalid hex address length: ${hex.length}`);
|
|
77
|
+
// Build payload: 0x41 + 20 bytes
|
|
78
|
+
const payload = new Uint8Array(21);
|
|
79
|
+
payload[0] = 0x41;
|
|
80
|
+
for (let i = 0; i < 20; i++)
|
|
81
|
+
payload[i + 1] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
82
|
+
// Compute checksum
|
|
83
|
+
const checksum = sha256(sha256(payload)).slice(0, 4);
|
|
84
|
+
const full = new Uint8Array(25);
|
|
85
|
+
full.set(payload);
|
|
86
|
+
full.set(checksum, 21);
|
|
87
|
+
return base58encode(full);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if an address is a Tron T... address.
|
|
91
|
+
*/
|
|
92
|
+
export function isTronAddress(addr) {
|
|
93
|
+
return addr.startsWith("T") && addr.length >= 33 && addr.length <= 35;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=address-convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-convert.js","sourceRoot":"","sources":["../../src/tron/address-convert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { IAddressEncoder } from "@wopr-network/platform-core/crypto-plugin";
|
|
2
|
+
/**
|
|
3
|
+
* Encode a compressed public key as a Tron (keccak-b58check) address.
|
|
4
|
+
*
|
|
5
|
+
* Steps:
|
|
6
|
+
* 1. Decompress SEC1 compressed pubkey to 65-byte uncompressed
|
|
7
|
+
* 2. keccak256(uncompressed[1:]) — skip the 0x04 prefix
|
|
8
|
+
* 3. Take last 20 bytes as address
|
|
9
|
+
* 4. Prepend version byte (0x41 for Tron mainnet)
|
|
10
|
+
* 5. Append double-SHA-256 checksum (first 4 bytes)
|
|
11
|
+
* 6. Base58 encode
|
|
12
|
+
*/
|
|
13
|
+
export declare function encodeKeccakB58Address(publicKey: Uint8Array, versionByte: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Tron keccak-b58check address encoder.
|
|
16
|
+
* Implements IAddressEncoder for the tron plugin.
|
|
17
|
+
* Default version byte is 0x41 (65) for mainnet. Override with params.version.
|
|
18
|
+
*/
|
|
19
|
+
export declare const keccakB58Encoder: IAddressEncoder;
|
|
20
|
+
//# sourceMappingURL=encoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../src/tron/encoder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAgCjG;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAazF;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAQ9B,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { secp256k1 } from "@noble/curves/secp256k1.js";
|
|
2
|
+
import { keccak_256 } from "@noble/hashes/sha3.js";
|
|
3
|
+
import { sha256 } from "./sha256.js";
|
|
4
|
+
// secp256k1.Point exists at runtime but the ECDSA TS type doesn't expose it.
|
|
5
|
+
const Point = secp256k1.Point;
|
|
6
|
+
// ---------- Base58 encoding ----------
|
|
7
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
8
|
+
function base58encode(data) {
|
|
9
|
+
let num = 0n;
|
|
10
|
+
for (const byte of data)
|
|
11
|
+
num = num * 256n + BigInt(byte);
|
|
12
|
+
let encoded = "";
|
|
13
|
+
while (num > 0n) {
|
|
14
|
+
encoded = BASE58_ALPHABET[Number(num % 58n)] + encoded;
|
|
15
|
+
num = num / 58n;
|
|
16
|
+
}
|
|
17
|
+
for (const byte of data) {
|
|
18
|
+
if (byte !== 0)
|
|
19
|
+
break;
|
|
20
|
+
encoded = `1${encoded}`;
|
|
21
|
+
}
|
|
22
|
+
return encoded;
|
|
23
|
+
}
|
|
24
|
+
function toHex(bytes) {
|
|
25
|
+
return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
26
|
+
}
|
|
27
|
+
// ---------- Keccak-B58Check encoding ----------
|
|
28
|
+
/**
|
|
29
|
+
* Encode a compressed public key as a Tron (keccak-b58check) address.
|
|
30
|
+
*
|
|
31
|
+
* Steps:
|
|
32
|
+
* 1. Decompress SEC1 compressed pubkey to 65-byte uncompressed
|
|
33
|
+
* 2. keccak256(uncompressed[1:]) — skip the 0x04 prefix
|
|
34
|
+
* 3. Take last 20 bytes as address
|
|
35
|
+
* 4. Prepend version byte (0x41 for Tron mainnet)
|
|
36
|
+
* 5. Append double-SHA-256 checksum (first 4 bytes)
|
|
37
|
+
* 6. Base58 encode
|
|
38
|
+
*/
|
|
39
|
+
export function encodeKeccakB58Address(publicKey, versionByte) {
|
|
40
|
+
const hexKey = toHex(publicKey);
|
|
41
|
+
const uncompressed = Point.fromHex(hexKey).toBytes(false);
|
|
42
|
+
const hash = keccak_256(uncompressed.slice(1));
|
|
43
|
+
const addressBytes = hash.slice(-20);
|
|
44
|
+
const payload = new Uint8Array(21);
|
|
45
|
+
payload[0] = versionByte;
|
|
46
|
+
payload.set(addressBytes, 1);
|
|
47
|
+
const checksum = sha256(sha256(payload));
|
|
48
|
+
const full = new Uint8Array(25);
|
|
49
|
+
full.set(payload);
|
|
50
|
+
full.set(checksum.slice(0, 4), 21);
|
|
51
|
+
return base58encode(full);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Tron keccak-b58check address encoder.
|
|
55
|
+
* Implements IAddressEncoder for the tron plugin.
|
|
56
|
+
* Default version byte is 0x41 (65) for mainnet. Override with params.version.
|
|
57
|
+
*/
|
|
58
|
+
export const keccakB58Encoder = {
|
|
59
|
+
encode(publicKey, params) {
|
|
60
|
+
const versionByte = params.version ? Number(params.version) : 0x41;
|
|
61
|
+
return encodeKeccakB58Address(publicKey, versionByte);
|
|
62
|
+
},
|
|
63
|
+
encodingType() {
|
|
64
|
+
return "keccak-b58check";
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../src/tron/encoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,6EAA6E;AAC7E,MAAM,KAAK,GAAI,SAA+F,CAAC,KAAK,CAAC;AAErH,wCAAwC;AAExC,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,SAAS,KAAK,CAAC,KAAiB;IAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,KAA4B,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED,iDAAiD;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAqB,EAAE,WAAmB;IAChF,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1D,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,WAAW,CAAC;IACzB,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;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAChD,MAAM,CAAC,SAAqB,EAAE,MAAsB;QACnD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,OAAO,sBAAsB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IACD,YAAY;QACX,OAAO,iBAAiB,CAAC;IAC1B,CAAC;CACD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IChainPlugin } from "@wopr-network/platform-core/crypto-plugin";
|
|
2
|
+
export { hexToTron, isTronAddress, tronToHex } from "./address-convert.js";
|
|
3
|
+
export { encodeKeccakB58Address, keccakB58Encoder } from "./encoder.js";
|
|
4
|
+
export { TronEvmWatcher } from "./watcher.js";
|
|
5
|
+
export declare const tronPlugin: IChainPlugin;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|