@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.
Files changed (85) hide show
  1. package/README.md +276 -0
  2. package/dist/backend/config/chains.d.ts +18 -0
  3. package/dist/backend/config/chains.d.ts.map +1 -0
  4. package/dist/backend/config/chains.js +45 -0
  5. package/dist/backend/config/chains.js.map +1 -0
  6. package/dist/backend/config/constants.d.ts +58 -0
  7. package/dist/backend/config/constants.d.ts.map +1 -0
  8. package/dist/backend/config/constants.js +165 -0
  9. package/dist/backend/config/constants.js.map +1 -0
  10. package/dist/backend/config/db.context.d.ts +5 -0
  11. package/dist/backend/config/db.context.d.ts.map +1 -0
  12. package/dist/backend/config/db.context.js +63 -0
  13. package/dist/backend/config/db.context.js.map +1 -0
  14. package/dist/backend/config/db.d.ts +5 -0
  15. package/dist/backend/config/db.d.ts.map +1 -0
  16. package/dist/backend/config/db.js +35 -0
  17. package/dist/backend/config/db.js.map +1 -0
  18. package/dist/backend/config/index.d.ts +16 -0
  19. package/dist/backend/config/index.d.ts.map +1 -0
  20. package/dist/backend/config/index.js +44 -0
  21. package/dist/backend/config/index.js.map +1 -0
  22. package/dist/backend/contract/abi/ERC20Abi.json +413 -0
  23. package/dist/backend/contract/abi/HalalPaymasterAbi.json +544 -0
  24. package/dist/backend/contract/abi/entryPointAbi.json +166 -0
  25. package/dist/backend/contract/constant.d.ts +4 -0
  26. package/dist/backend/contract/constant.d.ts.map +1 -0
  27. package/dist/backend/contract/constant.js +7 -0
  28. package/dist/backend/contract/constant.js.map +1 -0
  29. package/dist/backend/contract/contract.d.ts +11 -0
  30. package/dist/backend/contract/contract.d.ts.map +1 -0
  31. package/dist/backend/contract/contract.js +34 -0
  32. package/dist/backend/contract/contract.js.map +1 -0
  33. package/dist/backend/helper/hotwallet.d.ts +4 -0
  34. package/dist/backend/helper/hotwallet.d.ts.map +1 -0
  35. package/dist/backend/helper/hotwallet.js +25 -0
  36. package/dist/backend/helper/hotwallet.js.map +1 -0
  37. package/dist/backend/services/chains/evm.service.d.ts +5760 -0
  38. package/dist/backend/services/chains/evm.service.d.ts.map +1 -0
  39. package/dist/backend/services/chains/evm.service.js +263 -0
  40. package/dist/backend/services/chains/evm.service.js.map +1 -0
  41. package/dist/backend/services/chains/solana.service.d.ts +15 -0
  42. package/dist/backend/services/chains/solana.service.d.ts.map +1 -0
  43. package/dist/backend/services/chains/solana.service.js +192 -0
  44. package/dist/backend/services/chains/solana.service.js.map +1 -0
  45. package/dist/backend/services/chains/tron.service.d.ts +14 -0
  46. package/dist/backend/services/chains/tron.service.d.ts.map +1 -0
  47. package/dist/backend/services/chains/tron.service.js +255 -0
  48. package/dist/backend/services/chains/tron.service.js.map +1 -0
  49. package/dist/backend/services/paymaster.service.d.ts +3 -0
  50. package/dist/backend/services/paymaster.service.d.ts.map +1 -0
  51. package/dist/backend/services/paymaster.service.js +55 -0
  52. package/dist/backend/services/paymaster.service.js.map +1 -0
  53. package/dist/backend/services/sweep.service.d.ts +14 -0
  54. package/dist/backend/services/sweep.service.d.ts.map +1 -0
  55. package/dist/backend/services/sweep.service.js +103 -0
  56. package/dist/backend/services/sweep.service.js.map +1 -0
  57. package/dist/backend/services/sweep.worker.d.ts +11 -0
  58. package/dist/backend/services/sweep.worker.d.ts.map +1 -0
  59. package/dist/backend/services/sweep.worker.js +163 -0
  60. package/dist/backend/services/sweep.worker.js.map +1 -0
  61. package/dist/backend/services/sweeper/evm.sweep.service.d.ts +13 -0
  62. package/dist/backend/services/sweeper/evm.sweep.service.d.ts.map +1 -0
  63. package/dist/backend/services/sweeper/evm.sweep.service.js +61 -0
  64. package/dist/backend/services/sweeper/evm.sweep.service.js.map +1 -0
  65. package/dist/backend/services/sweeper/solana.sweep.service.d.ts +13 -0
  66. package/dist/backend/services/sweeper/solana.sweep.service.d.ts.map +1 -0
  67. package/dist/backend/services/sweeper/solana.sweep.service.js +45 -0
  68. package/dist/backend/services/sweeper/solana.sweep.service.js.map +1 -0
  69. package/dist/backend/services/sweeper/tron.sweep.service.d.ts +13 -0
  70. package/dist/backend/services/sweeper/tron.sweep.service.d.ts.map +1 -0
  71. package/dist/backend/services/sweeper/tron.sweep.service.js +45 -0
  72. package/dist/backend/services/sweeper/tron.sweep.service.js.map +1 -0
  73. package/dist/sdk/db/adapter.d.ts +25 -0
  74. package/dist/sdk/db/adapter.d.ts.map +1 -0
  75. package/dist/sdk/db/adapter.js +145 -0
  76. package/dist/sdk/db/adapter.js.map +1 -0
  77. package/dist/sdk/index.d.ts +27 -0
  78. package/dist/sdk/index.d.ts.map +1 -0
  79. package/dist/sdk/index.js +274 -0
  80. package/dist/sdk/index.js.map +1 -0
  81. package/dist/sdk/types.d.ts +66 -0
  82. package/dist/sdk/types.d.ts.map +1 -0
  83. package/dist/sdk/types.js +3 -0
  84. package/dist/sdk/types.js.map +1 -0
  85. package/package.json +55 -0
