@zubari/sdk 0.1.0

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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +324 -0
  3. package/dist/SecureStorage-jO783AhC.d.mts +89 -0
  4. package/dist/SecureStorage-jO783AhC.d.ts +89 -0
  5. package/dist/SwapService-C0G8IXW2.d.mts +35 -0
  6. package/dist/SwapService-DZD0OJI_.d.ts +35 -0
  7. package/dist/WalletManager-DJjdq89b.d.mts +6106 -0
  8. package/dist/WalletManager-TiAdzqrn.d.ts +6106 -0
  9. package/dist/index-BLuxEdLp.d.mts +156 -0
  10. package/dist/index-BLuxEdLp.d.ts +156 -0
  11. package/dist/index-DO3T2HVe.d.ts +135 -0
  12. package/dist/index-fXVD8_D0.d.mts +135 -0
  13. package/dist/index.d.mts +67 -0
  14. package/dist/index.d.ts +67 -0
  15. package/dist/index.js +2411 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/index.mjs +2386 -0
  18. package/dist/index.mjs.map +1 -0
  19. package/dist/protocols/index.d.mts +181 -0
  20. package/dist/protocols/index.d.ts +181 -0
  21. package/dist/protocols/index.js +415 -0
  22. package/dist/protocols/index.js.map +1 -0
  23. package/dist/protocols/index.mjs +410 -0
  24. package/dist/protocols/index.mjs.map +1 -0
  25. package/dist/react/index.d.mts +49 -0
  26. package/dist/react/index.d.ts +49 -0
  27. package/dist/react/index.js +1573 -0
  28. package/dist/react/index.js.map +1 -0
  29. package/dist/react/index.mjs +1570 -0
  30. package/dist/react/index.mjs.map +1 -0
  31. package/dist/services/index.d.mts +198 -0
  32. package/dist/services/index.d.ts +198 -0
  33. package/dist/services/index.js +554 -0
  34. package/dist/services/index.js.map +1 -0
  35. package/dist/services/index.mjs +547 -0
  36. package/dist/services/index.mjs.map +1 -0
  37. package/dist/storage/index.d.mts +57 -0
  38. package/dist/storage/index.d.ts +57 -0
  39. package/dist/storage/index.js +442 -0
  40. package/dist/storage/index.js.map +1 -0
  41. package/dist/storage/index.mjs +435 -0
  42. package/dist/storage/index.mjs.map +1 -0
  43. package/dist/wallet/index.d.mts +8 -0
  44. package/dist/wallet/index.d.ts +8 -0
  45. package/dist/wallet/index.js +1678 -0
  46. package/dist/wallet/index.js.map +1 -0
  47. package/dist/wallet/index.mjs +1674 -0
  48. package/dist/wallet/index.mjs.map +1 -0
  49. package/package.json +136 -0
