@tradestack/paymaster 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +276 -0
- package/dist/backend/config/chains.d.ts +18 -0
- package/dist/backend/config/chains.d.ts.map +1 -0
- package/dist/backend/config/chains.js +45 -0
- package/dist/backend/config/chains.js.map +1 -0
- package/dist/backend/config/constants.d.ts +58 -0
- package/dist/backend/config/constants.d.ts.map +1 -0
- package/dist/backend/config/constants.js +165 -0
- package/dist/backend/config/constants.js.map +1 -0
- package/dist/backend/config/db.context.d.ts +5 -0
- package/dist/backend/config/db.context.d.ts.map +1 -0
- package/dist/backend/config/db.context.js +63 -0
- package/dist/backend/config/db.context.js.map +1 -0
- package/dist/backend/config/db.d.ts +5 -0
- package/dist/backend/config/db.d.ts.map +1 -0
- package/dist/backend/config/db.js +35 -0
- package/dist/backend/config/db.js.map +1 -0
- package/dist/backend/config/index.d.ts +16 -0
- package/dist/backend/config/index.d.ts.map +1 -0
- package/dist/backend/config/index.js +44 -0
- package/dist/backend/config/index.js.map +1 -0
- package/dist/backend/contract/abi/ERC20Abi.json +413 -0
- package/dist/backend/contract/abi/HalalPaymasterAbi.json +544 -0
- package/dist/backend/contract/abi/entryPointAbi.json +166 -0
- package/dist/backend/contract/constant.d.ts +4 -0
- package/dist/backend/contract/constant.d.ts.map +1 -0
- package/dist/backend/contract/constant.js +7 -0
- package/dist/backend/contract/constant.js.map +1 -0
- package/dist/backend/contract/contract.d.ts +11 -0
- package/dist/backend/contract/contract.d.ts.map +1 -0
- package/dist/backend/contract/contract.js +34 -0
- package/dist/backend/contract/contract.js.map +1 -0
- package/dist/backend/helper/hotwallet.d.ts +4 -0
- package/dist/backend/helper/hotwallet.d.ts.map +1 -0
- package/dist/backend/helper/hotwallet.js +25 -0
- package/dist/backend/helper/hotwallet.js.map +1 -0
- package/dist/backend/services/chains/evm.service.d.ts +5760 -0
- package/dist/backend/services/chains/evm.service.d.ts.map +1 -0
- package/dist/backend/services/chains/evm.service.js +263 -0
- package/dist/backend/services/chains/evm.service.js.map +1 -0
- package/dist/backend/services/chains/solana.service.d.ts +15 -0
- package/dist/backend/services/chains/solana.service.d.ts.map +1 -0
- package/dist/backend/services/chains/solana.service.js +192 -0
- package/dist/backend/services/chains/solana.service.js.map +1 -0
- package/dist/backend/services/chains/tron.service.d.ts +14 -0
- package/dist/backend/services/chains/tron.service.d.ts.map +1 -0
- package/dist/backend/services/chains/tron.service.js +255 -0
- package/dist/backend/services/chains/tron.service.js.map +1 -0
- package/dist/backend/services/paymaster.service.d.ts +3 -0
- package/dist/backend/services/paymaster.service.d.ts.map +1 -0
- package/dist/backend/services/paymaster.service.js +55 -0
- package/dist/backend/services/paymaster.service.js.map +1 -0
- package/dist/backend/services/sweep.service.d.ts +14 -0
- package/dist/backend/services/sweep.service.d.ts.map +1 -0
- package/dist/backend/services/sweep.service.js +103 -0
- package/dist/backend/services/sweep.service.js.map +1 -0
- package/dist/backend/services/sweep.worker.d.ts +11 -0
- package/dist/backend/services/sweep.worker.d.ts.map +1 -0
- package/dist/backend/services/sweep.worker.js +163 -0
- package/dist/backend/services/sweep.worker.js.map +1 -0
- package/dist/backend/services/sweeper/evm.sweep.service.d.ts +13 -0
- package/dist/backend/services/sweeper/evm.sweep.service.d.ts.map +1 -0
- package/dist/backend/services/sweeper/evm.sweep.service.js +61 -0
- package/dist/backend/services/sweeper/evm.sweep.service.js.map +1 -0
- package/dist/backend/services/sweeper/solana.sweep.service.d.ts +13 -0
- package/dist/backend/services/sweeper/solana.sweep.service.d.ts.map +1 -0
- package/dist/backend/services/sweeper/solana.sweep.service.js +45 -0
- package/dist/backend/services/sweeper/solana.sweep.service.js.map +1 -0
- package/dist/backend/services/sweeper/tron.sweep.service.d.ts +13 -0
- package/dist/backend/services/sweeper/tron.sweep.service.d.ts.map +1 -0
- package/dist/backend/services/sweeper/tron.sweep.service.js +45 -0
- package/dist/backend/services/sweeper/tron.sweep.service.js.map +1 -0
- package/dist/sdk/db/adapter.d.ts +25 -0
- package/dist/sdk/db/adapter.d.ts.map +1 -0
- package/dist/sdk/db/adapter.js +145 -0
- package/dist/sdk/db/adapter.js.map +1 -0
- package/dist/sdk/index.d.ts +27 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +274 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/types.d.ts +66 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk/types.js +3 -0
- package/dist/sdk/types.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSweepCycle = exports.stopAllSweepWorkers = exports.stopSweepWorker = exports.startSweepWorker = void 0;
|
|
4
|
+
const sweep_service_1 = require("./sweep.service");
|
|
5
|
+
const constants_1 = require("../config/constants");
|
|
6
|
+
const activeWorkers = new Map();
|
|
7
|
+
const startSweepWorker = (chainConfig, callbacks) => {
|
|
8
|
+
const chainKey = chainConfig.chainKey;
|
|
9
|
+
if (activeWorkers.has(chainKey)) {
|
|
10
|
+
console.log(`[${chainConfig.name}] Sweep worker already running`);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
console.log(`Sweep worker started for ${chainConfig.name}: checking every ${constants_1.SWEEP_INTERVAL_MS / 1000}s`);
|
|
14
|
+
const interval = setInterval(async () => {
|
|
15
|
+
await (0, exports.runSweepCycle)(chainConfig, callbacks);
|
|
16
|
+
}, constants_1.SWEEP_INTERVAL_MS);
|
|
17
|
+
(0, exports.runSweepCycle)(chainConfig, callbacks);
|
|
18
|
+
const stop = () => {
|
|
19
|
+
clearInterval(interval);
|
|
20
|
+
activeWorkers.delete(chainKey);
|
|
21
|
+
console.log(`Sweep worker stopped for ${chainConfig.name}`);
|
|
22
|
+
};
|
|
23
|
+
activeWorkers.set(chainKey, stop);
|
|
24
|
+
return stop;
|
|
25
|
+
};
|
|
26
|
+
exports.startSweepWorker = startSweepWorker;
|
|
27
|
+
const stopSweepWorker = () => {
|
|
28
|
+
for (const stop of activeWorkers.values()) {
|
|
29
|
+
stop();
|
|
30
|
+
}
|
|
31
|
+
activeWorkers.clear();
|
|
32
|
+
console.log("All sweep workers stopped");
|
|
33
|
+
};
|
|
34
|
+
exports.stopSweepWorker = stopSweepWorker;
|
|
35
|
+
exports.stopAllSweepWorkers = exports.stopSweepWorker;
|
|
36
|
+
const runSweepCycle = async (chainConfig, callbacks) => {
|
|
37
|
+
console.log(`[${chainConfig.name}] Running sweep cycle at ${new Date().toISOString()}`);
|
|
38
|
+
try {
|
|
39
|
+
const wallets = await (0, sweep_service_1.getAllWallets)(chainConfig.chainType);
|
|
40
|
+
console.log(`[${chainConfig.name}] Found ${wallets.length} wallets for chain type: ${chainConfig.chainType}`);
|
|
41
|
+
if (wallets.length === 0) {
|
|
42
|
+
console.log(`[${chainConfig.name}] No active wallets found`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
console.log(`[${chainConfig.name}] Checking ${wallets.length} wallets sequentially`);
|
|
46
|
+
for (const walletAddress of wallets) {
|
|
47
|
+
try {
|
|
48
|
+
console.log(`[${chainConfig.name}] Processing wallet: ${walletAddress}`);
|
|
49
|
+
console.log(`[${chainConfig.name}] Checking tokens above threshold...`);
|
|
50
|
+
const tokensToSweep = await (0, sweep_service_1.getTokensAboveThreshold)(walletAddress, chainConfig);
|
|
51
|
+
console.log(`[${chainConfig.name}] Tokens to sweep: ${JSON.stringify(tokensToSweep)}`);
|
|
52
|
+
for (const token of tokensToSweep) {
|
|
53
|
+
await sweepWithRetry(walletAddress, chainConfig, token, callbacks);
|
|
54
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
55
|
+
}
|
|
56
|
+
console.log(`[${chainConfig.name}] Checking native asset...`);
|
|
57
|
+
const hasNative = await (0, sweep_service_1.isNativeAboveThreshold)(walletAddress, chainConfig);
|
|
58
|
+
console.log(`[${chainConfig.name}] Has native above threshold: ${hasNative}`);
|
|
59
|
+
if (hasNative) {
|
|
60
|
+
await sweepNativeWithRetry(walletAddress, chainConfig, callbacks);
|
|
61
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error(`[${chainConfig.name}] Error processing wallet ${walletAddress}:`, err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
console.log(`[${chainConfig.name}] Sweep cycle complete`);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
console.error(`[${chainConfig.name}] Sweep cycle error:`, err);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
exports.runSweepCycle = runSweepCycle;
|
|
75
|
+
const sweepWithRetry = async (walletAddress, chainConfig, token, callbacks, maxRetries = 3, attempt = 1) => {
|
|
76
|
+
try {
|
|
77
|
+
const result = await (0, sweep_service_1.triggerTokenSweep)(walletAddress, chainConfig, token);
|
|
78
|
+
if (result.txHash === "")
|
|
79
|
+
return;
|
|
80
|
+
console.log(`[${chainConfig.name}] Sweep successful for ${walletAddress} (${token})`);
|
|
81
|
+
// fire callback
|
|
82
|
+
if (callbacks?.onSweepComplete) {
|
|
83
|
+
await callbacks.onSweepComplete({
|
|
84
|
+
address: walletAddress,
|
|
85
|
+
chain: chainConfig.chainKey,
|
|
86
|
+
token,
|
|
87
|
+
amount: result.amount,
|
|
88
|
+
txHash: result.txHash,
|
|
89
|
+
timestamp: new Date(),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
if (attempt < maxRetries) {
|
|
95
|
+
const delay = attempt * 2000;
|
|
96
|
+
console.warn(`[${chainConfig.name}] Sweep failed for ${walletAddress} (${token}) — retry ${attempt}/${maxRetries} in ${delay}ms`);
|
|
97
|
+
console.log("Error while sweeping:", err);
|
|
98
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
99
|
+
await sweepWithRetry(walletAddress, chainConfig, token, callbacks, maxRetries, attempt + 1);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.error(`[${chainConfig.name}] Sweep failed for ${walletAddress} (${token}) after ${maxRetries} attempts:`, err);
|
|
103
|
+
// fire failed callback
|
|
104
|
+
if (callbacks?.onSweepFailed) {
|
|
105
|
+
await callbacks.onSweepFailed({
|
|
106
|
+
address: walletAddress,
|
|
107
|
+
chain: chainConfig.chainKey,
|
|
108
|
+
token,
|
|
109
|
+
error: err instanceof Error ? err.message : "Unknown error",
|
|
110
|
+
timestamp: new Date(),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const sweepNativeWithRetry = async (walletAddress, chainConfig, callbacks, maxRetries = 3, attempt = 1) => {
|
|
117
|
+
try {
|
|
118
|
+
const result = await (0, sweep_service_1.triggerNativeSweep)(walletAddress, chainConfig);
|
|
119
|
+
if (result.txHash === "")
|
|
120
|
+
return;
|
|
121
|
+
console.log(`[${chainConfig.name}] Native sweep successful for ${walletAddress}`);
|
|
122
|
+
if (callbacks?.onSweepComplete) {
|
|
123
|
+
await callbacks.onSweepComplete({
|
|
124
|
+
address: walletAddress,
|
|
125
|
+
chain: chainConfig.chainKey,
|
|
126
|
+
token: chainConfig.chainType === "evm"
|
|
127
|
+
? "ETH"
|
|
128
|
+
: chainConfig.chainType === "solana"
|
|
129
|
+
? "SOL"
|
|
130
|
+
: "TRX",
|
|
131
|
+
amount: result.amount,
|
|
132
|
+
txHash: result.txHash,
|
|
133
|
+
timestamp: new Date(),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
if (attempt < maxRetries) {
|
|
139
|
+
const delay = attempt * 2000;
|
|
140
|
+
console.warn(`[${chainConfig.name}] Native sweep failed for ${walletAddress} — retry ${attempt}/${maxRetries} in ${delay}ms`);
|
|
141
|
+
console.log("Error while sweeping native:", err);
|
|
142
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
143
|
+
await sweepNativeWithRetry(walletAddress, chainConfig, callbacks, maxRetries, attempt + 1);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
console.error(`[${chainConfig.name}] Native sweep failed for ${walletAddress} after ${maxRetries} attempts:`, err);
|
|
147
|
+
if (callbacks?.onSweepFailed) {
|
|
148
|
+
await callbacks.onSweepFailed({
|
|
149
|
+
address: walletAddress,
|
|
150
|
+
chain: chainConfig.chainKey,
|
|
151
|
+
token: chainConfig.chainType === "evm"
|
|
152
|
+
? "ETH"
|
|
153
|
+
: chainConfig.chainType === "solana"
|
|
154
|
+
? "SOL"
|
|
155
|
+
: "TRX",
|
|
156
|
+
error: err instanceof Error ? err.message : "Unknown error",
|
|
157
|
+
timestamp: new Date(),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=sweep.worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.worker.js","sourceRoot":"","sources":["../../../../src/backend/services/sweep.worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EVMChainConfig } from "../../config/chains";
|
|
2
|
+
import { TokenKey } from "../../config/constants";
|
|
3
|
+
export declare const triggerEVMTokenSweep: (walletAddress: string, chainConfig: EVMChainConfig, token: TokenKey) => Promise<{
|
|
4
|
+
txHash: string;
|
|
5
|
+
amount: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const triggerEVMETHSweep: (walletAddress: string, chainConfig: EVMChainConfig) => Promise<{
|
|
8
|
+
txHash: string;
|
|
9
|
+
amount: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const getEVMTokensAboveThreshold: (walletAddress: string, chainConfig: EVMChainConfig) => Promise<TokenKey[]>;
|
|
12
|
+
export declare const isEVMETHAboveThreshold: (walletAddress: string, chainConfig: EVMChainConfig) => Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=evm.sweep.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.sweep.service.d.ts","sourceRoot":"","sources":["../../../../../src/backend/services/sweeper/evm.sweep.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,QAAQ,EAGT,MAAM,wBAAwB,CAAC;AAehC,eAAO,MAAM,oBAAoB,GAC/B,eAAe,MAAM,EACrB,aAAa,cAAc,EAC3B,OAAO,QAAQ,KACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,eAAe,MAAM,EACrB,aAAa,cAAc,KAC1B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE5C,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,eAAe,MAAM,EACrB,aAAa,cAAc,KAC1B,OAAO,CAAC,QAAQ,EAAE,CA6BpB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,eAAe,MAAM,EACrB,aAAa,cAAc,KAC1B,OAAO,CAAC,OAAO,CAejB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isEVMETHAboveThreshold = exports.getEVMTokensAboveThreshold = exports.triggerEVMETHSweep = exports.triggerEVMTokenSweep = void 0;
|
|
4
|
+
const evm_service_1 = require("./../chains/evm.service");
|
|
5
|
+
const viem_1 = require("viem");
|
|
6
|
+
const constants_1 = require("../../config/constants");
|
|
7
|
+
const constant_1 = require("../../contract/constant");
|
|
8
|
+
const TOKEN_ABI = (0, viem_1.parseAbi)([
|
|
9
|
+
"function balanceOf(address owner) view returns (uint256)",
|
|
10
|
+
]);
|
|
11
|
+
const SWEEP_THRESHOLD = BigInt(Math.floor(constants_1.SWEEP_THRESHOLD_USD * 10 ** constant_1.USDC_DECIMAL));
|
|
12
|
+
const ETH_SWEEP_THRESHOLD = (0, viem_1.parseEther)(constants_1.ETH_MIN_SWEEP_THRESHOLD);
|
|
13
|
+
const SUPPORTED_EVM_TOKENS = ["USDC", "USDT"];
|
|
14
|
+
const triggerEVMTokenSweep = async (walletAddress, chainConfig, token) => {
|
|
15
|
+
return await (0, evm_service_1.sweepERC20)(walletAddress, chainConfig, token);
|
|
16
|
+
};
|
|
17
|
+
exports.triggerEVMTokenSweep = triggerEVMTokenSweep;
|
|
18
|
+
const triggerEVMETHSweep = async (walletAddress, chainConfig) => {
|
|
19
|
+
return await (0, evm_service_1.sweepNativeETH)(walletAddress, chainConfig);
|
|
20
|
+
};
|
|
21
|
+
exports.triggerEVMETHSweep = triggerEVMETHSweep;
|
|
22
|
+
const getEVMTokensAboveThreshold = async (walletAddress, chainConfig) => {
|
|
23
|
+
const publicClient = (0, evm_service_1.getPublicClient)(chainConfig);
|
|
24
|
+
const tokensAboveThreshold = [];
|
|
25
|
+
for (const token of SUPPORTED_EVM_TOKENS) {
|
|
26
|
+
const tokenAddress = chainConfig.tokens[token];
|
|
27
|
+
if (!tokenAddress || tokenAddress.includes("DUMMY"))
|
|
28
|
+
continue;
|
|
29
|
+
try {
|
|
30
|
+
const balance = await publicClient.readContract({
|
|
31
|
+
address: tokenAddress,
|
|
32
|
+
abi: TOKEN_ABI,
|
|
33
|
+
functionName: "balanceOf",
|
|
34
|
+
args: [walletAddress],
|
|
35
|
+
});
|
|
36
|
+
if (balance >= SWEEP_THRESHOLD) {
|
|
37
|
+
tokensAboveThreshold.push(token);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.error(`[${chainConfig.name}] Error checking ${token} balance for ${walletAddress}:`, err);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return tokensAboveThreshold;
|
|
45
|
+
};
|
|
46
|
+
exports.getEVMTokensAboveThreshold = getEVMTokensAboveThreshold;
|
|
47
|
+
const isEVMETHAboveThreshold = async (walletAddress, chainConfig) => {
|
|
48
|
+
const publicClient = (0, evm_service_1.getPublicClient)(chainConfig);
|
|
49
|
+
try {
|
|
50
|
+
const balance = await publicClient.getBalance({
|
|
51
|
+
address: walletAddress,
|
|
52
|
+
});
|
|
53
|
+
return balance >= ETH_SWEEP_THRESHOLD;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error(`[${chainConfig.name}] Error checking ETH balance for ${walletAddress}:`, err);
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.isEVMETHAboveThreshold = isEVMETHAboveThreshold;
|
|
61
|
+
//# sourceMappingURL=evm.sweep.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.sweep.service.js","sourceRoot":"","sources":["../../../../../src/backend/services/sweeper/evm.sweep.service.ts"],"names":[],"mappings":";;;AAAA,yDAIiC;AACjC,+BAA4C;AAE5C,sDAIgC;AAChC,sDAAuD;AAEvD,MAAM,SAAS,GAAG,IAAA,eAAQ,EAAC;IACzB,0DAA0D;CAC3D,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,MAAM,CAC5B,IAAI,CAAC,KAAK,CAAC,+BAAmB,GAAG,EAAE,IAAI,uBAAY,CAAC,CACrD,CAAC;AAEF,MAAM,mBAAmB,GAAG,IAAA,iBAAU,EAAC,mCAAuB,CAAC,CAAC;AAEhE,MAAM,oBAAoB,GAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD,MAAM,oBAAoB,GAAG,KAAK,EACvC,aAAqB,EACrB,WAA2B,EAC3B,KAAe,EAC8B,EAAE;IAC/C,OAAO,MAAM,IAAA,wBAAU,EAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC,CAAC;AANW,QAAA,oBAAoB,wBAM/B;AAEK,MAAM,kBAAkB,GAAG,KAAK,EACrC,aAAqB,EACrB,WAA2B,EACkB,EAAE;IAC/C,OAAO,MAAM,IAAA,4BAAc,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAC1D,CAAC,CAAC;AALW,QAAA,kBAAkB,sBAK7B;AAEK,MAAM,0BAA0B,GAAG,KAAK,EAC7C,aAAqB,EACrB,WAA2B,EACN,EAAE;IACvB,MAAM,YAAY,GAAG,IAAA,6BAAe,EAAC,WAAW,CAAC,CAAC;IAClD,MAAM,oBAAoB,GAAe,EAAE,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,oBAAoB,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE/C,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QAE9D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;gBAC9C,OAAO,EAAE,YAA6B;gBACtC,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,WAAW;gBACzB,IAAI,EAAE,CAAC,aAA8B,CAAC;aACvC,CAAC,CAAC;YAEH,IAAI,OAAO,IAAI,eAAe,EAAE,CAAC;gBAC/B,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,IAAI,WAAW,CAAC,IAAI,oBAAoB,KAAK,gBAAgB,aAAa,GAAG,EAC7E,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC;AAhCW,QAAA,0BAA0B,8BAgCrC;AAEK,MAAM,sBAAsB,GAAG,KAAK,EACzC,aAAqB,EACrB,WAA2B,EACT,EAAE;IACpB,MAAM,YAAY,GAAG,IAAA,6BAAe,EAAC,WAAW,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC;YAC5C,OAAO,EAAE,aAA8B;SACxC,CAAC,CAAC;QACH,OAAO,OAAO,IAAI,mBAAmB,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,IAAI,WAAW,CAAC,IAAI,oCAAoC,aAAa,GAAG,EACxE,GAAG,CACJ,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAlBW,QAAA,sBAAsB,0BAkBjC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SolanaChainConfig } from "../../config/chains";
|
|
2
|
+
import { TokenKey } from "../../config/constants";
|
|
3
|
+
export declare const triggerSolanaTokenSweep: (walletAddress: string, chainConfig: SolanaChainConfig, token: TokenKey) => Promise<{
|
|
4
|
+
txHash: string;
|
|
5
|
+
amount: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const triggerSOLSweep: (walletAddress: string, chainConfig: SolanaChainConfig) => Promise<{
|
|
8
|
+
txHash: string;
|
|
9
|
+
amount: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const getSolanaTokensAboveThreshold: (walletAddress: string, chainConfig: SolanaChainConfig) => Promise<TokenKey[]>;
|
|
12
|
+
export declare const isSOLAboveThreshold: (walletAddress: string, chainConfig: SolanaChainConfig) => Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=solana.sweep.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.sweep.service.d.ts","sourceRoot":"","sources":["../../../../../src/backend/services/sweeper/solana.sweep.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,QAAQ,EAGT,MAAM,wBAAwB,CAAC;AAKhC,eAAO,MAAM,uBAAuB,GAClC,eAAe,MAAM,EACrB,aAAa,iBAAiB,EAC9B,OAAO,QAAQ,KACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE5C,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,eAAe,MAAM,EACrB,aAAa,iBAAiB,KAC7B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE5C,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,eAAe,MAAM,EACrB,aAAa,iBAAiB,KAC7B,OAAO,CAAC,QAAQ,EAAE,CAoBpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,MAAM,EACrB,aAAa,iBAAiB,KAC7B,OAAO,CAAC,OAAO,CAWjB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSOLAboveThreshold = exports.getSolanaTokensAboveThreshold = exports.triggerSOLSweep = exports.triggerSolanaTokenSweep = void 0;
|
|
4
|
+
const solana_service_1 = require("../chains/solana.service");
|
|
5
|
+
const constants_1 = require("../../config/constants");
|
|
6
|
+
const SUPPORTED_SOLANA_TOKENS = ["USDC", "USDT"];
|
|
7
|
+
const SPL_SWEEP_THRESHOLD = BigInt(Math.floor(constants_1.SWEEP_THRESHOLD_USD * 1000000));
|
|
8
|
+
const triggerSolanaTokenSweep = async (walletAddress, chainConfig, token) => {
|
|
9
|
+
return await (0, solana_service_1.sweepSPLToken)(walletAddress, chainConfig, token);
|
|
10
|
+
};
|
|
11
|
+
exports.triggerSolanaTokenSweep = triggerSolanaTokenSweep;
|
|
12
|
+
const triggerSOLSweep = async (walletAddress, chainConfig) => {
|
|
13
|
+
return await (0, solana_service_1.sweepNativeSOL)(walletAddress, chainConfig);
|
|
14
|
+
};
|
|
15
|
+
exports.triggerSOLSweep = triggerSOLSweep;
|
|
16
|
+
const getSolanaTokensAboveThreshold = async (walletAddress, chainConfig) => {
|
|
17
|
+
const tokensAboveThreshold = [];
|
|
18
|
+
for (const token of SUPPORTED_SOLANA_TOKENS) {
|
|
19
|
+
if (!chainConfig.tokens[token])
|
|
20
|
+
continue;
|
|
21
|
+
try {
|
|
22
|
+
const balance = await (0, solana_service_1.getSPLBalance)(walletAddress, chainConfig, token);
|
|
23
|
+
if (balance >= SPL_SWEEP_THRESHOLD) {
|
|
24
|
+
tokensAboveThreshold.push(token);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.error(`[${chainConfig.name}] Error checking ${token} balance for ${walletAddress}:`, err);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return tokensAboveThreshold;
|
|
32
|
+
};
|
|
33
|
+
exports.getSolanaTokensAboveThreshold = getSolanaTokensAboveThreshold;
|
|
34
|
+
const isSOLAboveThreshold = async (walletAddress, chainConfig) => {
|
|
35
|
+
try {
|
|
36
|
+
const balance = await (0, solana_service_1.getNativeSOLBalance)(walletAddress, chainConfig);
|
|
37
|
+
return balance >= constants_1.SOL_MIN_SWEEP_THRESHOLD;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error(`[${chainConfig.name}] Error checking SOL balance for ${walletAddress}:`, err);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
exports.isSOLAboveThreshold = isSOLAboveThreshold;
|
|
45
|
+
//# sourceMappingURL=solana.sweep.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana.sweep.service.js","sourceRoot":"","sources":["../../../../../src/backend/services/sweeper/solana.sweep.service.ts"],"names":[],"mappings":";;;AAAA,6DAKkC;AAElC,sDAIgC;AAEhC,MAAM,uBAAuB,GAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7D,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,+BAAmB,GAAG,OAAS,CAAC,CAAC,CAAC;AAEzE,MAAM,uBAAuB,GAAG,KAAK,EAC1C,aAAqB,EACrB,WAA8B,EAC9B,KAAe,EAC8B,EAAE;IAC/C,OAAO,MAAM,IAAA,8BAAa,EAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC,CAAC;AANW,QAAA,uBAAuB,2BAMlC;AAEK,MAAM,eAAe,GAAG,KAAK,EAClC,aAAqB,EACrB,WAA8B,EACe,EAAE;IAC/C,OAAO,MAAM,IAAA,+BAAc,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAC1D,CAAC,CAAC;AALW,QAAA,eAAe,mBAK1B;AAEK,MAAM,6BAA6B,GAAG,KAAK,EAChD,aAAqB,EACrB,WAA8B,EACT,EAAE;IACvB,MAAM,oBAAoB,GAAe,EAAE,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,uBAAuB,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,SAAS;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAa,EAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACvE,IAAI,OAAO,IAAI,mBAAmB,EAAE,CAAC;gBACnC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,IAAI,WAAW,CAAC,IAAI,oBAAoB,KAAK,gBAAgB,aAAa,GAAG,EAC7E,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC;AAvBW,QAAA,6BAA6B,iCAuBxC;AAEK,MAAM,mBAAmB,GAAG,KAAK,EACtC,aAAqB,EACrB,WAA8B,EACZ,EAAE;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,oCAAmB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACtE,OAAO,OAAO,IAAI,mCAAuB,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,IAAI,WAAW,CAAC,IAAI,oCAAoC,aAAa,GAAG,EACxE,GAAG,CACJ,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAdW,QAAA,mBAAmB,uBAc9B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { TronChainConfig } from "../../config/chains";
|
|
2
|
+
import { TokenKey } from "../../config/constants";
|
|
3
|
+
export declare const triggerTronTokenSweep: (walletAddress: string, chainConfig: TronChainConfig, token: TokenKey) => Promise<{
|
|
4
|
+
txHash: string;
|
|
5
|
+
amount: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const triggerTRXSweep: (walletAddress: string, chainConfig: TronChainConfig) => Promise<{
|
|
8
|
+
txHash: string;
|
|
9
|
+
amount: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const getTronTokensAboveThreshold: (walletAddress: string, chainConfig: TronChainConfig) => Promise<TokenKey[]>;
|
|
12
|
+
export declare const isTRXAboveThreshold: (walletAddress: string, chainConfig: TronChainConfig) => Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=tron.sweep.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tron.sweep.service.d.ts","sourceRoot":"","sources":["../../../../../src/backend/services/sweeper/tron.sweep.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EACL,QAAQ,EAGT,MAAM,wBAAwB,CAAC;AAOhC,eAAO,MAAM,qBAAqB,GAChC,eAAe,MAAM,EACrB,aAAa,eAAe,EAC5B,OAAO,QAAQ,KACd,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE5C,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,eAAe,MAAM,EACrB,aAAa,eAAe,KAC3B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAE5C,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,eAAe,MAAM,EACrB,aAAa,eAAe,KAC3B,OAAO,CAAC,QAAQ,EAAE,CAoBpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,MAAM,EACrB,aAAa,eAAe,KAC3B,OAAO,CAAC,OAAO,CAWjB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTRXAboveThreshold = exports.getTronTokensAboveThreshold = exports.triggerTRXSweep = exports.triggerTronTokenSweep = void 0;
|
|
4
|
+
const tron_service_1 = require("../chains/tron.service");
|
|
5
|
+
const constants_1 = require("../../config/constants");
|
|
6
|
+
const SUPPORTED_TRON_TOKENS = ["USDC", "USDT"];
|
|
7
|
+
const TRC20_SWEEP_THRESHOLD = BigInt(Math.floor(constants_1.SWEEP_THRESHOLD_USD * 1000000));
|
|
8
|
+
const triggerTronTokenSweep = async (walletAddress, chainConfig, token) => {
|
|
9
|
+
return await (0, tron_service_1.sweepTRC20)(walletAddress, chainConfig, token);
|
|
10
|
+
};
|
|
11
|
+
exports.triggerTronTokenSweep = triggerTronTokenSweep;
|
|
12
|
+
const triggerTRXSweep = async (walletAddress, chainConfig) => {
|
|
13
|
+
return await (0, tron_service_1.sweepNativeTRX)(walletAddress, chainConfig);
|
|
14
|
+
};
|
|
15
|
+
exports.triggerTRXSweep = triggerTRXSweep;
|
|
16
|
+
const getTronTokensAboveThreshold = async (walletAddress, chainConfig) => {
|
|
17
|
+
const tokensAboveThreshold = [];
|
|
18
|
+
for (const token of SUPPORTED_TRON_TOKENS) {
|
|
19
|
+
if (!chainConfig.tokens[token])
|
|
20
|
+
continue;
|
|
21
|
+
try {
|
|
22
|
+
const balance = await (0, tron_service_1.getTRC20Balance)(walletAddress, chainConfig, token);
|
|
23
|
+
if (balance >= TRC20_SWEEP_THRESHOLD) {
|
|
24
|
+
tokensAboveThreshold.push(token);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.error(`[${chainConfig.name}] Error checking ${token} balance for ${walletAddress}:`, err);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return tokensAboveThreshold;
|
|
32
|
+
};
|
|
33
|
+
exports.getTronTokensAboveThreshold = getTronTokensAboveThreshold;
|
|
34
|
+
const isTRXAboveThreshold = async (walletAddress, chainConfig) => {
|
|
35
|
+
try {
|
|
36
|
+
const balance = await (0, tron_service_1.getTRXBalance)(walletAddress, chainConfig);
|
|
37
|
+
return balance >= constants_1.TRX_MIN_SWEEP_THRESHOLD;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error(`[${chainConfig.name}] Error checking TRX balance for ${walletAddress}:`, err);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
exports.isTRXAboveThreshold = isTRXAboveThreshold;
|
|
45
|
+
//# sourceMappingURL=tron.sweep.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tron.sweep.service.js","sourceRoot":"","sources":["../../../../../src/backend/services/sweeper/tron.sweep.service.ts"],"names":[],"mappings":";;;AAAA,yDAKgC;AAEhC,sDAIgC;AAEhC,MAAM,qBAAqB,GAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC3D,MAAM,qBAAqB,GAAG,MAAM,CAClC,IAAI,CAAC,KAAK,CAAC,+BAAmB,GAAG,OAAS,CAAC,CAC5C,CAAC;AAEK,MAAM,qBAAqB,GAAG,KAAK,EACxC,aAAqB,EACrB,WAA4B,EAC5B,KAAe,EAC8B,EAAE;IAC/C,OAAO,MAAM,IAAA,yBAAU,EAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC;AAEK,MAAM,eAAe,GAAG,KAAK,EAClC,aAAqB,EACrB,WAA4B,EACiB,EAAE;IAC/C,OAAO,MAAM,IAAA,6BAAc,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;AAC1D,CAAC,CAAC;AALW,QAAA,eAAe,mBAK1B;AAEK,MAAM,2BAA2B,GAAG,KAAK,EAC9C,aAAqB,EACrB,WAA4B,EACP,EAAE;IACvB,MAAM,oBAAoB,GAAe,EAAE,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,qBAAqB,EAAE,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,SAAS;QAEzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAe,EAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YACzE,IAAI,OAAO,IAAI,qBAAqB,EAAE,CAAC;gBACrC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,IAAI,WAAW,CAAC,IAAI,oBAAoB,KAAK,gBAAgB,aAAa,GAAG,EAC7E,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC;AAvBW,QAAA,2BAA2B,+BAuBtC;AAEK,MAAM,mBAAmB,GAAG,KAAK,EACtC,aAAqB,EACrB,WAA4B,EACV,EAAE;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,4BAAa,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAChE,OAAO,OAAO,IAAI,mCAAuB,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,IAAI,WAAW,CAAC,IAAI,oCAAoC,aAAa,GAAG,EACxE,GAAG,CACJ,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAdW,QAAA,mBAAmB,uBAc9B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TableConfig } from "../types";
|
|
2
|
+
export interface WalletRow {
|
|
3
|
+
address: string;
|
|
4
|
+
chain: string;
|
|
5
|
+
hd_index: number;
|
|
6
|
+
is_active: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class DBAdapter {
|
|
9
|
+
private dbType;
|
|
10
|
+
private databaseUrl;
|
|
11
|
+
private pool;
|
|
12
|
+
private walletTable;
|
|
13
|
+
private sweepHistoryTable;
|
|
14
|
+
constructor(databaseUrl: string, dbType: "mysql" | "postgresql", tableConfig?: TableConfig);
|
|
15
|
+
connect(): Promise<void>;
|
|
16
|
+
disconnect(): Promise<void>;
|
|
17
|
+
query<T>(sql: string, params?: any[]): Promise<T[]>;
|
|
18
|
+
private quoteIdentifier;
|
|
19
|
+
getWalletsByChainType(chainType: string): Promise<WalletRow[]>;
|
|
20
|
+
getWalletByAddress(address: string): Promise<WalletRow | null>;
|
|
21
|
+
recordSweepSuccess(walletAddress: string, chainId: string, token: string, amount: string, txHash: string): Promise<void>;
|
|
22
|
+
recordSweepFailure(walletAddress: string, chainId: string, token: string, error: string): Promise<void>;
|
|
23
|
+
getSweepHistory(address: string): Promise<unknown[]>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/sdk/db/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,UAAU,CAAC;AAe1D,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,iBAAiB,CAAwB;gBAG/C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,GAAG,YAAY,EAC9B,WAAW,CAAC,EAAE,WAAW;IAiBrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAYxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAapE,OAAO,CAAC,eAAe;IAQjB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAwB9D,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAyB9D,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAUV,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAUV,eAAe,CAAC,OAAO,EAAE,MAAM;CAUtC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DBAdapter = void 0;
|
|
37
|
+
// ─── Default Table Config ─────────────────────────────────────────────────────
|
|
38
|
+
const DEFAULT_WALLET_TABLE = {
|
|
39
|
+
tableName: "wallets",
|
|
40
|
+
addressColumn: "address",
|
|
41
|
+
chainColumn: "chain",
|
|
42
|
+
hdIndexColumn: "hd_index",
|
|
43
|
+
isActiveColumn: "is_active",
|
|
44
|
+
};
|
|
45
|
+
const DEFAULT_SWEEP_HISTORY_TABLE = {
|
|
46
|
+
tableName: "sweep_history",
|
|
47
|
+
};
|
|
48
|
+
class DBAdapter {
|
|
49
|
+
constructor(databaseUrl, dbType, tableConfig) {
|
|
50
|
+
this.databaseUrl = databaseUrl;
|
|
51
|
+
this.dbType = dbType;
|
|
52
|
+
// merge user config with defaults
|
|
53
|
+
this.walletTable = {
|
|
54
|
+
...DEFAULT_WALLET_TABLE,
|
|
55
|
+
...tableConfig?.wallets,
|
|
56
|
+
};
|
|
57
|
+
this.sweepHistoryTable = {
|
|
58
|
+
...DEFAULT_SWEEP_HISTORY_TABLE,
|
|
59
|
+
...tableConfig?.sweepHistory,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async connect() {
|
|
63
|
+
if (this.dbType === "mysql") {
|
|
64
|
+
const mysql = await Promise.resolve().then(() => __importStar(require("mysql2/promise")));
|
|
65
|
+
this.pool = mysql.createPool(this.databaseUrl);
|
|
66
|
+
console.log("[SDK] MySQL connected");
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const { Pool } = await Promise.resolve().then(() => __importStar(require("pg")));
|
|
70
|
+
this.pool = new Pool({ connectionString: this.databaseUrl });
|
|
71
|
+
console.log("[SDK] PostgreSQL connected");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async disconnect() {
|
|
75
|
+
if (this.pool)
|
|
76
|
+
await this.pool.end();
|
|
77
|
+
}
|
|
78
|
+
async query(sql, params = []) {
|
|
79
|
+
if (this.dbType === "mysql") {
|
|
80
|
+
const [rows] = await this.pool.execute(sql, params);
|
|
81
|
+
return rows;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
let i = 0;
|
|
85
|
+
const pgSql = sql.replace(/\?/g, () => `$${++i}`);
|
|
86
|
+
const result = await this.pool.query(pgSql, params);
|
|
87
|
+
return result.rows;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// helper to quote column/table names based on DB type
|
|
91
|
+
quoteIdentifier(name) {
|
|
92
|
+
if (this.dbType === "mysql") {
|
|
93
|
+
return `\`${name}\``;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return `"${name}"`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async getWalletsByChainType(chainType) {
|
|
100
|
+
const { tableName, chainColumn, isActiveColumn, addressColumn, hdIndexColumn, } = this.walletTable;
|
|
101
|
+
const q = this.quoteIdentifier.bind(this);
|
|
102
|
+
const rows = await this.query(`SELECT
|
|
103
|
+
${q(addressColumn)} as address,
|
|
104
|
+
${q(chainColumn)} as chain,
|
|
105
|
+
${q(hdIndexColumn)} as hd_index,
|
|
106
|
+
${q(isActiveColumn)} as is_active
|
|
107
|
+
FROM ${q(tableName)}
|
|
108
|
+
WHERE ${q(chainColumn)} = ? AND ${q(isActiveColumn)} = true`, [chainType]);
|
|
109
|
+
return rows;
|
|
110
|
+
}
|
|
111
|
+
async getWalletByAddress(address) {
|
|
112
|
+
const { tableName, addressColumn, hdIndexColumn, chainColumn, isActiveColumn, } = this.walletTable;
|
|
113
|
+
const q = this.quoteIdentifier.bind(this);
|
|
114
|
+
const rows = await this.query(`SELECT
|
|
115
|
+
${q(addressColumn)} as address,
|
|
116
|
+
${q(chainColumn)} as chain,
|
|
117
|
+
${q(hdIndexColumn)} as hd_index,
|
|
118
|
+
${q(isActiveColumn)} as is_active
|
|
119
|
+
FROM ${q(tableName)}
|
|
120
|
+
WHERE ${q(addressColumn)} = ?`, [address]);
|
|
121
|
+
return rows[0] ?? null;
|
|
122
|
+
}
|
|
123
|
+
// ─── Sweep History Queries ──────────────────────────────────────────────────
|
|
124
|
+
async recordSweepSuccess(walletAddress, chainId, token, amount, txHash) {
|
|
125
|
+
const { tableName } = this.sweepHistoryTable;
|
|
126
|
+
await this.query(`INSERT INTO ${tableName}
|
|
127
|
+
(wallet_address, chain_id, token, amount, tx_hash, status, created_at)
|
|
128
|
+
VALUES (?, ?, ?, ?, ?, 'success', NOW())`, [walletAddress, chainId, token, amount, txHash]);
|
|
129
|
+
}
|
|
130
|
+
async recordSweepFailure(walletAddress, chainId, token, error) {
|
|
131
|
+
const { tableName } = this.sweepHistoryTable;
|
|
132
|
+
await this.query(`INSERT INTO ${tableName}
|
|
133
|
+
(wallet_address, chain_id, token, amount, tx_hash, status, error, created_at)
|
|
134
|
+
VALUES (?, ?, ?, '0', NULL, 'failed', ?, NOW())`, [walletAddress, chainId, token, error]);
|
|
135
|
+
}
|
|
136
|
+
async getSweepHistory(address) {
|
|
137
|
+
const { tableName } = this.sweepHistoryTable;
|
|
138
|
+
return this.query(`SELECT * FROM ${tableName}
|
|
139
|
+
WHERE wallet_address = ?
|
|
140
|
+
ORDER BY created_at DESC
|
|
141
|
+
LIMIT 50`, [address]);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.DBAdapter = DBAdapter;
|
|
145
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/sdk/db/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { HalalPaymasterConfig } from "./types";
|
|
3
|
+
import { ChainKey } from "../backend/config/constants";
|
|
4
|
+
export declare class HalalPaymaster extends EventEmitter {
|
|
5
|
+
private config;
|
|
6
|
+
private db;
|
|
7
|
+
private workers;
|
|
8
|
+
private running;
|
|
9
|
+
private originalLog;
|
|
10
|
+
private originalError;
|
|
11
|
+
private originalWarn;
|
|
12
|
+
private isLogging;
|
|
13
|
+
constructor(config: HalalPaymasterConfig);
|
|
14
|
+
private validateConfig;
|
|
15
|
+
start(): Promise<void>;
|
|
16
|
+
private runSweepCycle;
|
|
17
|
+
stop(): Promise<void>;
|
|
18
|
+
depositToPaymaster(chainKey: ChainKey, depositAmountEth: string, stakeAmountEth: string, unstakeDelaySec?: number): Promise<{
|
|
19
|
+
depositTxHash: string;
|
|
20
|
+
stakeTxHash: string;
|
|
21
|
+
currentBalance: string;
|
|
22
|
+
}>;
|
|
23
|
+
getPaymasterBalance(chainKey: ChainKey): Promise<string>;
|
|
24
|
+
getSweepHistory(address: string): Promise<unknown[]>;
|
|
25
|
+
}
|
|
26
|
+
export type { HalalPaymasterConfig, SweepCompleteEvent, SweepFailedEvent, SweepLogEvent, } from "./types";
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,oBAAoB,EAIrB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAOvD,qBAAa,cAAe,SAAQ,YAAY;IAE9C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,YAAY,CAA8B;IAElD,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,oBAAoB;IAuBxC,OAAO,CAAC,cAAc;IAuBhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAoEd,aAAa;IAqCrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,kBAAkB,CACtB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,eAAe,GAAE,MAAc,GAC9B,OAAO,CAAC;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAqFI,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBxD,eAAe,CAAC,OAAO,EAAE,MAAM;CAGtC;AAED,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GACd,MAAM,SAAS,CAAC"}
|