package/README.md ADDED
@@ -0,0 +1,276 @@
1
+ # @tradestack/paymaster
2
+
3
+ A multi-chain paymaster SDK that automatically sweeps USDT and USDC deposits from user wallets to your hot wallet. Users never pay gas fees — the SDK handles all fee sponsorship across EVM, Solana, and Tron.
4
+
5
+ ## How It Works
6
+
7
+ User deposits USDT/USDC → SDK detects balance → Sweeps to hot wallet → onSweepComplete fires
8
+
9
+ ````
10
+
11
+ 1. User deposits USDT or USDC to their assigned wallet address
12
+ 2. SDK detects the balance above your threshold
13
+ 3. SDK sponsors the gas fee — user pays nothing
14
+ 4. Funds move to your hot wallet
15
+ 5. `onSweepComplete` fires so you can credit the user in your own system
16
+
17
+ ## Supported Chains
18
+
19
+ | Chain | Tokens | Fee Model |
20
+ |-------|--------|-----------|
21
+ | Ethereum / Arbitrum | USDT, USDC, ETH | ERC-4337 Paymaster — user pays zero ETH |
22
+ | Solana | USDT, USDC, SOL | feePayer pattern — user pays zero SOL |
23
+ | Tron | USDT, USDC, TRX | Energy delegation — user pays zero TRX |
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ npm install @tradestack/paymaster
29
+ ````
30
+
31
+ ## Requirements
32
+
33
+ - Node.js 18 or higher
34
+ - PostgreSQL or MySQL database
35
+ - A `wallets` table with the required columns
36
+ - A `sweep_history` table — SDK writes to this automatically
37
+
38
+ ## Database Setup
39
+
40
+ ### MySQL
41
+
42
+ ```sql
43
+ CREATE TABLE wallets (
44
+ id INT PRIMARY KEY AUTO_INCREMENT,
45
+ address VARCHAR(100) UNIQUE NOT NULL,
46
+ chain VARCHAR(20) NOT NULL,
47
+ hd_index INT NOT NULL,
48
+ is_active BOOLEAN DEFAULT true,
49
+ created_at DATETIME DEFAULT NOW()
50
+ );
51
+
52
+ CREATE TABLE sweep_history (
53
+ id INT PRIMARY KEY AUTO_INCREMENT,
54
+ wallet_address VARCHAR(100) NOT NULL,
55
+ chain_id VARCHAR(50),
56
+ token VARCHAR(20),
57
+ amount VARCHAR(78),
58
+ tx_hash VARCHAR(128),
59
+ status VARCHAR(20) DEFAULT 'pending',
60
+ error TEXT,
61
+ created_at DATETIME DEFAULT NOW()
62
+ );
63
+ ```
64
+
65
+ ### PostgreSQL
66
+
67
+ ```sql
68
+ CREATE TABLE wallets (
69
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
70
+ address VARCHAR(100) UNIQUE NOT NULL,
71
+ chain VARCHAR(20) NOT NULL,
72
+ hd_index INTEGER NOT NULL,
73
+ is_active BOOLEAN DEFAULT true,
74
+ created_at TIMESTAMP DEFAULT NOW()
75
+ );
76
+
77
+ CREATE TABLE sweep_history (
78
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
79
+ wallet_address VARCHAR(100) NOT NULL,
80
+ chain_id VARCHAR(50),
81
+ token VARCHAR(20),
82
+ amount VARCHAR(78),
83
+ tx_hash VARCHAR(128),
84
+ status VARCHAR(20) DEFAULT 'pending',
85
+ error TEXT,
86
+ created_at TIMESTAMP DEFAULT NOW()
87
+ );
88
+ ```
89
+
90
+ ### Already have a wallets table?
91
+
92
+ If your wallets table exists but is missing columns just add them:
93
+
94
+ ```sql
95
+ ALTER TABLE wallets ADD COLUMN IF NOT EXISTS chain VARCHAR(20) DEFAULT 'evm';
96
+ ALTER TABLE wallets ADD COLUMN IF NOT EXISTS hd_index INTEGER;
97
+ ALTER TABLE wallets ADD COLUMN IF NOT EXISTS is_active BOOLEAN DEFAULT true;
98
+ ```
99
+
100
+ ## Quick Start
101
+
102
+ ```typescript
103
+ import { HalalPaymaster } from "@tradestack/paymaster";
104
+
105
+ const paymaster = new HalalPaymaster({
106
+ database: {
107
+ url: process.env.DATABASE_URL,
108
+ type: "mysql", // or "postgresql"
109
+ },
110
+ keys: {
111
+ hdMnemonic: process.env.HD_MNEMONIC,
112
+ evmSignerKey: process.env.EVM_SIGNER_KEY,
113
+ solanaFeePayerKey: process.env.SOLANA_FEE_PAYER_KEY,
114
+ tronFeePayerKey: process.env.TRON_FEE_PAYER_KEY,
115
+ pimlicoApiKey: process.env.PIMLICO_API_KEY,
116
+ },
117
+ hotWallets: {
118
+ evm: "0x...",
119
+ solana: "...",
120
+ tron: "T...",
121
+ },
122
+ chains: ["arbitrum", "solana", "tron"],
123
+ sweepInterval: 300,
124
+ sweepThresholdUSD: 1,
125
+
126
+ onSweepComplete: async (event) => {
127
+ console.log(`Swept ${event.amount} ${event.token} from ${event.address}`);
128
+ await db.creditUser(event.address, event.amount, event.token);
129
+ },
130
+
131
+ onSweepFailed: async (event) => {
132
+ console.error(`Sweep failed for ${event.address}: ${event.error}`);
133
+ await db.logSweepError(event);
134
+ },
135
+ });
136
+
137
+ await paymaster.start();
138
+ ```
139
+
140
+ ## Custom Column Names
141
+
142
+ If your existing wallets table uses different column names you do not need to change your database. Just map them in the config.
143
+
144
+ ```typescript
145
+ const paymaster = new HalalPaymaster({
146
+ database: {
147
+ url: process.env.DATABASE_URL,
148
+ type: "mysql",
149
+ tables: {
150
+ wallets: {
151
+ tableName: "user_wallets", // default: "wallets"
152
+ addressColumn: "wallet_address", // default: "address"
153
+ chainColumn: "blockchain", // default: "chain"
154
+ hdIndexColumn: "key_index", // default: "hd_index"
155
+ isActiveColumn: "enabled", // default: "is_active"
156
+ },
157
+ sweepHistory: {
158
+ tableName: "transactions", // default: "sweep_history"
159
+ },
160
+ },
161
+ },
162
+ // rest of config
163
+ });
164
+ ```
165
+
166
+ ## Configuration
167
+
168
+ | Option | Type | Required | Default | Description |
169
+ | ------------------------ | -------- | -------- | ------- | ------------------------------------- |
170
+ | `database.url` | string | yes | - | Database connection string |
171
+ | `database.type` | string | yes | - | `"mysql"` or `"postgresql"` |
172
+ | `database.tables` | object | no | - | Custom table and column name mapping |
173
+ | `keys.hdMnemonic` | string | yes | - | HD wallet mnemonic for key derivation |
174
+ | `keys.evmSignerKey` | string | yes | - | EVM signer private key |
175
+ | `keys.solanaFeePayerKey` | string | yes | - | Solana fee payer private key |
176
+ | `keys.tronFeePayerKey` | string | yes | - | Tron fee payer private key |
177
+ | `keys.pimlicoApiKey` | string | yes | - | Pimlico bundler API key |
178
+ | `hotWallets.evm` | string | yes | - | EVM hot wallet address |
179
+ | `hotWallets.solana` | string | yes | - | Solana hot wallet address |
180
+ | `hotWallets.tron` | string | yes | - | Tron hot wallet address |
181
+ | `chains` | string[] | yes | - | Chains to monitor |
182
+ | `sweepInterval` | number | no | 300 | Check interval in seconds |
183
+ | `sweepThresholdUSD` | number | no | 1 | Minimum USD value to sweep |
184
+ | `onSweepComplete` | function | no | - | Called when sweep succeeds |
185
+ | `onSweepFailed` | function | no | - | Called when sweep fails |
186
+
187
+ ## Supported Chain Keys
188
+
189
+ ```typescript
190
+ // EVM
191
+ "ethereum" | "sepolia" | "arbitrum" | "arbitrumSepolia";
192
+
193
+ // Solana
194
+ "solana" | "solanaDevnet";
195
+
196
+ // Tron
197
+ "tron" | "tronShasta";
198
+ ```
199
+
200
+ ## Sweep Event
201
+
202
+ ```typescript
203
+ interface SweepCompleteEvent {
204
+ address: string; // wallet that was swept
205
+ chain: string; // chain key e.g. "arbitrum"
206
+ token: string; // token e.g. "USDT"
207
+ amount: string; // amount e.g. "100.000000"
208
+ txHash: string; // transaction hash
209
+ timestamp: Date;
210
+ }
211
+
212
+ interface SweepFailedEvent {
213
+ address: string;
214
+ chain: string;
215
+ token: string;
216
+ error: string;
217
+ timestamp: Date;
218
+ }
219
+ ```
220
+
221
+ ## Get Sweep History
222
+
223
+ ```typescript
224
+ const history = await paymaster.getSweepHistory("0x...");
225
+ ```
226
+
227
+ ## Stop the SDK
228
+
229
+ ```typescript
230
+ await paymaster.stop();
231
+ ```
232
+
233
+ ## Environment Variables
234
+
235
+ ```env
236
+ DATABASE_URL=mysql://user:pass@localhost:3306/your_db
237
+ HD_MNEMONIC=your twelve word mnemonic phrase here
238
+ EVM_SIGNER_KEY=0x...
239
+ SOLANA_FEE_PAYER_KEY=...
240
+ TRON_FEE_PAYER_KEY=...
241
+ PIMLICO_API_KEY=pim_...
242
+ ```
243
+
244
+ ## Tron Mainnet Setup
245
+
246
+ On Tron mainnet you need to stake TRX to get energy for gasless sweeps:
247
+
248
+ 1. Go to https://tronscan.org
249
+ 2. Stake at least 1000 TRX for ENERGY
250
+ 3. SDK automatically delegates energy to user wallets before each sweep
251
+ 4. Energy regenerates daily — zero ongoing cost per sweep
252
+
253
+ ## Security
254
+
255
+ - Never commit `.env` to version control
256
+ - Store `HD_MNEMONIC` in a secrets manager in production (AWS KMS, HashiCorp Vault)
257
+ - Pin the exact SDK version in your package.json — do not use `latest`
258
+ - Validate `onSweepComplete` events against on-chain data before crediting users
259
+ - Keep hot wallets funded with minimum operational balance only
260
+ - Monitor `sweep_history` table for failed sweeps or unusual activity
261
+
262
+ ```json
263
+ {
264
+ "dependencies": {
265
+ "@tradestack/paymaster": "1.0.2"
266
+ }
267
+ }
268
+ ```
269
+
270
+ ## License
271
+
272
+ MIT — Tradestack
273
+
274
+ ```
275
+
276
+ ```
@@ -0,0 +1,18 @@
1
+ import { ChainKey, EVMChainKey, TokenKey, EVMChainDefinition, SolanaChainDefinition, TronChainDefinition } from "./constants";
2
+ export interface EVMChainConfig extends EVMChainDefinition {
3
+ chainKey: EVMChainKey;
4
+ viemChain: any;
5
+ }
6
+ export interface SolanaChainConfig extends SolanaChainDefinition {
7
+ chainKey: ChainKey;
8
+ }
9
+ export interface TronChainConfig extends TronChainDefinition {
10
+ chainKey: ChainKey;
11
+ }
12
+ export type ChainConfig = EVMChainConfig | SolanaChainConfig | TronChainConfig;
13
+ export declare const CHAIN_CONFIGS: Record<ChainKey, ChainConfig>;
14
+ export declare const isEVMConfig: (config: ChainConfig) => config is EVMChainConfig;
15
+ export declare const isSolanaConfig: (config: ChainConfig) => config is SolanaChainConfig;
16
+ export declare const isTronConfig: (config: ChainConfig) => config is TronChainConfig;
17
+ export type { ChainKey, TokenKey };
18
+ //# sourceMappingURL=chains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../../../src/backend/config/chains.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,QAAQ,EAER,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EAKpB,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAU/E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAwBvD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,WAAW,KAAG,MAAM,IAAI,cAChC,CAAC;AAE7B,eAAO,MAAM,cAAc,GACzB,QAAQ,WAAW,KAClB,MAAM,IAAI,iBAAkD,CAAC;AAEhE,eAAO,MAAM,YAAY,GAAI,QAAQ,WAAW,KAAG,MAAM,IAAI,eAChC,CAAC;AAE9B,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isTronConfig = exports.isSolanaConfig = exports.isEVMConfig = exports.CHAIN_CONFIGS = void 0;
7
+ const chains_1 = require("viem/chains");
8
+ const dotenv_1 = __importDefault(require("dotenv"));
9
+ const constants_1 = require("./constants");
10
+ dotenv_1.default.config();
11
+ const VIEM_CHAINS = {
12
+ sepolia: chains_1.sepolia,
13
+ arbitrumSepolia: chains_1.arbitrumSepolia,
14
+ ethereumMainnet: chains_1.mainnet,
15
+ arbitrumMainnet: chains_1.arbitrum
16
+ };
17
+ exports.CHAIN_CONFIGS = Object.entries(constants_1.CHAIN_REGISTRY).reduce((acc, [key, chain]) => {
18
+ if ((0, constants_1.isEVMChain)(chain)) {
19
+ acc[key] = {
20
+ ...chain,
21
+ chainKey: key,
22
+ viemChain: VIEM_CHAINS[key],
23
+ };
24
+ }
25
+ else if ((0, constants_1.isSolanaChain)(chain)) {
26
+ acc[key] = {
27
+ ...chain,
28
+ chainKey: key,
29
+ };
30
+ }
31
+ else if ((0, constants_1.isTronChain)(chain)) {
32
+ acc[key] = {
33
+ ...chain,
34
+ chainKey: key,
35
+ };
36
+ }
37
+ return acc;
38
+ }, {});
39
+ const isEVMConfig = (config) => config.chainType === "evm";
40
+ exports.isEVMConfig = isEVMConfig;
41
+ const isSolanaConfig = (config) => config.chainType === "solana";
42
+ exports.isSolanaConfig = isSolanaConfig;
43
+ const isTronConfig = (config) => config.chainType === "tron";
44
+ exports.isTronConfig = isTronConfig;
45
+ //# sourceMappingURL=chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../../src/backend/config/chains.ts"],"names":[],"mappings":";;;;;;AAAA,wCAA4E;AAC5E,oDAA4B;AAC5B,2CAYqB;AAErB,gBAAM,CAAC,MAAM,EAAE,CAAC;AAiBhB,MAAM,WAAW,GAAmC;IAClD,OAAO,EAAP,gBAAO;IACP,eAAe,EAAf,wBAAe;IACf,eAAe,EAAE,gBAAO;IACxB,eAAe,EAAE,iBAAQ;CAE1B,CAAC;AAEW,QAAA,aAAa,GACxB,MAAM,CAAC,OAAO,CAAC,0BAAc,CAC9B,CAAC,MAAM,CACN,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;IACpB,IAAI,IAAA,sBAAU,EAAC,KAAK,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,GAAG;YACT,GAAG,KAAK;YACR,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC;SACV,CAAC;IACtB,CAAC;SAAM,IAAI,IAAA,yBAAa,EAAC,KAAK,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,GAAG,CAAC,GAAG;YACT,GAAG,KAAK;YACR,QAAQ,EAAE,GAAG;SACO,CAAC;IACzB,CAAC;SAAM,IAAI,IAAA,uBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,GAAG;YACT,GAAG,KAAK;YACR,QAAQ,EAAE,GAAG;SACK,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,EACD,EAAmC,CACpC,CAAC;AAEK,MAAM,WAAW,GAAG,CAAC,MAAmB,EAA4B,EAAE,CAC3E,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC;AADhB,QAAA,WAAW,eACK;AAEtB,MAAM,cAAc,GAAG,CAC5B,MAAmB,EACU,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC;AAFnD,QAAA,cAAc,kBAEqC;AAEzD,MAAM,YAAY,GAAG,CAAC,MAAmB,EAA6B,EAAE,CAC7E,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC;AADjB,QAAA,YAAY,gBACK"}
@@ -0,0 +1,58 @@
1
+ export type ChainType = "evm" | "solana" | "tron";
2
+ export type NetworkType = "testnet" | "mainnet";
3
+ export type TokenKey = "USDC" | "USDT" | "SOL" | "TRX";
4
+ export type EVMChainKey = "sepolia" | "arbitrumSepolia" | "ethereumMainnet" | "arbitrumMainnet";
5
+ export type SolanaChainKey = "solanaDevnet" | "solanaMainnet";
6
+ export type TronChainKey = "tronShasta" | "tronMainnet";
7
+ export type ChainKey = EVMChainKey | SolanaChainKey | TronChainKey;
8
+ interface BaseChainDefinition {
9
+ chainType: ChainType;
10
+ name: string;
11
+ networkType: NetworkType;
12
+ rpcUrl: string;
13
+ blockExplorer: string;
14
+ tokens: Partial<Record<TokenKey, string>>;
15
+ }
16
+ export interface EVMChainDefinition extends BaseChainDefinition {
17
+ chainType: "evm";
18
+ chainId: number;
19
+ bundlerRpc: string;
20
+ entryPointAddress: string;
21
+ paymasterAddress: string;
22
+ simpleAccountFactory: string;
23
+ }
24
+ export interface SolanaChainDefinition extends BaseChainDefinition {
25
+ chainType: "solana";
26
+ cluster: "devnet" | "mainnet-beta";
27
+ }
28
+ export interface TronChainDefinition extends BaseChainDefinition {
29
+ chainType: "tron";
30
+ fullNodeUrl: string;
31
+ solidityNodeUrl: string;
32
+ eventServerUrl: string;
33
+ }
34
+ export type ChainDefinition = EVMChainDefinition | SolanaChainDefinition | TronChainDefinition;
35
+ export declare const CHAIN_REGISTRY: Record<ChainKey, ChainDefinition>;
36
+ export declare const HOT_WALLET_ADDRESS_EVM = "";
37
+ export declare const HOT_WALLET_ADDRESS_SOLANA = "";
38
+ export declare const HOT_WALLET_ADDRESS_TRON = "";
39
+ export declare const ENTRY_POINT_ADDRESS = "";
40
+ export declare const isEVMChain: (chain: ChainDefinition) => chain is EVMChainDefinition;
41
+ export declare const isSolanaChain: (chain: ChainDefinition) => chain is SolanaChainDefinition;
42
+ export declare const isTronChain: (chain: ChainDefinition) => chain is TronChainDefinition;
43
+ export declare const isEVMChainKey: (key: ChainKey) => key is EVMChainKey;
44
+ export declare const isSolanaChainKey: (key: ChainKey) => key is SolanaChainKey;
45
+ export declare const isTronChainKey: (key: ChainKey) => key is TronChainKey;
46
+ export declare const getChain: (chainKey: ChainKey) => ChainDefinition;
47
+ export declare const SWEEP_THRESHOLD_USD = 0.1;
48
+ export declare const SWEEP_INTERVAL_MS = 300000;
49
+ export declare const SIGNATURE_EXPIRY_SECONDS = 300;
50
+ export declare const MAX_GAS_PER_OP = "10000000000000000";
51
+ export declare const ETH_MIN_SWEEP_THRESHOLD = "0.001";
52
+ export declare const SOL_MIN_SWEEP_THRESHOLD = 0.01;
53
+ export declare const TRX_MIN_SWEEP_THRESHOLD = 10;
54
+ export declare const PAYMASTER_LOW_BALANCE_THRESHOLD = "0.1";
55
+ export declare const RESERVE_MONITOR_INTERVAL_MS = 600000;
56
+ export declare const RESERVE_ALERT_THRESHOLD = 0.3;
57
+ export {};
58
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/backend/config/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RESERVE_ALERT_THRESHOLD = exports.RESERVE_MONITOR_INTERVAL_MS = exports.PAYMASTER_LOW_BALANCE_THRESHOLD = exports.TRX_MIN_SWEEP_THRESHOLD = exports.SOL_MIN_SWEEP_THRESHOLD = exports.ETH_MIN_SWEEP_THRESHOLD = exports.MAX_GAS_PER_OP = exports.SIGNATURE_EXPIRY_SECONDS = exports.SWEEP_INTERVAL_MS = exports.SWEEP_THRESHOLD_USD = exports.getChain = exports.isTronChainKey = exports.isSolanaChainKey = exports.isEVMChainKey = exports.isTronChain = exports.isSolanaChain = exports.isEVMChain = exports.ENTRY_POINT_ADDRESS = exports.HOT_WALLET_ADDRESS_TRON = exports.HOT_WALLET_ADDRESS_SOLANA = exports.HOT_WALLET_ADDRESS_EVM = exports.CHAIN_REGISTRY = void 0;
7
+ const dotenv_1 = __importDefault(require("dotenv"));
8
+ dotenv_1.default.config();
9
+ const PIMLICO_KEY = process.env.PIMLICO_API_KEY;
10
+ exports.CHAIN_REGISTRY = {
11
+ sepolia: {
12
+ chainType: "evm",
13
+ chainId: 11155111,
14
+ name: "Sepolia",
15
+ networkType: "testnet",
16
+ rpcUrl: `https://eth-sepolia.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`,
17
+ bundlerRpc: `https://api.pimlico.io/v2/sepolia/rpc?apikey=${PIMLICO_KEY}`,
18
+ blockExplorer: "https://sepolia.etherscan.io",
19
+ entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
20
+ paymasterAddress: "0x32999F27e86e1430B17693D7aB962B8B25c8fcBC",
21
+ tokens: {
22
+ USDC: "0xfB43078f982b6f03Fe4AACA547B8Decf889f216C",
23
+ USDT: "0xea27F9E2395C62c553deCb990C24f07FfAFF15D9",
24
+ },
25
+ simpleAccountFactory: "0x1d2494E2E93460138F52E6D611b995C88072E5c2",
26
+ },
27
+ ethereumMainnet: {
28
+ chainType: "evm",
29
+ chainId: 1,
30
+ name: "Ethereum Mainnet",
31
+ networkType: "mainnet",
32
+ rpcUrl: `https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`,
33
+ bundlerRpc: `https://api.pimlico.io/v2/ethereum/rpc?apikey=${PIMLICO_KEY}`,
34
+ blockExplorer: "https://etherscan.io",
35
+ entryPointAddress: "0x4337084d9e255ff0702461cf8895ce9e3b5ff108",
36
+ paymasterAddress: "0xAFbEE5693B49f0A3aEE8628C87f1AB027f657AB8", // deploy HalalPaymaster to mainnet first
37
+ tokens: {
38
+ USDC: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
39
+ USDT: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
40
+ },
41
+ simpleAccountFactory: "0x1d2494E2E93460138F52E6D611b995C88072E5c2",
42
+ },
43
+ arbitrumSepolia: {
44
+ chainType: "evm",
45
+ chainId: 421614,
46
+ name: "Arbitrum Sepolia",
47
+ networkType: "testnet",
48
+ rpcUrl: `https://arb-sepolia.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`,
49
+ bundlerRpc: `https://api.pimlico.io/v2/arbitrum-sepolia/rpc?apikey=${PIMLICO_KEY}`,
50
+ blockExplorer: "https://sepolia.arbiscan.io",
51
+ entryPointAddress: "0x0000000071727De22E5E9d8BAf0edAc6f37da032",
52
+ paymasterAddress: "0xCA8D59028F6EbE77CA141218011802042AC04227",
53
+ tokens: {
54
+ USDC: "0x3aD4e995499F590124b7C139BC52E4C7dF0B3c08",
55
+ USDT: "0xdCFB5ca72A6dd3D69598844225C04D107121f0E1",
56
+ },
57
+ simpleAccountFactory: "0x1d2494E2E93460138F52E6D611b995C88072E5c2",
58
+ },
59
+ arbitrumMainnet: {
60
+ chainType: "evm",
61
+ chainId: 42161,
62
+ name: "Arbitrum One",
63
+ networkType: "mainnet",
64
+ rpcUrl: `https://arb-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}`,
65
+ bundlerRpc: `https://api.pimlico.io/v2/arbitrum/rpc?apikey=${PIMLICO_KEY}`,
66
+ blockExplorer: "https://arbiscan.io",
67
+ entryPointAddress: "0x4337084d9e255ff0702461cf8895ce9e3b5ff108",
68
+ paymasterAddress: "0x72BA91B30f4a5D004dfCc1F9057F12c15e22221f", // no paymaster deployed on Arbitrum mainnet yet
69
+ tokens: {
70
+ USDC: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
71
+ USDT: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
72
+ },
73
+ simpleAccountFactory: "0x1d2494E2E93460138F52E6D611b995C88072E5c2",
74
+ },
75
+ solanaDevnet: {
76
+ chainType: "solana",
77
+ cluster: "devnet",
78
+ name: "Solana Devnet",
79
+ networkType: "testnet",
80
+ rpcUrl: "https://api.devnet.solana.com",
81
+ blockExplorer: "https://explorer.solana.com?cluster=devnet",
82
+ tokens: {
83
+ USDC: "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",
84
+ USDT: "EJwZgeZrdC8TXTQbQBoL6bfuAnFUUy1PVCMB4DYPzVaS",
85
+ SOL: "So11111111111111111111111111111111111111112",
86
+ },
87
+ },
88
+ solanaMainnet: {
89
+ chainType: "solana",
90
+ cluster: "mainnet-beta",
91
+ name: "Solana Mainnet",
92
+ networkType: "mainnet",
93
+ rpcUrl: "https://api.mainnet-beta.solana.com",
94
+ blockExplorer: "https://explorer.solana.com",
95
+ tokens: {
96
+ USDC: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
97
+ USDT: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
98
+ SOL: "So11111111111111111111111111111111111111112",
99
+ },
100
+ },
101
+ tronShasta: {
102
+ chainType: "tron",
103
+ name: "Tron Shasta Testnet",
104
+ networkType: "testnet",
105
+ rpcUrl: "https://api.shasta.trongrid.io",
106
+ fullNodeUrl: "https://api.shasta.trongrid.io",
107
+ solidityNodeUrl: "https://api.shasta.trongrid.io",
108
+ eventServerUrl: "https://api.shasta.trongrid.io",
109
+ blockExplorer: "https://shasta.tronscan.org",
110
+ tokens: {
111
+ USDT: "TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs", // Shasta USDT (TRC-20)
112
+ // USDC: "TFGBSrddnBULFDEvYxFMSYWBadijQsHZx5", // Shasta USDC (TRC-20)
113
+ TRX: "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb", // native TRX
114
+ },
115
+ },
116
+ tronMainnet: {
117
+ chainType: "tron",
118
+ name: "Tron Mainnet",
119
+ networkType: "mainnet",
120
+ rpcUrl: "https://api.trongrid.io",
121
+ fullNodeUrl: "https://api.trongrid.io",
122
+ solidityNodeUrl: "https://api.trongrid.io",
123
+ eventServerUrl: "https://api.trongrid.io",
124
+ blockExplorer: "https://tronscan.org",
125
+ tokens: {
126
+ USDT: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", // mainnet USDT TRC-20 (biggest)
127
+ USDC: "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8", // mainnet USDC TRC-20
128
+ TRX: "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb", // native TRX
129
+ },
130
+ },
131
+ };
132
+ exports.HOT_WALLET_ADDRESS_EVM = ""; //example 0x0371868637b61F09D319A12Ebd7E314Af58A181e
133
+ exports.HOT_WALLET_ADDRESS_SOLANA = ""; //example 8rarfJKzjd2Bk4GG6xjawCvAAh9zBKdAu7cdF8p6Ni4h
134
+ exports.HOT_WALLET_ADDRESS_TRON = ""; //example TEbGVgMKtcHYC21sysFnDgRmH51cMxvpX1
135
+ exports.ENTRY_POINT_ADDRESS = ""; //example 0x0000000071727De22E5E9d8BAf0edAc6f37da032;
136
+ const isEVMChain = (chain) => chain.chainType === "evm";
137
+ exports.isEVMChain = isEVMChain;
138
+ const isSolanaChain = (chain) => chain.chainType === "solana";
139
+ exports.isSolanaChain = isSolanaChain;
140
+ const isTronChain = (chain) => chain.chainType === "tron";
141
+ exports.isTronChain = isTronChain;
142
+ const isEVMChainKey = (key) => key === "sepolia" || key === "arbitrumSepolia";
143
+ exports.isEVMChainKey = isEVMChainKey;
144
+ const isSolanaChainKey = (key) => key === "solanaDevnet" || key === "solanaMainnet";
145
+ exports.isSolanaChainKey = isSolanaChainKey;
146
+ const isTronChainKey = (key) => key === "tronShasta" || key === "tronMainnet";
147
+ exports.isTronChainKey = isTronChainKey;
148
+ const getChain = (chainKey) => {
149
+ const chain = exports.CHAIN_REGISTRY[chainKey];
150
+ if (!chain)
151
+ throw new Error(`Unknown chain: ${chainKey}`);
152
+ return chain;
153
+ };
154
+ exports.getChain = getChain;
155
+ exports.SWEEP_THRESHOLD_USD = 0.1;
156
+ exports.SWEEP_INTERVAL_MS = 300000;
157
+ exports.SIGNATURE_EXPIRY_SECONDS = 300;
158
+ exports.MAX_GAS_PER_OP = "10000000000000000";
159
+ exports.ETH_MIN_SWEEP_THRESHOLD = "0.001";
160
+ exports.SOL_MIN_SWEEP_THRESHOLD = 0.01;
161
+ exports.TRX_MIN_SWEEP_THRESHOLD = 10; // minimum TRX to sweep
162
+ exports.PAYMASTER_LOW_BALANCE_THRESHOLD = "0.1";
163
+ exports.RESERVE_MONITOR_INTERVAL_MS = 600000;
164
+ exports.RESERVE_ALERT_THRESHOLD = 0.3;
165
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/backend/config/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { DBAdapter } from "../../sdk/db/adapter";
2
+ export declare const setDBAdapter: (adapter: DBAdapter) => void;
3
+ export declare const dbQuery: <T = any>(sql: string, params?: any[]) => Promise<T[]>;
4
+ export declare const getDBAdapter: () => DBAdapter | null;
5
+ //# sourceMappingURL=db.context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.context.d.ts","sourceRoot":"","sources":["../../../../src/backend/config/db.context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,eAAO,MAAM,YAAY,GAAI,SAAS,SAAS,KAAG,IAEjD,CAAC;AAQF,eAAO,MAAM,OAAO,GAAU,CAAC,GAAG,GAAG,EACnC,KAAK,MAAM,EACX,SAAQ,GAAG,EAAO,KACjB,OAAO,CAAC,CAAC,EAAE,CAWb,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,SAAS,GAAG,IAE3C,CAAC"}
@@ -0,0 +1,63 @@
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.getDBAdapter = exports.dbQuery = exports.setDBAdapter = void 0;
37
+ let dbAdapter = null;
38
+ const setDBAdapter = (adapter) => {
39
+ dbAdapter = adapter;
40
+ };
41
+ exports.setDBAdapter = setDBAdapter;
42
+ // convert ? placeholders to $1 $2 $3 for PostgreSQL
43
+ const toPostgresPlaceholders = (sql) => {
44
+ let index = 0;
45
+ return sql.replace(/\?/g, () => `$${++index}`);
46
+ };
47
+ const dbQuery = async (sql, params = []) => {
48
+ // SDK mode — use injected adapter (MySQL or PostgreSQL)
49
+ if (dbAdapter) {
50
+ return dbAdapter.query(sql, params);
51
+ }
52
+ // standalone mode — use pg pool directly
53
+ const { default: pool } = await Promise.resolve().then(() => __importStar(require("./db")));
54
+ const pgSql = toPostgresPlaceholders(sql);
55
+ const result = await pool.query(pgSql, params);
56
+ return result.rows;
57
+ };
58
+ exports.dbQuery = dbQuery;
59
+ const getDBAdapter = () => {
60
+ return dbAdapter;
61
+ };
62
+ exports.getDBAdapter = getDBAdapter;
63
+ //# sourceMappingURL=db.context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.context.js","sourceRoot":"","sources":["../../../../src/backend/config/db.context.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEhC,MAAM,YAAY,GAAG,CAAC,OAAkB,EAAQ,EAAE;IACvD,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC,CAAC;AAFW,QAAA,YAAY,gBAEvB;AAEF,oDAAoD;AACpD,MAAM,sBAAsB,GAAG,CAAC,GAAW,EAAU,EAAE;IACrD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC;AAEK,MAAM,OAAO,GAAG,KAAK,EAC1B,GAAW,EACX,SAAgB,EAAE,EACJ,EAAE;IAChB,wDAAwD;IACxD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,KAAK,CAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,yCAAyC;IACzC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,IAAW,CAAC;AAC5B,CAAC,CAAC;AAdW,QAAA,OAAO,WAclB;AAEK,MAAM,YAAY,GAAG,GAAqB,EAAE;IACjD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAFW,QAAA,YAAY,gBAEvB"}