@@ -0,0 +1,547 @@
1
+ // src/config/contracts.ts
2
+ var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
3
+ var ZUBARI_CONTRACTS = {
4
+ testnet: {
5
+ // Ethereum Sepolia (11155111) - Deployed 2024-12-09
6
+ registry: "0xEdDf443D48832f23D4A0bED4C4c5eF200B38A7d3",
7
+ nft: "0xdc37e25650D685e4c38124aC314477Ea5f508a9e",
8
+ marketplace: ZERO_ADDRESS,
9
+ // Not yet deployed
10
+ tips: "0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85",
11
+ subscriptions: "0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8",
12
+ payouts: "0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c",
13
+ entryPoint: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
14
+ paymaster: ZERO_ADDRESS,
15
+ // Not yet deployed
16
+ accountFactory: ZERO_ADDRESS,
17
+ // Not yet deployed
18
+ usdt: "0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0",
19
+ // USDT on Sepolia
20
+ weth: "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14"
21
+ },
22
+ mainnet: {
23
+ // Ethereum Mainnet (1)
24
+ registry: ZERO_ADDRESS,
25
+ nft: ZERO_ADDRESS,
26
+ marketplace: ZERO_ADDRESS,
27
+ tips: ZERO_ADDRESS,
28
+ subscriptions: ZERO_ADDRESS,
29
+ payouts: ZERO_ADDRESS,
30
+ entryPoint: "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
31
+ paymaster: ZERO_ADDRESS,
32
+ accountFactory: ZERO_ADDRESS,
33
+ usdt: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
34
+ // USDT on Ethereum
35
+ weth: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
36
+ }
37
+ };
38
+ var PLATFORM_CONFIG = {
39
+ // Default slippage tolerance for swaps (50 = 0.5%)
40
+ defaultSlippageBps: 50};
41
+ function getContractAddresses(network) {
42
+ return ZUBARI_CONTRACTS[network];
43
+ }
44
+
45
+ // src/services/SwapService.ts
46
+ var SwapService = class {
47
+ _chainId;
48
+ isTestnet;
49
+ constructor(chainId, isTestnet = false) {
50
+ this._chainId = chainId;
51
+ this.isTestnet = isTestnet;
52
+ }
53
+ /**
54
+ * Get a swap quote
55
+ */
56
+ async getQuote(tokenIn, tokenOut, amountIn) {
57
+ if (amountIn <= 0n) {
58
+ throw new Error("Amount must be greater than 0");
59
+ }
60
+ return {
61
+ tokenIn,
62
+ tokenOut,
63
+ amountIn,
64
+ amountOut: BigInt(0),
65
+ priceImpact: 0,
66
+ route: [tokenIn, tokenOut],
67
+ estimatedGas: BigInt(0)
68
+ };
69
+ }
70
+ /**
71
+ * Execute a swap with slippage protection
72
+ */
73
+ async executeSwap(quote, slippageToleranceBps = PLATFORM_CONFIG.defaultSlippageBps) {
74
+ quote.amountOut - quote.amountOut * BigInt(slippageToleranceBps) / BigInt(1e4);
75
+ if (quote.priceImpact > 5) {
76
+ console.warn(`High price impact: ${quote.priceImpact}%`);
77
+ }
78
+ return {
79
+ hash: "",
80
+ network: "ethereum",
81
+ status: "pending"
82
+ };
83
+ }
84
+ /**
85
+ * Convert earnings to USDT, keeping some ETH for gas
86
+ */
87
+ async convertEarningsToStable(ethBalance, reserveForGas = BigInt("10000000000000000")) {
88
+ const amountToSwap = ethBalance - reserveForGas;
89
+ if (amountToSwap <= 0n) {
90
+ throw new Error("Insufficient balance after gas reserve");
91
+ }
92
+ const contracts = getContractAddresses(this.isTestnet ? "testnet" : "mainnet");
93
+ const quote = await this.getQuote(
94
+ "0x0000000000000000000000000000000000000000",
95
+ // ETH
96
+ contracts.usdt,
97
+ // USDT on Ethereum
98
+ amountToSwap
99
+ );
100
+ return this.executeSwap(quote);
101
+ }
102
+ /**
103
+ * Check if a swap route exists
104
+ */
105
+ async hasRoute(tokenIn, tokenOut) {
106
+ try {
107
+ const quote = await this.getQuote(tokenIn, tokenOut, BigInt(1));
108
+ return quote.amountOut > 0n;
109
+ } catch {
110
+ return false;
111
+ }
112
+ }
113
+ /**
114
+ * Get supported tokens for swapping
115
+ */
116
+ async getSupportedTokens() {
117
+ return [];
118
+ }
119
+ };
120
+
121
+ // src/services/WdkApiClient.ts
122
+ var WdkApiClient = class {
123
+ config;
124
+ constructor(config) {
125
+ this.config = {
126
+ baseUrl: config.baseUrl,
127
+ timeout: config.timeout || 3e4
128
+ };
129
+ }
130
+ /**
131
+ * Generate a new BIP-39 seed phrase using Tether WDK
132
+ */
133
+ async generateSeed() {
134
+ try {
135
+ const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/generate-seed`, {
136
+ method: "POST",
137
+ headers: {
138
+ "Content-Type": "application/json"
139
+ }
140
+ });
141
+ return await response.json();
142
+ } catch (error) {
143
+ return {
144
+ success: false,
145
+ error: error instanceof Error ? error.message : "Failed to generate seed"
146
+ };
147
+ }
148
+ }
149
+ /**
150
+ * Validate a BIP-39 seed phrase
151
+ */
152
+ async validateSeed(seed) {
153
+ try {
154
+ const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/validate-seed`, {
155
+ method: "POST",
156
+ headers: {
157
+ "Content-Type": "application/json"
158
+ },
159
+ body: JSON.stringify({ seed })
160
+ });
161
+ return await response.json();
162
+ } catch (error) {
163
+ return {
164
+ success: false,
165
+ error: error instanceof Error ? error.message : "Failed to validate seed"
166
+ };
167
+ }
168
+ }
169
+ /**
170
+ * Derive address for a specific chain using Tether WDK
171
+ */
172
+ async deriveAddress(seed, chain, network = "testnet") {
173
+ try {
174
+ const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-address`, {
175
+ method: "POST",
176
+ headers: {
177
+ "Content-Type": "application/json"
178
+ },
179
+ body: JSON.stringify({ seed, chain, network })
180
+ });
181
+ return await response.json();
182
+ } catch (error) {
183
+ return {
184
+ success: false,
185
+ error: error instanceof Error ? error.message : "Failed to derive address"
186
+ };
187
+ }
188
+ }
189
+ /**
190
+ * Derive addresses for all chains using Tether WDK
191
+ */
192
+ async deriveAllAddresses(seed, network = "testnet") {
193
+ try {
194
+ const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-all`, {
195
+ method: "POST",
196
+ headers: {
197
+ "Content-Type": "application/json"
198
+ },
199
+ body: JSON.stringify({ seed, network })
200
+ });
201
+ return await response.json();
202
+ } catch (error) {
203
+ return {
204
+ success: false,
205
+ error: error instanceof Error ? error.message : "Failed to derive addresses"
206
+ };
207
+ }
208
+ }
209
+ };
210
+ var DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001";
211
+ var wdkApiClient = null;
212
+ function getWdkApiClient(baseUrl) {
213
+ if (!wdkApiClient || baseUrl && wdkApiClient["config"].baseUrl !== baseUrl) {
214
+ wdkApiClient = new WdkApiClient({
215
+ baseUrl: baseUrl || DEFAULT_API_URL
216
+ });
217
+ }
218
+ return wdkApiClient;
219
+ }
220
+
221
+ // src/services/WdkService.ts
222
+ var WdkManager;
223
+ var WalletManagerBtc;
224
+ var WalletManagerEvm;
225
+ var WalletManagerSolana;
226
+ var WalletManagerTon;
227
+ var WalletManagerTron;
228
+ var WalletManagerSpark;
229
+ var wdkLoaded = false;
230
+ var wdkLoadError = null;
231
+ var dynamicImport = new Function("specifier", "return import(specifier)");
232
+ async function loadWdkModules() {
233
+ if (wdkLoaded) return;
234
+ if (wdkLoadError) throw wdkLoadError;
235
+ try {
236
+ const [wdk, btc, evm, solana, ton, tron, spark] = await Promise.all([
237
+ dynamicImport("@tetherto/wdk"),
238
+ dynamicImport("@tetherto/wdk-wallet-btc"),
239
+ dynamicImport("@tetherto/wdk-wallet-evm"),
240
+ dynamicImport("@tetherto/wdk-wallet-solana"),
241
+ dynamicImport("@tetherto/wdk-wallet-ton"),
242
+ dynamicImport("@tetherto/wdk-wallet-tron"),
243
+ dynamicImport("@tetherto/wdk-wallet-spark")
244
+ ]);
245
+ WdkManager = wdk.default;
246
+ WalletManagerBtc = btc.default;
247
+ WalletManagerEvm = evm.default;
248
+ WalletManagerSolana = solana.default;
249
+ WalletManagerTon = ton.default;
250
+ WalletManagerTron = tron.default;
251
+ WalletManagerSpark = spark.default;
252
+ wdkLoaded = true;
253
+ } catch (error) {
254
+ wdkLoadError = error instanceof Error ? error : new Error("Failed to load WDK modules");
255
+ console.error("Failed to load WDK modules:", error);
256
+ throw wdkLoadError;
257
+ }
258
+ }
259
+ var DERIVATION_PATHS = {
260
+ bitcoin: "m/84'/0'/0'/0/0",
261
+ // BIP-84 for native SegWit
262
+ ethereum: "m/44'/60'/0'/0/0",
263
+ ton: "m/44'/607'/0'",
264
+ // Updated for v1.0.0-beta.6+
265
+ tron: "m/44'/195'/0'/0/0",
266
+ solana: "m/44'/501'/0'/0'",
267
+ // Updated for v1.0.0-beta.4+
268
+ spark: "m/44'/998'/0'/0/0"
269
+ };
270
+ var DEFAULT_RPC_URLS = {
271
+ mainnet: {
272
+ ethereum: "https://eth.llamarpc.com",
273
+ solana: "https://api.mainnet-beta.solana.com",
274
+ ton: "https://toncenter.com/api/v2/jsonRPC",
275
+ tron: "https://api.trongrid.io"
276
+ },
277
+ testnet: {
278
+ ethereum: "https://ethereum-sepolia-rpc.publicnode.com",
279
+ solana: "https://api.devnet.solana.com",
280
+ ton: "https://testnet.toncenter.com/api/v2/jsonRPC",
281
+ tron: "https://api.shasta.trongrid.io"
282
+ }
283
+ };
284
+ var WdkService = class {
285
+ seed = null;
286
+ config;
287
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
288
+ wallets = {};
289
+ constructor(config = {}) {
290
+ this.config = {
291
+ network: config.network || "testnet",
292
+ rpcUrls: config.rpcUrls
293
+ };
294
+ }
295
+ /**
296
+ * Check if WDK modules are loaded
297
+ */
298
+ static isLoaded() {
299
+ return wdkLoaded;
300
+ }
301
+ /**
302
+ * Ensure WDK modules are loaded
303
+ */
304
+ async ensureLoaded() {
305
+ await loadWdkModules();
306
+ }
307
+ /**
308
+ * Load WDK modules (call this before using sync methods)
309
+ */
310
+ async loadModules() {
311
+ await loadWdkModules();
312
+ }
313
+ /**
314
+ * Generate a random BIP-39 seed phrase (12 words)
315
+ */
316
+ async generateSeedPhrase() {
317
+ await this.ensureLoaded();
318
+ return WdkManager.getRandomSeedPhrase();
319
+ }
320
+ /**
321
+ * Validate a BIP-39 seed phrase
322
+ */
323
+ async isValidSeed(seed) {
324
+ await this.ensureLoaded();
325
+ return WdkManager.isValidSeed(seed);
326
+ }
327
+ /**
328
+ * Validate seed phrase (sync version - basic check)
329
+ */
330
+ isValidSeedSync(seed) {
331
+ const words = seed.trim().split(/\s+/);
332
+ return words.length === 12 || words.length === 24;
333
+ }
334
+ /**
335
+ * Initialize the service with a seed phrase
336
+ */
337
+ async initialize(seed) {
338
+ await this.ensureLoaded();
339
+ if (!WdkManager.isValidSeed(seed)) {
340
+ throw new Error("Invalid seed phrase");
341
+ }
342
+ this.seed = seed;
343
+ this.wallets = {};
344
+ }
345
+ /**
346
+ * Get RPC URL for a chain
347
+ */
348
+ getRpcUrl(chain) {
349
+ const networkUrls = DEFAULT_RPC_URLS[this.config.network];
350
+ if (this.config.rpcUrls?.[chain]) {
351
+ return this.config.rpcUrls[chain];
352
+ }
353
+ return networkUrls[chain] || "";
354
+ }
355
+ /**
356
+ * Get or create wallet instance for a specific chain
357
+ */
358
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
359
+ async getWallet(chain) {
360
+ if (!this.seed) {
361
+ throw new Error("WDK service not initialized. Call initialize() first.");
362
+ }
363
+ if (this.wallets[chain]) {
364
+ return this.wallets[chain];
365
+ }
366
+ const isTestnet = this.config.network === "testnet";
367
+ try {
368
+ switch (chain) {
369
+ case "ethereum": {
370
+ const rpcUrl = this.getRpcUrl("ethereum");
371
+ const wallet = new WalletManagerEvm(this.seed, { provider: rpcUrl });
372
+ this.wallets[chain] = wallet;
373
+ return wallet;
374
+ }
375
+ case "bitcoin": {
376
+ const wallet = new WalletManagerBtc(this.seed, {
377
+ network: isTestnet ? "testnet" : "bitcoin"
378
+ });
379
+ this.wallets[chain] = wallet;
380
+ return wallet;
381
+ }
382
+ case "solana": {
383
+ const rpcUrl = this.getRpcUrl("solana");
384
+ const wallet = new WalletManagerSolana(this.seed, {
385
+ rpcUrl
386
+ });
387
+ this.wallets[chain] = wallet;
388
+ return wallet;
389
+ }
390
+ case "ton": {
391
+ const url = this.getRpcUrl("ton");
392
+ const wallet = new WalletManagerTon(this.seed, {
393
+ tonClient: { url }
394
+ });
395
+ this.wallets[chain] = wallet;
396
+ return wallet;
397
+ }
398
+ case "tron": {
399
+ const fullHost = this.getRpcUrl("tron");
400
+ const wallet = new WalletManagerTron(this.seed, {
401
+ provider: fullHost
402
+ });
403
+ this.wallets[chain] = wallet;
404
+ return wallet;
405
+ }
406
+ case "spark": {
407
+ const wallet = new WalletManagerSpark(this.seed, {
408
+ network: isTestnet ? "TESTNET" : "MAINNET"
409
+ });
410
+ this.wallets[chain] = wallet;
411
+ return wallet;
412
+ }
413
+ default:
414
+ throw new Error(`Unsupported chain: ${chain}`);
415
+ }
416
+ } catch (error) {
417
+ console.error(`Failed to initialize ${chain} wallet:`, error);
418
+ throw error;
419
+ }
420
+ }
421
+ /**
422
+ * Derive address for a specific chain
423
+ */
424
+ async deriveAddress(chain) {
425
+ const path = DERIVATION_PATHS[chain];
426
+ try {
427
+ const wallet = await this.getWallet(chain);
428
+ const account = await wallet.getAccount(0);
429
+ const address = await account.getAddress();
430
+ return {
431
+ chain,
432
+ address,
433
+ path
434
+ };
435
+ } catch (error) {
436
+ console.error(`Error deriving ${chain} address:`, error);
437
+ throw error;
438
+ }
439
+ }
440
+ /**
441
+ * Derive addresses for all supported chains
442
+ */
443
+ async deriveAllAddresses() {
444
+ const chains = ["ethereum", "bitcoin", "ton", "tron", "solana", "spark"];
445
+ const addresses = {
446
+ ethereum: null,
447
+ bitcoin: null,
448
+ ton: null,
449
+ tron: null,
450
+ solana: null,
451
+ spark: null
452
+ };
453
+ const results = await Promise.allSettled(
454
+ chains.map(async (chain) => {
455
+ const result = await this.deriveAddress(chain);
456
+ return { chain, address: result.address };
457
+ })
458
+ );
459
+ for (const result of results) {
460
+ if (result.status === "fulfilled") {
461
+ addresses[result.value.chain] = result.value.address;
462
+ } else {
463
+ console.error("Failed to derive address:", result.reason);
464
+ }
465
+ }
466
+ return addresses;
467
+ }
468
+ /**
469
+ * Derive addresses for specific chains only
470
+ */
471
+ async deriveAddressesForChains(chains) {
472
+ const addresses = {};
473
+ const results = await Promise.allSettled(
474
+ chains.map(async (chain) => {
475
+ const result = await this.deriveAddress(chain);
476
+ return { chain, address: result.address };
477
+ })
478
+ );
479
+ for (const result of results) {
480
+ if (result.status === "fulfilled") {
481
+ addresses[result.value.chain] = result.value.address;
482
+ }
483
+ }
484
+ return addresses;
485
+ }
486
+ /**
487
+ * Get fee rates for a specific chain
488
+ */
489
+ async getFeeRates(chain) {
490
+ if (!this.seed) {
491
+ throw new Error("WDK service not initialized. Call initialize() first.");
492
+ }
493
+ try {
494
+ const wallet = await this.getWallet(chain);
495
+ const feeRates = await wallet.getFeeRates();
496
+ return {
497
+ slow: (feeRates.slow || feeRates.low || "0").toString(),
498
+ medium: (feeRates.medium || feeRates.normal || feeRates.standard || "0").toString(),
499
+ fast: (feeRates.fast || feeRates.high || "0").toString()
500
+ };
501
+ } catch (error) {
502
+ console.error(`Error fetching fee rates for ${chain}:`, error);
503
+ throw error;
504
+ }
505
+ }
506
+ /**
507
+ * Get the current network configuration
508
+ */
509
+ getNetwork() {
510
+ return this.config.network;
511
+ }
512
+ /**
513
+ * Check if service is initialized
514
+ */
515
+ isInitialized() {
516
+ return this.seed !== null;
517
+ }
518
+ /**
519
+ * Clean up and dispose of wallet instances
520
+ */
521
+ dispose() {
522
+ for (const wallet of Object.values(this.wallets)) {
523
+ if (wallet && typeof wallet.dispose === "function") {
524
+ try {
525
+ wallet.dispose();
526
+ } catch {
527
+ }
528
+ }
529
+ }
530
+ this.wallets = {};
531
+ this.seed = null;
532
+ }
533
+ };
534
+ var wdkServiceInstance = null;
535
+ function getWdkService(config) {
536
+ if (!wdkServiceInstance || config && config.network !== wdkServiceInstance.getNetwork()) {
537
+ wdkServiceInstance = new WdkService(config);
538
+ }
539
+ return wdkServiceInstance;
540
+ }
541
+ function createWdkService(config) {
542
+ return new WdkService(config);
543
+ }
544
+
545
+ export { SwapService, WdkApiClient, WdkService, createWdkService, getWdkApiClient, getWdkService };
546
+ //# sourceMappingURL=index.mjs.map
547
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/contracts.ts","../../src/services/SwapService.ts","../../src/services/WdkApiClient.ts","../../src/services/WdkService.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n registry: string;\n nft: string;\n marketplace: string;\n tips: string;\n subscriptions: string;\n payouts: string;\n entryPoint: string;\n paymaster: string;\n accountFactory: string;\n usdt: string;\n weth: string;\n}\n\n// Placeholder addresses - will be updated after deployment\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n testnet: {\n // Ethereum Sepolia (11155111) - Deployed 2024-12-09\n registry: '0xEdDf443D48832f23D4A0bED4C4c5eF200B38A7d3',\n nft: '0xdc37e25650D685e4c38124aC314477Ea5f508a9e',\n marketplace: ZERO_ADDRESS, // Not yet deployed\n tips: '0xFDc353edC63Cd3D4bba35bB43861369516a9Dc85',\n subscriptions: '0x8C05F8aD2F295fB7f3596043a7c37C98A5F7fAB8',\n payouts: '0x804Fe503936E8b8d3D5Dbb62AF4fB6Fe7265Fb2c',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Not yet deployed\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdt: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n },\n mainnet: {\n // Ethereum Mainnet (1)\n registry: ZERO_ADDRESS,\n nft: ZERO_ADDRESS,\n marketplace: ZERO_ADDRESS,\n tips: ZERO_ADDRESS,\n subscriptions: ZERO_ADDRESS,\n payouts: ZERO_ADDRESS,\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS,\n accountFactory: ZERO_ADDRESS,\n usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n // Platform fee in basis points (300 = 3%)\n tipFeeBps: 300,\n // Maximum royalty in basis points (1000 = 10%)\n maxRoyaltyBps: 1000,\n // Default slippage tolerance for swaps (50 = 0.5%)\n defaultSlippageBps: 50,\n // Voucher validity in seconds (30 days)\n voucherValiditySecs: 30 * 24 * 60 * 60,\n // Swap deadline in seconds (30 minutes)\n swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n name: 'ZubariNFT',\n version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n NFTVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n","import type { SwapQuote, TxResult } from '../types';\nimport { PLATFORM_CONFIG, getContractAddresses } from '../config/contracts';\n\n/**\n * SwapService - DEX integration via Velora\n *\n * Handles token swaps with slippage protection,\n * quote fetching, and earnings conversion.\n */\nexport class SwapService {\n private readonly _chainId: number;\n private readonly isTestnet: boolean;\n\n constructor(chainId: number, isTestnet: boolean = false) {\n this._chainId = chainId;\n this.isTestnet = isTestnet;\n }\n\n /**\n * Get a swap quote\n */\n async getQuote(\n tokenIn: string,\n tokenOut: string,\n amountIn: bigint\n ): Promise<SwapQuote> {\n if (amountIn <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n // Placeholder - will use Velora DEX\n return {\n tokenIn,\n tokenOut,\n amountIn,\n amountOut: BigInt(0),\n priceImpact: 0,\n route: [tokenIn, tokenOut],\n estimatedGas: BigInt(0),\n };\n }\n\n /**\n * Execute a swap with slippage protection\n */\n async executeSwap(\n quote: SwapQuote,\n slippageToleranceBps: number = PLATFORM_CONFIG.defaultSlippageBps\n ): Promise<TxResult> {\n // Calculate minimum output with slippage\n const _minAmountOut =\n quote.amountOut - (quote.amountOut * BigInt(slippageToleranceBps)) / BigInt(10000);\n\n // Calculate deadline\n const _deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.swapDeadlineSecs;\n\n // Warn if price impact is high\n if (quote.priceImpact > 5) {\n console.warn(`High price impact: ${quote.priceImpact}%`);\n }\n\n // Placeholder - will call swap contract\n return {\n hash: '',\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Convert earnings to USDT, keeping some ETH for gas\n */\n async convertEarningsToStable(\n ethBalance: bigint,\n reserveForGas: bigint = BigInt('10000000000000000') // 0.01 ETH\n ): Promise<TxResult> {\n const amountToSwap = ethBalance - reserveForGas;\n\n if (amountToSwap <= 0n) {\n throw new Error('Insufficient balance after gas reserve');\n }\n\n // Get quote for ETH -> USDT\n const contracts = getContractAddresses(this.isTestnet ? 'testnet' : 'mainnet');\n const quote = await this.getQuote(\n '0x0000000000000000000000000000000000000000', // ETH\n contracts.usdt, // USDT on Ethereum\n amountToSwap\n );\n\n return this.executeSwap(quote);\n }\n\n /**\n * Check if a swap route exists\n */\n async hasRoute(tokenIn: string, tokenOut: string): Promise<boolean> {\n try {\n const quote = await this.getQuote(tokenIn, tokenOut, BigInt(1));\n return quote.amountOut > 0n;\n } catch {\n return false;\n }\n }\n\n /**\n * Get supported tokens for swapping\n */\n async getSupportedTokens(): Promise<string[]> {\n // Placeholder - will query DEX\n return [];\n }\n}\n","/**\n * WDK API Client\n *\n * Client for calling the backend WDK endpoints to derive addresses\n * using Tether WDK (which runs server-side in Node.js).\n */\n\nimport type { NetworkType } from '../types';\n\nexport interface WdkApiConfig {\n baseUrl: string;\n timeout?: number;\n}\n\nexport interface DeriveAddressResponse {\n success: boolean;\n address?: string;\n chain?: string;\n path?: string;\n network?: string;\n error?: string;\n}\n\nexport interface DeriveAllAddressesResponse {\n success: boolean;\n addresses?: {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n };\n network?: string;\n error?: string;\n}\n\nexport interface ValidateSeedResponse {\n success: boolean;\n isValid?: boolean;\n wordCount?: number;\n error?: string;\n}\n\nexport interface GenerateSeedResponse {\n success: boolean;\n seed?: string;\n wordCount?: number;\n error?: string;\n}\n\n/**\n * WDK API Client for server-side Tether WDK integration\n */\nexport class WdkApiClient {\n private config: Required<WdkApiConfig>;\n\n constructor(config: WdkApiConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout || 30000,\n };\n }\n\n /**\n * Generate a new BIP-39 seed phrase using Tether WDK\n */\n async generateSeed(): Promise<GenerateSeedResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/generate-seed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to generate seed',\n };\n }\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async validateSeed(seed: string): Promise<ValidateSeedResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/validate-seed`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to validate seed',\n };\n }\n }\n\n /**\n * Derive address for a specific chain using Tether WDK\n */\n async deriveAddress(\n seed: string,\n chain: NetworkType,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<DeriveAddressResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-address`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, chain, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to derive address',\n };\n }\n }\n\n /**\n * Derive addresses for all chains using Tether WDK\n */\n async deriveAllAddresses(\n seed: string,\n network: 'mainnet' | 'testnet' = 'testnet'\n ): Promise<DeriveAllAddressesResponse> {\n try {\n const response = await fetch(`${this.config.baseUrl}/api/wallets/wdk/derive-all`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed, network }),\n });\n\n return await response.json();\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to derive addresses',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001';\n\n// Singleton instance\nlet wdkApiClient: WdkApiClient | null = null;\n\n/**\n * Get or create the WDK API client instance\n */\nexport function getWdkApiClient(baseUrl?: string): WdkApiClient {\n if (!wdkApiClient || (baseUrl && wdkApiClient['config'].baseUrl !== baseUrl)) {\n wdkApiClient = new WdkApiClient({\n baseUrl: baseUrl || DEFAULT_API_URL,\n });\n }\n return wdkApiClient;\n}\n","/**\n * WDK Service for SDK\n *\n * Native integration with Tether WDK for multi-chain address derivation.\n * Uses individual wallet modules for each chain to derive cryptographically\n * valid addresses from a BIP-39 seed phrase.\n *\n * Supported chains: Ethereum, Bitcoin, TON, TRON, Solana, Spark (Lightning)\n *\n * @see https://docs.wallet.tether.io/\n */\n\n// Dynamic imports for ESM modules (WDK packages are ESM-only)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WdkManager: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerBtc: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerEvm: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSolana: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTon: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerTron: any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet WalletManagerSpark: any;\n\nlet wdkLoaded = false;\nlet wdkLoadError: Error | null = null;\n\n/**\n * Dynamic import helper that bypasses TypeScript's CommonJS transformation\n * TypeScript converts import() to require() in CommonJS, but WDK is ESM-only\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n specifier: string\n) => Promise<any>;\n\n/**\n * Dynamically load WDK modules (they are ESM-only)\n */\nasync function loadWdkModules(): Promise<void> {\n if (wdkLoaded) return;\n if (wdkLoadError) throw wdkLoadError;\n\n try {\n const [wdk, btc, evm, solana, ton, tron, spark] = await Promise.all([\n dynamicImport('@tetherto/wdk'),\n dynamicImport('@tetherto/wdk-wallet-btc'),\n dynamicImport('@tetherto/wdk-wallet-evm'),\n dynamicImport('@tetherto/wdk-wallet-solana'),\n dynamicImport('@tetherto/wdk-wallet-ton'),\n dynamicImport('@tetherto/wdk-wallet-tron'),\n dynamicImport('@tetherto/wdk-wallet-spark'),\n ]);\n\n WdkManager = wdk.default;\n WalletManagerBtc = btc.default;\n WalletManagerEvm = evm.default;\n WalletManagerSolana = solana.default;\n WalletManagerTon = ton.default;\n WalletManagerTron = tron.default;\n WalletManagerSpark = spark.default;\n wdkLoaded = true;\n } catch (error) {\n wdkLoadError = error instanceof Error ? error : new Error('Failed to load WDK modules');\n console.error('Failed to load WDK modules:', error);\n throw wdkLoadError;\n }\n}\n\nexport type SupportedChain = 'ethereum' | 'bitcoin' | 'ton' | 'tron' | 'solana' | 'spark';\n\nexport interface ChainAddress {\n chain: SupportedChain;\n address: string;\n path: string;\n}\n\nexport interface MultiChainAddresses {\n ethereum: string | null;\n bitcoin: string | null;\n ton: string | null;\n tron: string | null;\n solana: string | null;\n spark: string | null;\n}\n\nexport interface WdkServiceConfig {\n network: 'mainnet' | 'testnet';\n rpcUrls?: {\n ethereum?: string;\n bitcoin?: string;\n solana?: string;\n ton?: string;\n tron?: string;\n };\n}\n\n// BIP-44 derivation paths\nconst DERIVATION_PATHS: Record<SupportedChain, string> = {\n bitcoin: \"m/84'/0'/0'/0/0\", // BIP-84 for native SegWit\n ethereum: \"m/44'/60'/0'/0/0\",\n ton: \"m/44'/607'/0'\", // Updated for v1.0.0-beta.6+\n tron: \"m/44'/195'/0'/0/0\",\n solana: \"m/44'/501'/0'/0'\", // Updated for v1.0.0-beta.4+\n spark: \"m/44'/998'/0'/0/0\",\n};\n\n// Default RPC URLs\nconst DEFAULT_RPC_URLS = {\n mainnet: {\n ethereum: 'https://eth.llamarpc.com',\n solana: 'https://api.mainnet-beta.solana.com',\n ton: 'https://toncenter.com/api/v2/jsonRPC',\n tron: 'https://api.trongrid.io',\n },\n testnet: {\n ethereum: 'https://ethereum-sepolia-rpc.publicnode.com',\n solana: 'https://api.devnet.solana.com',\n ton: 'https://testnet.toncenter.com/api/v2/jsonRPC',\n tron: 'https://api.shasta.trongrid.io',\n },\n};\n\n/**\n * WDK Service for native multi-chain address derivation\n * Uses Tether WDK wallet modules directly without needing a backend API\n */\nexport class WdkService {\n private seed: string | null = null;\n private config: WdkServiceConfig;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private wallets: Partial<Record<SupportedChain, any>> = {};\n\n constructor(config: Partial<WdkServiceConfig> = {}) {\n this.config = {\n network: config.network || 'testnet',\n rpcUrls: config.rpcUrls,\n };\n }\n\n /**\n * Check if WDK modules are loaded\n */\n static isLoaded(): boolean {\n return wdkLoaded;\n }\n\n /**\n * Ensure WDK modules are loaded\n */\n private async ensureLoaded(): Promise<void> {\n await loadWdkModules();\n }\n\n /**\n * Load WDK modules (call this before using sync methods)\n */\n async loadModules(): Promise<void> {\n await loadWdkModules();\n }\n\n /**\n * Generate a random BIP-39 seed phrase (12 words)\n */\n async generateSeedPhrase(): Promise<string> {\n await this.ensureLoaded();\n return WdkManager.getRandomSeedPhrase();\n }\n\n /**\n * Validate a BIP-39 seed phrase\n */\n async isValidSeed(seed: string): Promise<boolean> {\n await this.ensureLoaded();\n return WdkManager.isValidSeed(seed);\n }\n\n /**\n * Validate seed phrase (sync version - basic check)\n */\n isValidSeedSync(seed: string): boolean {\n const words = seed.trim().split(/\\s+/);\n return words.length === 12 || words.length === 24;\n }\n\n /**\n * Initialize the service with a seed phrase\n */\n async initialize(seed: string): Promise<void> {\n await this.ensureLoaded();\n\n if (!WdkManager.isValidSeed(seed)) {\n throw new Error('Invalid seed phrase');\n }\n\n this.seed = seed;\n this.wallets = {};\n }\n\n /**\n * Get RPC URL for a chain\n */\n private getRpcUrl(chain: SupportedChain): string {\n const networkUrls = DEFAULT_RPC_URLS[this.config.network];\n\n if (this.config.rpcUrls?.[chain as keyof typeof this.config.rpcUrls]) {\n return this.config.rpcUrls[chain as keyof typeof this.config.rpcUrls]!;\n }\n\n return networkUrls[chain as keyof typeof networkUrls] || '';\n }\n\n /**\n * Get or create wallet instance for a specific chain\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async getWallet(chain: SupportedChain): Promise<any> {\n if (!this.seed) {\n throw new Error('WDK service not initialized. Call initialize() first.');\n }\n\n // Return cached wallet if exists\n if (this.wallets[chain]) {\n return this.wallets[chain];\n }\n\n const isTestnet = this.config.network === 'testnet';\n\n try {\n switch (chain) {\n case 'ethereum': {\n const rpcUrl = this.getRpcUrl('ethereum');\n const wallet = new WalletManagerEvm(this.seed, { provider: rpcUrl });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'bitcoin': {\n const wallet = new WalletManagerBtc(this.seed, {\n network: isTestnet ? 'testnet' : 'bitcoin',\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'solana': {\n const rpcUrl = this.getRpcUrl('solana');\n const wallet = new WalletManagerSolana(this.seed, {\n rpcUrl,\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'ton': {\n const url = this.getRpcUrl('ton');\n const wallet = new WalletManagerTon(this.seed, {\n tonClient: { url },\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'tron': {\n const fullHost = this.getRpcUrl('tron');\n const wallet = new WalletManagerTron(this.seed, {\n provider: fullHost,\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n case 'spark': {\n const wallet = new WalletManagerSpark(this.seed, {\n network: isTestnet ? 'TESTNET' : 'MAINNET',\n });\n this.wallets[chain] = wallet;\n return wallet;\n }\n\n default:\n throw new Error(`Unsupported chain: ${chain}`);\n }\n } catch (error) {\n console.error(`Failed to initialize ${chain} wallet:`, error);\n throw error;\n }\n }\n\n /**\n * Derive address for a specific chain\n */\n async deriveAddress(chain: SupportedChain): Promise<ChainAddress> {\n const path = DERIVATION_PATHS[chain];\n\n try {\n const wallet = await this.getWallet(chain);\n const account = await wallet.getAccount(0);\n const address = await account.getAddress();\n\n return {\n chain,\n address,\n path,\n };\n } catch (error) {\n console.error(`Error deriving ${chain} address:`, error);\n throw error;\n }\n }\n\n /**\n * Derive addresses for all supported chains\n */\n async deriveAllAddresses(): Promise<MultiChainAddresses> {\n const chains: SupportedChain[] = ['ethereum', 'bitcoin', 'ton', 'tron', 'solana', 'spark'];\n const addresses: MultiChainAddresses = {\n ethereum: null,\n bitcoin: null,\n ton: null,\n tron: null,\n solana: null,\n spark: null,\n };\n\n // Derive all addresses in parallel for better performance\n const results = await Promise.allSettled(\n chains.map(async (chain) => {\n const result = await this.deriveAddress(chain);\n return { chain, address: result.address };\n })\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n addresses[result.value.chain] = result.value.address;\n } else {\n console.error('Failed to derive address:', result.reason);\n }\n }\n\n return addresses;\n }\n\n /**\n * Derive addresses for specific chains only\n */\n async deriveAddressesForChains(chains: SupportedChain[]): Promise<Partial<MultiChainAddresses>> {\n const addresses: Partial<MultiChainAddresses> = {};\n\n const results = await Promise.allSettled(\n chains.map(async (chain) => {\n const result = await this.deriveAddress(chain);\n return { chain, address: result.address };\n })\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n addresses[result.value.chain] = result.value.address;\n }\n }\n\n return addresses;\n }\n\n /**\n * Get fee rates for a specific chain\n */\n async getFeeRates(\n chain: SupportedChain\n ): Promise<{ slow: string; medium: string; fast: string }> {\n if (!this.seed) {\n throw new Error('WDK service not initialized. Call initialize() first.');\n }\n\n try {\n const wallet = await this.getWallet(chain);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const feeRates: any = await wallet.getFeeRates();\n return {\n slow: (feeRates.slow || feeRates.low || '0').toString(),\n medium: (feeRates.medium || feeRates.normal || feeRates.standard || '0').toString(),\n fast: (feeRates.fast || feeRates.high || '0').toString(),\n };\n } catch (error) {\n console.error(`Error fetching fee rates for ${chain}:`, error);\n throw error;\n }\n }\n\n /**\n * Get the current network configuration\n */\n getNetwork(): 'mainnet' | 'testnet' {\n return this.config.network;\n }\n\n /**\n * Check if service is initialized\n */\n isInitialized(): boolean {\n return this.seed !== null;\n }\n\n /**\n * Clean up and dispose of wallet instances\n */\n dispose(): void {\n for (const wallet of Object.values(this.wallets)) {\n if (wallet && typeof wallet.dispose === 'function') {\n try {\n wallet.dispose();\n } catch {\n // Ignore dispose errors\n }\n }\n }\n this.wallets = {};\n this.seed = null;\n }\n}\n\n// Singleton instance\nlet wdkServiceInstance: WdkService | null = null;\n\n/**\n * Get or create the WDK service singleton\n */\nexport function getWdkService(config?: Partial<WdkServiceConfig>): WdkService {\n if (!wdkServiceInstance || (config && config.network !== wdkServiceInstance.getNetwork())) {\n wdkServiceInstance = new WdkService(config);\n }\n return wdkServiceInstance;\n}\n\n/**\n * Create a new WDK service instance (non-singleton)\n */\nexport function createWdkService(config?: Partial<WdkServiceConfig>): WdkService {\n return new WdkService(config);\n}\n"]}
@@ -0,0 +1,57 @@
1
+ export { K as KeychainStorageAdapter, a as KeystoreStorageAdapter, M as MemoryStorageAdapter, S as SecureStorageAdapter, W as WebEncryptedStorageAdapter, c as createSecureStorage } from '../SecureStorage-jO783AhC.mjs';
2
+
3
+ /**
4
+ * Backup metadata
5
+ */
6
+ interface BackupMetadata {
7
+ version: number;
8
+ createdAt: string;
9
+ checksum: string;
10
+ networks: string[];
11
+ }
12
+ /**
13
+ * Backup Service
14
+ * Handles encrypted seed backup to S3 and recovery
15
+ */
16
+ declare class BackupService {
17
+ private apiUrl;
18
+ private accessToken;
19
+ constructor(apiUrl: string, accessToken: string);
20
+ /**
21
+ * Export encrypted seed to S3
22
+ */
23
+ exportSeedEncrypted(seed: string, password: string, networks?: string[]): Promise<{
24
+ backupId: string;
25
+ checksum: string;
26
+ }>;
27
+ /**
28
+ * Import encrypted seed from S3
29
+ */
30
+ importSeedEncrypted(password: string): Promise<string>;
31
+ /**
32
+ * List all backups
33
+ */
34
+ listBackups(): Promise<BackupMetadata[]>;
35
+ /**
36
+ * Delete a backup
37
+ */
38
+ deleteBackup(backupId: string): Promise<void>;
39
+ /**
40
+ * Verify backup can be decrypted
41
+ */
42
+ verifyBackup(password: string): Promise<boolean>;
43
+ /**
44
+ * Generate SHA-256 checksum
45
+ */
46
+ private generateChecksum;
47
+ /**
48
+ * Extract salt from encrypted data (first 32 hex chars)
49
+ */
50
+ private extractSalt;
51
+ /**
52
+ * Extract IV from encrypted data (chars 32-56)
53
+ */
54
+ private extractIV;
55
+ }
56
+
57
+ export { BackupService };