@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
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"}
|