dop-wallet-v6 1.2.10 → 1.2.12

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.
@@ -2,8 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.startDopEngineReactNative = void 0;
4
4
  const init_1 = require("./init");
5
- // Use memdown for React Native database
6
- const memdown = require('memdown');
5
+ // Use memdown for React Native database - with error handling
6
+ let memdown;
7
+ try {
8
+ memdown = require('memdown');
9
+ }
10
+ catch (error) {
11
+ throw new Error('memdown dependency is required for React Native support. ' +
12
+ 'Please install it with: npm install memdown@^6.1.1');
13
+ }
7
14
  /**
8
15
  * React Native compatible LevelDB implementation using memdown with AsyncStorage persistence.
9
16
  * This provides a persistent database solution that works reliably in React Native environments.
@@ -1 +1 @@
1
- {"version":3,"file":"react-native-init.js","sourceRoot":"","sources":["../../../../src/services/dop/core/react-native-init.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable no-console */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable global-require */\n/* eslint-disable no-void */\nimport { ArtifactStore } from '../../artifacts/artifact-store';\nimport { startDopEngine } from './init';\n\n// Use memdown for React Native database\nconst memdown = require('memdown');\n\n/**\n * React Native compatible LevelDB implementation using memdown with AsyncStorage persistence.\n * This provides a persistent database solution that works reliably in React Native environments.\n */\nclass ReactNativeLevelDB {\n private db: any;\n private storageKey: string;\n private AsyncStorage: any;\n\n constructor(name: string) {\n this.storageKey = `leveldb_${name}`;\n this.db = memdown();\n \n // Dynamically import AsyncStorage to avoid bundling issues\n try {\n this.AsyncStorage = require('@react-native-async-storage/async-storage').default;\n } catch (error) {\n console.warn('AsyncStorage not available, data will not persist between app restarts');\n this.AsyncStorage = null;\n }\n }\n\n // Implement AbstractLevelDOWN interface\n async open(callback: (error?: Error) => void): Promise<void> {\n try {\n // Load persisted data from AsyncStorage\n if (this.AsyncStorage) {\n const persistedData = await this.AsyncStorage.getItem(this.storageKey);\n if (persistedData) {\n const data = JSON.parse(persistedData);\n // Restore data to memdown instance\n for (const [key, value] of Object.entries(data)) {\n await new Promise<void>((resolve, reject) => {\n this.db.put(key, value, (err: any) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n }\n }\n \n // Open the memdown database\n this.db.open(callback);\n } catch (error) {\n callback(error as Error);\n }\n }\n\n close(callback: (error?: Error) => void): void {\n this.db.close(callback);\n }\n\n put(key: any, value: any, callback: (error?: Error) => void): void {\n this.db.put(key, value, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Persist to AsyncStorage in background\n void this._persistData().catch(console.warn);\n }\n callback(err);\n });\n }\n\n get(key: any, callback: (error?: Error, value?: any) => void): void {\n this.db.get(key, callback);\n }\n\n del(key: any, callback: (error?: Error) => void): void {\n this.db.del(key, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Persist to AsyncStorage in background\n void this._persistData().catch(console.warn);\n }\n callback(err);\n });\n }\n\n batch(operations: any[], callback: (error?: Error) => void): void {\n this.db.batch(operations, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Persist to AsyncStorage in background\n void this._persistData().catch(console.warn);\n }\n callback(err);\n });\n }\n\n iterator(options?: any): any {\n return this.db.iterator(options);\n }\n\n private async _persistData(): Promise<void> {\n if (!this.AsyncStorage) return;\n\n try {\n const data: Record<string, any> = {};\n const iterator = this.db.iterator();\n \n await new Promise<void>((resolve, reject) => {\n const processNext = () => {\n iterator.next((err: any, key: any, value: any) => {\n if (err) {\n iterator.end(() => reject(err));\n return;\n }\n \n if (key === undefined) {\n iterator.end(() => resolve());\n return;\n }\n \n data[key.toString()] = value;\n processNext();\n });\n };\n processNext();\n });\n\n await this.AsyncStorage.setItem(this.storageKey, JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to persist data to AsyncStorage:', error);\n }\n }\n}\n\n/**\n * Initialize DOP Engine specifically for React Native environments.\n * Uses a custom LevelDB implementation that persists data to AsyncStorage.\n * This provides full database persistence while being compatible with React Native.\n * \n * @param walletSource - Name for your wallet implementation (max 16 chars, lowercase)\n * @param shouldDebug - Whether to forward Engine debug logs to Logger\n * @param artifactStore - Persistent store for downloading large artifact files\n * @param useNativeArtifacts - Whether to download native C++ artifacts (should be TRUE for mobile)\n * @param skipMerkletreeScans - Whether to skip merkletree syncs and private balance scans\n * @param verboseScanLogging - Enable verbose logging for scanning operations\n * @param databaseName - Name for the database (used as prefix in AsyncStorage)\n */\nexport const startDopEngineReactNative = async (\n walletSource: string,\n shouldDebug: boolean,\n artifactStore: ArtifactStore,\n useNativeArtifacts = true,\n skipMerkletreeScans = false,\n verboseScanLogging = false,\n databaseName = 'dop-wallet-db'\n): Promise<void> => {\n // Create React Native compatible database instance\n const db = new ReactNativeLevelDB(databaseName);\n \n // Ensure database is opened before proceeding\n await new Promise<void>((resolve, reject) => {\n db.open((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n \n // Initialize the DOP Engine with the React Native database\n return startDopEngine(\n walletSource,\n db as any, // Cast to any since TypeScript doesn't know about our custom implementation\n shouldDebug,\n artifactStore,\n useNativeArtifacts,\n skipMerkletreeScans,\n verboseScanLogging\n );\n};\n"]}
1
+ {"version":3,"file":"react-native-init.js","sourceRoot":"","sources":["../../../../src/services/dop/core/react-native-init.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable no-console */\n/* eslint-disable no-await-in-loop */\n/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable global-require */\n/* eslint-disable no-void */\nimport { ArtifactStore } from '../../artifacts/artifact-store';\nimport { startDopEngine } from './init';\n\n// Use memdown for React Native database - with error handling\nlet memdown: any;\ntry {\n memdown = require('memdown');\n} catch (error) {\n throw new Error(\n 'memdown dependency is required for React Native support. ' +\n 'Please install it with: npm install memdown@^6.1.1'\n );\n}\n\n/**\n * React Native compatible LevelDB implementation using memdown with AsyncStorage persistence.\n * This provides a persistent database solution that works reliably in React Native environments.\n */\nclass ReactNativeLevelDB {\n private db: any;\n private storageKey: string;\n private AsyncStorage: any;\n\n constructor(name: string) {\n this.storageKey = `leveldb_${name}`;\n this.db = memdown();\n \n // Dynamically import AsyncStorage to avoid bundling issues\n try {\n this.AsyncStorage = require('@react-native-async-storage/async-storage').default;\n } catch (error) {\n console.warn('AsyncStorage not available, data will not persist between app restarts');\n this.AsyncStorage = null;\n }\n }\n\n // Implement AbstractLevelDOWN interface\n async open(callback: (error?: Error) => void): Promise<void> {\n try {\n // Load persisted data from AsyncStorage\n if (this.AsyncStorage) {\n const persistedData = await this.AsyncStorage.getItem(this.storageKey);\n if (persistedData) {\n const data = JSON.parse(persistedData);\n // Restore data to memdown instance\n for (const [key, value] of Object.entries(data)) {\n await new Promise<void>((resolve, reject) => {\n this.db.put(key, value, (err: any) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n }\n }\n \n // Open the memdown database\n this.db.open(callback);\n } catch (error) {\n callback(error as Error);\n }\n }\n\n close(callback: (error?: Error) => void): void {\n this.db.close(callback);\n }\n\n put(key: any, value: any, callback: (error?: Error) => void): void {\n this.db.put(key, value, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Persist to AsyncStorage in background\n void this._persistData().catch(console.warn);\n }\n callback(err);\n });\n }\n\n get(key: any, callback: (error?: Error, value?: any) => void): void {\n this.db.get(key, callback);\n }\n\n del(key: any, callback: (error?: Error) => void): void {\n this.db.del(key, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Persist to AsyncStorage in background\n void this._persistData().catch(console.warn);\n }\n callback(err);\n });\n }\n\n batch(operations: any[], callback: (error?: Error) => void): void {\n this.db.batch(operations, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Persist to AsyncStorage in background\n void this._persistData().catch(console.warn);\n }\n callback(err);\n });\n }\n\n iterator(options?: any): any {\n return this.db.iterator(options);\n }\n\n private async _persistData(): Promise<void> {\n if (!this.AsyncStorage) return;\n\n try {\n const data: Record<string, any> = {};\n const iterator = this.db.iterator();\n \n await new Promise<void>((resolve, reject) => {\n const processNext = () => {\n iterator.next((err: any, key: any, value: any) => {\n if (err) {\n iterator.end(() => reject(err));\n return;\n }\n \n if (key === undefined) {\n iterator.end(() => resolve());\n return;\n }\n \n data[key.toString()] = value;\n processNext();\n });\n };\n processNext();\n });\n\n await this.AsyncStorage.setItem(this.storageKey, JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to persist data to AsyncStorage:', error);\n }\n }\n}\n\n/**\n * Initialize DOP Engine specifically for React Native environments.\n * Uses a custom LevelDB implementation that persists data to AsyncStorage.\n * This provides full database persistence while being compatible with React Native.\n * \n * @param walletSource - Name for your wallet implementation (max 16 chars, lowercase)\n * @param shouldDebug - Whether to forward Engine debug logs to Logger\n * @param artifactStore - Persistent store for downloading large artifact files\n * @param useNativeArtifacts - Whether to download native C++ artifacts (should be TRUE for mobile)\n * @param skipMerkletreeScans - Whether to skip merkletree syncs and private balance scans\n * @param verboseScanLogging - Enable verbose logging for scanning operations\n * @param databaseName - Name for the database (used as prefix in AsyncStorage)\n */\nexport const startDopEngineReactNative = async (\n walletSource: string,\n shouldDebug: boolean,\n artifactStore: ArtifactStore,\n useNativeArtifacts = true,\n skipMerkletreeScans = false,\n verboseScanLogging = false,\n databaseName = 'dop-wallet-db'\n): Promise<void> => {\n // Create React Native compatible database instance\n const db = new ReactNativeLevelDB(databaseName);\n \n // Ensure database is opened before proceeding\n await new Promise<void>((resolve, reject) => {\n db.open((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n \n // Initialize the DOP Engine with the React Native database\n return startDopEngine(\n walletSource,\n db as any, // Cast to any since TypeScript doesn't know about our custom implementation\n shouldDebug,\n artifactStore,\n useNativeArtifacts,\n skipMerkletreeScans,\n verboseScanLogging\n );\n};\n"]}
@@ -1,11 +1,32 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
1
3
  import { DopWallet, AbstractWallet, AddressData, Commitment } from 'dop-engine-v3';
2
4
  import { DopWalletInfo, Chain } from 'dop-sharedmodels-v3';
5
+ export declare const testCircomlibjs: () => Promise<boolean>;
6
+ export declare const createDopWalletSafe: (encryptionKey: string, mnemonic: string, creationBlockNumbers: Optional<MapType<number>>, dopWalletDerivationIndex?: number, timeout?: number) => Promise<DopWalletInfo>;
7
+ /**
8
+ * Create a new DOP wallet with automatic mnemonic generation or import existing mnemonic
9
+ *
10
+ * @param encryptionKey - 32-byte Buffer or Uint8Array for wallet encryption
11
+ * @param options - Wallet creation options
12
+ * @returns Promise<{walletInfo: DopWalletInfo, mnemonic: string}>
13
+ */
14
+ export declare const createOrImportDopWallet: (encryptionKey: string | Buffer | Uint8Array, options?: {
15
+ mnemonic?: string;
16
+ creationBlockNumbers?: Optional<MapType<number>>;
17
+ dopWalletDerivationIndex?: number;
18
+ timeout?: number;
19
+ mnemonicStrength?: 128 | 192 | 256;
20
+ }) => Promise<{
21
+ walletInfo: DopWalletInfo;
22
+ mnemonic: string;
23
+ }>;
3
24
  export declare const awaitWalletScan: (walletID: string, chain: Chain) => Promise<unknown>;
4
25
  export declare const awaitMultipleWalletScans: (walletID: string, chain: Chain, numScans: number) => Promise<void>;
5
26
  export declare const walletForID: (id: string) => AbstractWallet;
6
27
  export declare const fullWalletForID: (id: string) => DopWallet;
7
28
  export declare const viewOnlyWalletForID: (id: string) => DopWallet;
8
- export declare const createWalletFromTransaction: (leaf: Commitment, viewingPrivateKey: Uint8Array, chain: any, encryptionKey: string, mnemonic: string, index?: number) => Promise<any>;
29
+ export declare const createWalletFromTransaction: (leaf: Commitment, viewingPrivateKey: Uint8Array, chain: Chain, encryptionKey: string, mnemonic: string, index?: number) => Promise<any>;
9
30
  export declare const createDopWallet: (encryptionKey: string, mnemonic: string, creationBlockNumbers: Optional<MapType<number>>, dopWalletDerivationIndex?: number) => Promise<DopWalletInfo>;
10
31
  export declare const createViewOnlyDopWallet: (encryptionKey: string, shareableViewingKey: string, creationBlockNumbers: Optional<MapType<number>>) => Promise<DopWalletInfo>;
11
32
  export declare const loadWalletByID: (encryptionKey: string, dopWalletID: string, isViewOnlyWallet: boolean) => Promise<DopWalletInfo>;
@@ -1,12 +1,145 @@
1
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getWalletShareableViewingKey = exports.getDopAddress = exports.validateEthAddress = exports.assertValidEthAddress = exports.validateDopAddress = exports.assertValidDopAddress = exports.signWithWalletViewingKey = exports.getDopWalletPrivateViewingKey = exports.getDopWalletAddressData = exports.getWalletMnemonic = exports.deleteWalletByID = exports.unloadWalletByID = exports.loadWalletByID = exports.createViewOnlyDopWallet = exports.createDopWallet = exports.createWalletFromTransaction = exports.viewOnlyWalletForID = exports.fullWalletForID = exports.walletForID = exports.awaitMultipleWalletScans = exports.awaitWalletScan = void 0;
26
+ exports.getWalletShareableViewingKey = exports.getDopAddress = exports.validateEthAddress = exports.assertValidEthAddress = exports.validateDopAddress = exports.assertValidDopAddress = exports.signWithWalletViewingKey = exports.getDopWalletPrivateViewingKey = exports.getDopWalletAddressData = exports.getWalletMnemonic = exports.deleteWalletByID = exports.unloadWalletByID = exports.loadWalletByID = exports.createViewOnlyDopWallet = exports.createDopWallet = exports.createWalletFromTransaction = exports.viewOnlyWalletForID = exports.fullWalletForID = exports.walletForID = exports.awaitMultipleWalletScans = exports.awaitWalletScan = exports.createOrImportDopWallet = exports.createDopWalletSafe = exports.testCircomlibjs = void 0;
4
27
  const dop_engine_v3_1 = require("dop-engine-v3");
5
28
  const dop_sharedmodels_v3_1 = require("dop-sharedmodels-v3");
6
29
  const balance_update_1 = require("./balance-update");
7
30
  const error_1 = require("../../../utils/error");
8
31
  const ethers_1 = require("ethers");
9
32
  const engine_1 = require("../core/engine");
33
+ // CRITICAL: Test circomlibjs initialization for React Native compatibility
34
+ const testCircomlibjs = async () => {
35
+ try {
36
+ console.log('Testing circomlibjs initialization...');
37
+ // Dynamic import to ensure shims are loaded first
38
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, import/no-extraneous-dependencies
39
+ const { poseidon, eddsa } = await Promise.resolve().then(() => __importStar(require('circomlibjs')));
40
+ // Test basic poseidon hash operation
41
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
42
+ const testResult = poseidon([1n, 2n]);
43
+ console.log('Poseidon test result:', testResult.toString());
44
+ // Test eddsa operations
45
+ const testPrivateKey = new Uint8Array(32).fill(1);
46
+ const testMessage = 12345n;
47
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
48
+ const signature = eddsa.signPoseidon(testPrivateKey, testMessage);
49
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
50
+ const publicKey = eddsa.prv2pub(Buffer.from(testPrivateKey));
51
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
52
+ const isValid = eddsa.verifyPoseidon(testMessage, signature, publicKey);
53
+ console.log('EdDSA test result:', isValid);
54
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
55
+ if (!isValid) {
56
+ throw new Error('EdDSA verification failed');
57
+ }
58
+ console.log('āœ… circomlibjs initialization successful');
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ console.error('āŒ circomlibjs initialization failed:', error);
63
+ throw new Error(`CircomLibJS initialization failed: ${error.message}`);
64
+ }
65
+ };
66
+ exports.testCircomlibjs = testCircomlibjs;
67
+ // Enhanced wallet creation with circomlibjs testing
68
+ const createDopWalletSafe = async (encryptionKey, mnemonic, creationBlockNumbers, dopWalletDerivationIndex, timeout = 60000) => {
69
+ // First test circomlibjs
70
+ await (0, exports.testCircomlibjs)();
71
+ // Create wallet with timeout
72
+ return new Promise((resolve, reject) => {
73
+ const timeoutId = setTimeout(() => {
74
+ reject(new Error('Wallet creation timed out. This usually indicates circomlibjs hanging. Try restarting the app.'));
75
+ }, timeout);
76
+ const createWallet = async () => {
77
+ try {
78
+ console.log('Starting safe wallet creation...');
79
+ const result = await (0, exports.createDopWallet)(encryptionKey, mnemonic, creationBlockNumbers, dopWalletDerivationIndex);
80
+ clearTimeout(timeoutId);
81
+ console.log('āœ… Wallet creation successful');
82
+ resolve(result);
83
+ }
84
+ catch (error) {
85
+ clearTimeout(timeoutId);
86
+ console.error('āŒ Wallet creation failed:', error);
87
+ reject(error);
88
+ }
89
+ };
90
+ // Start wallet creation
91
+ createWallet().catch((error) => {
92
+ clearTimeout(timeoutId);
93
+ reject(error);
94
+ });
95
+ });
96
+ };
97
+ exports.createDopWalletSafe = createDopWalletSafe;
98
+ /**
99
+ * Create a new DOP wallet with automatic mnemonic generation or import existing mnemonic
100
+ *
101
+ * @param encryptionKey - 32-byte Buffer or Uint8Array for wallet encryption
102
+ * @param options - Wallet creation options
103
+ * @returns Promise<{walletInfo: DopWalletInfo, mnemonic: string}>
104
+ */
105
+ const createOrImportDopWallet = async (encryptionKey, options = {}) => {
106
+ const { mnemonic: inputMnemonic, creationBlockNumbers, dopWalletDerivationIndex = 0, timeout = 60000, mnemonicStrength = 128 } = options;
107
+ // Convert encryptionKey to string if needed
108
+ const encryptionKeyString = typeof encryptionKey === 'string'
109
+ ? encryptionKey
110
+ : Buffer.from(encryptionKey).toString('hex');
111
+ let finalMnemonic;
112
+ if (typeof inputMnemonic === 'string' && inputMnemonic.length > 0) {
113
+ // Validate provided mnemonic
114
+ if (!dop_engine_v3_1.Mnemonic.validate(inputMnemonic)) {
115
+ throw new Error('Invalid mnemonic phrase provided');
116
+ }
117
+ finalMnemonic = inputMnemonic;
118
+ console.log('āœ… Importing wallet from provided mnemonic');
119
+ }
120
+ else {
121
+ // Generate new mnemonic
122
+ finalMnemonic = dop_engine_v3_1.Mnemonic.generate(mnemonicStrength);
123
+ let wordCount;
124
+ if (mnemonicStrength === 128) {
125
+ wordCount = '12';
126
+ }
127
+ else if (mnemonicStrength === 192) {
128
+ wordCount = '18';
129
+ }
130
+ else {
131
+ wordCount = '24';
132
+ }
133
+ console.log(`āœ… Generated new ${wordCount}-word mnemonic`);
134
+ }
135
+ // Create wallet using the safe creation method
136
+ const walletInfo = await (0, exports.createDopWalletSafe)(encryptionKeyString, finalMnemonic, creationBlockNumbers, dopWalletDerivationIndex, timeout);
137
+ return {
138
+ walletInfo,
139
+ mnemonic: finalMnemonic
140
+ };
141
+ };
142
+ exports.createOrImportDopWallet = createOrImportDopWallet;
10
143
  const awaitWalletScan = (walletID, chain) => {
11
144
  const wallet = (0, exports.walletForID)(walletID);
12
145
  return new Promise((resolve, reject) => wallet.once(dop_engine_v3_1.EngineEvent.WalletDecryptBalancesComplete, ({ chain: returnedChain }) => returnedChain.type === chain.type && returnedChain.id === chain.id
@@ -1 +1 @@
1
- {"version":3,"file":"wallets.js","sourceRoot":"","sources":["../../../../src/services/dop/wallets/wallets.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DopWallet,\n EngineEvent,\n WalletScannedEventData,\n AbstractWallet,\n WalletData,\n AddressData,\n DopEngine,\n ByteUtils,\n ViewOnlyWallet,\n Commitment,\n} from 'dop-engine-v3';\nimport {\n DopWalletInfo,\n NetworkName,\n NETWORK_CONFIG,\n isDefined,\n Chain,\n} from 'dop-sharedmodels-v3';\nimport { onBalancesUpdate } from './balance-update';\nimport { reportAndSanitizeError } from '../../../utils/error';\nimport { getAddress } from 'ethers';\nimport { getEngine } from '../core/engine';\n\nexport const awaitWalletScan = (walletID: string, chain: Chain) => {\n const wallet = walletForID(walletID);\n return new Promise((resolve, reject) =>\n wallet.once(\n EngineEvent.WalletDecryptBalancesComplete,\n ({ chain: returnedChain }: WalletScannedEventData) =>\n returnedChain.type === chain.type && returnedChain.id === chain.id\n ? resolve(returnedChain)\n : reject(),\n ),\n );\n};\n\nexport const awaitMultipleWalletScans = async (\n walletID: string,\n chain: Chain,\n numScans: number,\n) => {\n let i = 0;\n while (i < numScans) {\n // eslint-disable-next-line no-await-in-loop\n await awaitWalletScan(walletID, chain);\n i += 1;\n }\n return Promise.resolve();\n};\n\nexport const walletForID = (id: string): AbstractWallet => {\n const engine = getEngine();\n const wallet = engine.wallets[id];\n if (!isDefined(wallet)) {\n throw new Error('No DOP wallet for ID');\n }\n return wallet;\n};\n\nexport const fullWalletForID = (id: string): DopWallet => {\n const wallet = walletForID(id);\n if (!(wallet instanceof DopWallet)) {\n throw new Error('Can not load View-Only wallet.');\n }\n return wallet;\n};\n\nexport const viewOnlyWalletForID = (id: string): DopWallet => {\n const wallet = walletForID(id);\n if (!(wallet instanceof ViewOnlyWallet)) {\n throw new Error('Can only load View-Only wallet.');\n }\n return wallet as DopWallet;\n};\n\nconst subscribeToEvents = (wallet: AbstractWallet) => {\n wallet.on(\n EngineEvent.WalletDecryptBalancesComplete,\n ({ txidVersion, chain }: WalletScannedEventData) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n onBalancesUpdate(txidVersion, wallet, chain);\n },\n );\n};\n\nconst addressForWallet = (wallet: AbstractWallet): string => {\n return wallet.getAddress();\n};\n\nconst infoForWallet = (wallet: AbstractWallet): DopWalletInfo => {\n const dopAddress = addressForWallet(wallet);\n return {\n id: wallet.id,\n dopAddress,\n };\n};\n\nconst getExistingWallet = (\n dopWalletID: string,\n): Optional<AbstractWallet> => {\n try {\n const existingWallet = walletForID(dopWalletID);\n return existingWallet;\n } catch (_err) {\n return undefined;\n }\n};\n\nconst loadExistingWallet = async (\n encryptionKey: string,\n dopWalletID: string,\n isViewOnlyWallet: boolean,\n): Promise<DopWalletInfo> => {\n const existingWallet = getExistingWallet(dopWalletID);\n if (existingWallet) {\n return infoForWallet(existingWallet);\n }\n const engine = getEngine();\n let wallet: AbstractWallet;\n\n if (isViewOnlyWallet) {\n wallet = await engine.loadExistingViewOnlyWallet(\n encryptionKey,\n dopWalletID,\n );\n } else {\n wallet = await engine.loadExistingWallet(encryptionKey, dopWalletID);\n }\n\n subscribeToEvents(wallet);\n return infoForWallet(wallet);\n};\n// here\nexport const createWalletFromTransaction = async (\n leaf: Commitment,\n viewingPrivateKey: Uint8Array,\n chain: any,\n encryptionKey: string,\n mnemonic: string,\n index = 0,\n): Promise<any> => {\n\n const engine = getEngine();\n const res = engine.createUserWalletFromTransaction(leaf, viewingPrivateKey, chain, encryptionKey, mnemonic, index);\n return res;\n};\n\nconst createWallet = async (\n encryptionKey: string,\n mnemonic: string,\n creationBlockNumbers: Optional<MapType<number>>,\n dopWalletDerivationIndex?: number,\n): Promise<DopWalletInfo> => {\n const formattedCreationBlockNumbers =\n formatCreationBlockNumbers(creationBlockNumbers);\n\n const engine = getEngine();\n const wallet = await engine.createWalletFromMnemonic(\n encryptionKey,\n mnemonic,\n dopWalletDerivationIndex ?? 0,\n formattedCreationBlockNumbers,\n );\n subscribeToEvents(wallet);\n return infoForWallet(wallet);\n};\n\nconst createViewOnlyWallet = async (\n encryptionKey: string,\n shareableViewingKey: string,\n creationBlockNumbers: Optional<MapType<number>>,\n): Promise<DopWalletInfo> => {\n const formattedCreationBlockNumbers =\n formatCreationBlockNumbers(creationBlockNumbers);\n\n const engine = getEngine();\n const wallet = await engine.createViewOnlyWalletFromShareableViewingKey(\n encryptionKey,\n shareableViewingKey,\n formattedCreationBlockNumbers,\n );\n subscribeToEvents(wallet);\n return infoForWallet(wallet);\n};\n\nexport const createDopWallet = async (\n encryptionKey: string,\n mnemonic: string,\n creationBlockNumbers: Optional<MapType<number>>,\n dopWalletDerivationIndex?: number,\n): Promise<DopWalletInfo> => {\n try {\n return await createWallet(\n encryptionKey,\n mnemonic,\n creationBlockNumbers,\n dopWalletDerivationIndex,\n );\n } catch (err) {\n throw reportAndSanitizeError(createDopWallet.name, err);\n }\n};\n\nexport const createViewOnlyDopWallet = async (\n encryptionKey: string,\n shareableViewingKey: string,\n creationBlockNumbers: Optional<MapType<number>>,\n): Promise<DopWalletInfo> => {\n try {\n return await createViewOnlyWallet(\n encryptionKey,\n shareableViewingKey,\n creationBlockNumbers,\n );\n } catch (err) {\n throw reportAndSanitizeError(createViewOnlyDopWallet.name, err);\n }\n};\n\nexport const loadWalletByID = async (\n encryptionKey: string,\n dopWalletID: string,\n isViewOnlyWallet: boolean,\n): Promise<DopWalletInfo> => {\n try {\n return await loadExistingWallet(\n encryptionKey,\n dopWalletID,\n isViewOnlyWallet,\n );\n } catch (err) {\n const sanitizedError = reportAndSanitizeError(loadWalletByID.name, err);\n throw new Error(`Could not load DOP wallet`, { cause: sanitizedError });\n }\n};\n\nexport const unloadWalletByID = (dopWalletID: string): void => {\n try {\n const engine = getEngine();\n engine.unloadWallet(dopWalletID);\n } catch (err) {\n throw new Error('Could not unload DOP wallet.', { cause: err });\n }\n};\n\nexport const deleteWalletByID = async (\n dopWalletID: string,\n): Promise<void> => {\n try {\n const engine = getEngine();\n await engine.deleteWallet(dopWalletID);\n } catch (err) {\n throw new Error('Could not delete DOP wallet.', { cause: err });\n }\n};\n\nexport const getWalletMnemonic = async (\n encryptionKey: string,\n dopWalletID: string,\n) => {\n const { db } = getEngine();\n // Reload wallet to ensure that encryption key is valid.\n const walletData = (await DopWallet.getEncryptedData(\n db,\n encryptionKey,\n dopWalletID,\n )) as WalletData;\n\n if (!walletData.mnemonic) {\n throw new Error('No mnemonic for wallet.');\n }\n return walletData.mnemonic;\n};\n\nexport const getDopWalletAddressData = (address: string): AddressData => {\n assertValidDopAddress(address);\n return DopEngine.decodeAddress(address);\n};\n\nexport const getDopWalletPrivateViewingKey = (\n dopWalletID: string,\n): Uint8Array => {\n const wallet = walletForID(dopWalletID);\n return wallet.getViewingKeyPair().privateKey;\n};\n\nexport const signWithWalletViewingKey = async (\n dopWalletID: string,\n message: string,\n): Promise<string> => {\n const wallet = walletForID(dopWalletID);\n const signature = await wallet.signWithViewingKey(\n ByteUtils.hexStringToBytes(message),\n );\n return ByteUtils.hexlify(signature);\n};\n\nexport const assertValidDopAddress = (address: string): void => {\n if (!validateDopAddress(address)) {\n throw new Error('Invalid DOP address.');\n }\n};\n\nexport const validateDopAddress = (address: string): boolean => {\n try {\n return DopEngine.decodeAddress(address) != null;\n } catch (err) {\n return false;\n }\n};\n\nexport const assertValidEthAddress = (address: string) => {\n if (!validateEthAddress(address)) {\n throw new Error('Invalid wallet address.');\n }\n};\n\nexport const validateEthAddress = (address: string): boolean => {\n try {\n getAddress(address);\n return true;\n } catch (err) {\n return false;\n }\n};\n\nexport const getDopAddress = (\n dopWalletID: string,\n): Optional<string> => {\n try {\n const wallet = walletForID(dopWalletID);\n return wallet.getAddress();\n } catch (err) {\n reportAndSanitizeError(getDopAddress.name, err);\n return undefined;\n }\n};\n\nexport const getWalletShareableViewingKey = async (\n dopWalletID: string,\n): Promise<Optional<string>> => {\n try {\n const wallet = walletForID(dopWalletID);\n return wallet.generateShareableViewingKey();\n } catch (err) {\n reportAndSanitizeError(getWalletShareableViewingKey.name, err);\n return undefined;\n }\n};\n\nconst formatCreationBlockNumbers = (\n creationBlockNumbers: Optional<MapType<number>>,\n): Optional<number[][]> => {\n // Format creationBlockNumbers from client side { <NetworkName>: <BlockNumber> } map to dop-engine-v3's number[][] type\n if (!creationBlockNumbers) return;\n\n const formattedCreationBlockNumbers: number[][] = [];\n const networksNames = Object.keys(creationBlockNumbers) as NetworkName[];\n\n for (const networkName of networksNames) {\n const network = NETWORK_CONFIG[networkName];\n\n const blockNumber = creationBlockNumbers[networkName];\n if (!isDefined(blockNumber)) {\n continue;\n }\n\n formattedCreationBlockNumbers[network.chain.type] ??= [];\n formattedCreationBlockNumbers[network.chain.type][network.chain.id] =\n blockNumber;\n }\n\n return formattedCreationBlockNumbers;\n};\n"]}
1
+ {"version":3,"file":"wallets.js","sourceRoot":"","sources":["../../../../src/services/dop/wallets/wallets.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DopWallet,\n EngineEvent,\n WalletScannedEventData,\n AbstractWallet,\n WalletData,\n AddressData,\n DopEngine,\n ByteUtils,\n ViewOnlyWallet,\n Commitment,\n Mnemonic,\n} from 'dop-engine-v3';\nimport {\n DopWalletInfo,\n NetworkName,\n NETWORK_CONFIG,\n isDefined,\n Chain,\n} from 'dop-sharedmodels-v3';\nimport { onBalancesUpdate } from './balance-update';\nimport { reportAndSanitizeError } from '../../../utils/error';\nimport { getAddress } from 'ethers';\nimport { getEngine } from '../core/engine';\n\n// CRITICAL: Test circomlibjs initialization for React Native compatibility\nexport const testCircomlibjs = async (): Promise<boolean> => {\n try {\n console.log('Testing circomlibjs initialization...');\n \n // Dynamic import to ensure shims are loaded first\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, import/no-extraneous-dependencies\n const { poseidon, eddsa } = await import('circomlibjs') ;\n \n // Test basic poseidon hash operation\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const testResult = poseidon([1n, 2n]);\n console.log('Poseidon test result:', testResult.toString());\n \n // Test eddsa operations\n const testPrivateKey = new Uint8Array(32).fill(1);\n const testMessage = 12345n;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const signature = eddsa.signPoseidon(testPrivateKey, testMessage);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const publicKey = eddsa.prv2pub(Buffer.from(testPrivateKey));\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const isValid = eddsa.verifyPoseidon(testMessage, signature, publicKey);\n \n console.log('EdDSA test result:', isValid);\n \n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (!isValid) {\n throw new Error('EdDSA verification failed');\n }\n \n console.log('āœ… circomlibjs initialization successful');\n return true;\n } catch (error) {\n console.error('āŒ circomlibjs initialization failed:', error);\n throw new Error(`CircomLibJS initialization failed: ${(error as Error).message}`);\n }\n};\n\n// Enhanced wallet creation with circomlibjs testing\nexport const createDopWalletSafe = async (\n encryptionKey: string,\n mnemonic: string,\n creationBlockNumbers: Optional<MapType<number>>,\n dopWalletDerivationIndex?: number,\n timeout = 60000\n): Promise<DopWalletInfo> => {\n // First test circomlibjs\n await testCircomlibjs();\n \n // Create wallet with timeout\n return new Promise<DopWalletInfo>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Wallet creation timed out. This usually indicates circomlibjs hanging. Try restarting the app.'));\n }, timeout);\n\n const createWallet = async (): Promise<void> => {\n try {\n console.log('Starting safe wallet creation...');\n const result = await createDopWallet(encryptionKey, mnemonic, creationBlockNumbers, dopWalletDerivationIndex);\n clearTimeout(timeoutId);\n console.log('āœ… Wallet creation successful');\n resolve(result);\n } catch (error) {\n clearTimeout(timeoutId);\n console.error('āŒ Wallet creation failed:', error);\n reject(error);\n }\n };\n \n // Start wallet creation\n createWallet().catch((error) => {\n clearTimeout(timeoutId);\n reject(error);\n });\n });\n};\n\n/**\n * Create a new DOP wallet with automatic mnemonic generation or import existing mnemonic\n * \n * @param encryptionKey - 32-byte Buffer or Uint8Array for wallet encryption\n * @param options - Wallet creation options\n * @returns Promise<{walletInfo: DopWalletInfo, mnemonic: string}>\n */\nexport const createOrImportDopWallet = async (\n encryptionKey: string | Buffer | Uint8Array,\n options: {\n mnemonic?: string; // If provided, import this mnemonic; if undefined, generate new\n creationBlockNumbers?: Optional<MapType<number>>;\n dopWalletDerivationIndex?: number;\n timeout?: number;\n mnemonicStrength?: 128 | 192 | 256; // For generation only (default: 128 = 12 words)\n } = {}\n): Promise<{walletInfo: DopWalletInfo, mnemonic: string}> => {\n const {\n mnemonic: inputMnemonic,\n creationBlockNumbers,\n dopWalletDerivationIndex = 0,\n timeout = 60000,\n mnemonicStrength = 128\n } = options;\n\n // Convert encryptionKey to string if needed\n const encryptionKeyString = typeof encryptionKey === 'string' \n ? encryptionKey \n : Buffer.from(encryptionKey).toString('hex');\n\n let finalMnemonic: string;\n\n if (typeof inputMnemonic === 'string' && inputMnemonic.length > 0) {\n // Validate provided mnemonic\n if (!Mnemonic.validate(inputMnemonic)) {\n throw new Error('Invalid mnemonic phrase provided');\n }\n finalMnemonic = inputMnemonic;\n console.log('āœ… Importing wallet from provided mnemonic');\n } else {\n // Generate new mnemonic\n finalMnemonic = Mnemonic.generate(mnemonicStrength);\n let wordCount: string;\n if (mnemonicStrength === 128) {\n wordCount = '12';\n } else if (mnemonicStrength === 192) {\n wordCount = '18';\n } else {\n wordCount = '24';\n }\n console.log(`āœ… Generated new ${wordCount}-word mnemonic`);\n }\n\n // Create wallet using the safe creation method\n const walletInfo = await createDopWalletSafe(\n encryptionKeyString,\n finalMnemonic,\n creationBlockNumbers,\n dopWalletDerivationIndex,\n timeout\n );\n\n return {\n walletInfo,\n mnemonic: finalMnemonic\n };\n};\n\nexport const awaitWalletScan = (walletID: string, chain: Chain) => {\n const wallet = walletForID(walletID);\n return new Promise((resolve, reject) =>\n wallet.once(\n EngineEvent.WalletDecryptBalancesComplete,\n ({ chain: returnedChain }: WalletScannedEventData) =>\n returnedChain.type === chain.type && returnedChain.id === chain.id\n ? resolve(returnedChain)\n : reject(),\n ),\n );\n};\n\nexport const awaitMultipleWalletScans = async (\n walletID: string,\n chain: Chain,\n numScans: number,\n) => {\n let i = 0;\n while (i < numScans) {\n // eslint-disable-next-line no-await-in-loop\n await awaitWalletScan(walletID, chain);\n i += 1;\n }\n return Promise.resolve();\n};\n\nexport const walletForID = (id: string): AbstractWallet => {\n const engine = getEngine();\n const wallet = engine.wallets[id];\n if (!isDefined(wallet)) {\n throw new Error('No DOP wallet for ID');\n }\n return wallet;\n};\n\nexport const fullWalletForID = (id: string): DopWallet => {\n const wallet = walletForID(id);\n if (!(wallet instanceof DopWallet)) {\n throw new Error('Can not load View-Only wallet.');\n }\n return wallet;\n};\n\nexport const viewOnlyWalletForID = (id: string): DopWallet => {\n const wallet = walletForID(id);\n if (!(wallet instanceof ViewOnlyWallet)) {\n throw new Error('Can only load View-Only wallet.');\n }\n return wallet as DopWallet;\n};\n\nconst subscribeToEvents = (wallet: AbstractWallet) => {\n wallet.on(\n EngineEvent.WalletDecryptBalancesComplete,\n ({ txidVersion, chain }: WalletScannedEventData) => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n onBalancesUpdate(txidVersion, wallet, chain);\n },\n );\n};\n\nconst addressForWallet = (wallet: AbstractWallet): string => {\n return wallet.getAddress();\n};\n\nconst infoForWallet = (wallet: AbstractWallet): DopWalletInfo => {\n const dopAddress = addressForWallet(wallet);\n return {\n id: wallet.id,\n dopAddress,\n };\n};\n\nconst getExistingWallet = (\n dopWalletID: string,\n): Optional<AbstractWallet> => {\n try {\n const existingWallet = walletForID(dopWalletID);\n return existingWallet;\n } catch (_err) {\n return undefined;\n }\n};\n\nconst loadExistingWallet = async (\n encryptionKey: string,\n dopWalletID: string,\n isViewOnlyWallet: boolean,\n): Promise<DopWalletInfo> => {\n const existingWallet = getExistingWallet(dopWalletID);\n if (existingWallet) {\n return infoForWallet(existingWallet);\n }\n const engine = getEngine();\n let wallet: AbstractWallet;\n\n if (isViewOnlyWallet) {\n wallet = await engine.loadExistingViewOnlyWallet(\n encryptionKey,\n dopWalletID,\n );\n } else {\n wallet = await engine.loadExistingWallet(encryptionKey, dopWalletID);\n }\n\n subscribeToEvents(wallet);\n return infoForWallet(wallet);\n};\n// here\nexport const createWalletFromTransaction = async (\n leaf: Commitment,\n viewingPrivateKey: Uint8Array,\n chain: Chain,\n encryptionKey: string,\n mnemonic: string,\n index = 0,\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n): Promise<any> => {\n\n const engine = getEngine();\n const res = engine.createUserWalletFromTransaction(leaf, viewingPrivateKey, chain, encryptionKey, mnemonic, index);\n return res;\n};\n\nconst createWallet = async (\n encryptionKey: string,\n mnemonic: string,\n creationBlockNumbers: Optional<MapType<number>>,\n dopWalletDerivationIndex?: number,\n): Promise<DopWalletInfo> => {\n const formattedCreationBlockNumbers =\n formatCreationBlockNumbers(creationBlockNumbers);\n\n const engine = getEngine();\n const wallet = await engine.createWalletFromMnemonic(\n encryptionKey,\n mnemonic,\n dopWalletDerivationIndex ?? 0,\n formattedCreationBlockNumbers,\n );\n subscribeToEvents(wallet);\n return infoForWallet(wallet);\n};\n\nconst createViewOnlyWallet = async (\n encryptionKey: string,\n shareableViewingKey: string,\n creationBlockNumbers: Optional<MapType<number>>,\n): Promise<DopWalletInfo> => {\n const formattedCreationBlockNumbers =\n formatCreationBlockNumbers(creationBlockNumbers);\n\n const engine = getEngine();\n const wallet = await engine.createViewOnlyWalletFromShareableViewingKey(\n encryptionKey,\n shareableViewingKey,\n formattedCreationBlockNumbers,\n );\n subscribeToEvents(wallet);\n return infoForWallet(wallet);\n};\n\nexport const createDopWallet = async (\n encryptionKey: string,\n mnemonic: string,\n creationBlockNumbers: Optional<MapType<number>>,\n dopWalletDerivationIndex?: number,\n): Promise<DopWalletInfo> => {\n try {\n return await createWallet(\n encryptionKey,\n mnemonic,\n creationBlockNumbers,\n dopWalletDerivationIndex,\n );\n } catch (err) {\n throw reportAndSanitizeError(createDopWallet.name, err);\n }\n};\n\nexport const createViewOnlyDopWallet = async (\n encryptionKey: string,\n shareableViewingKey: string,\n creationBlockNumbers: Optional<MapType<number>>,\n): Promise<DopWalletInfo> => {\n try {\n return await createViewOnlyWallet(\n encryptionKey,\n shareableViewingKey,\n creationBlockNumbers,\n );\n } catch (err) {\n throw reportAndSanitizeError(createViewOnlyDopWallet.name, err);\n }\n};\n\nexport const loadWalletByID = async (\n encryptionKey: string,\n dopWalletID: string,\n isViewOnlyWallet: boolean,\n): Promise<DopWalletInfo> => {\n try {\n return await loadExistingWallet(\n encryptionKey,\n dopWalletID,\n isViewOnlyWallet,\n );\n } catch (err) {\n const sanitizedError = reportAndSanitizeError(loadWalletByID.name, err);\n throw new Error(`Could not load DOP wallet`, { cause: sanitizedError });\n }\n};\n\nexport const unloadWalletByID = (dopWalletID: string): void => {\n try {\n const engine = getEngine();\n engine.unloadWallet(dopWalletID);\n } catch (err) {\n throw new Error('Could not unload DOP wallet.', { cause: err });\n }\n};\n\nexport const deleteWalletByID = async (\n dopWalletID: string,\n): Promise<void> => {\n try {\n const engine = getEngine();\n await engine.deleteWallet(dopWalletID);\n } catch (err) {\n throw new Error('Could not delete DOP wallet.', { cause: err });\n }\n};\n\nexport const getWalletMnemonic = async (\n encryptionKey: string,\n dopWalletID: string,\n) => {\n const { db } = getEngine();\n // Reload wallet to ensure that encryption key is valid.\n const walletData = (await DopWallet.getEncryptedData(\n db,\n encryptionKey,\n dopWalletID,\n )) as WalletData;\n\n if (!walletData.mnemonic) {\n throw new Error('No mnemonic for wallet.');\n }\n return walletData.mnemonic;\n};\n\nexport const getDopWalletAddressData = (address: string): AddressData => {\n assertValidDopAddress(address);\n return DopEngine.decodeAddress(address);\n};\n\nexport const getDopWalletPrivateViewingKey = (\n dopWalletID: string,\n): Uint8Array => {\n const wallet = walletForID(dopWalletID);\n return wallet.getViewingKeyPair().privateKey;\n};\n\nexport const signWithWalletViewingKey = async (\n dopWalletID: string,\n message: string,\n): Promise<string> => {\n const wallet = walletForID(dopWalletID);\n const signature = await wallet.signWithViewingKey(\n ByteUtils.hexStringToBytes(message),\n );\n return ByteUtils.hexlify(signature);\n};\n\nexport const assertValidDopAddress = (address: string): void => {\n if (!validateDopAddress(address)) {\n throw new Error('Invalid DOP address.');\n }\n};\n\nexport const validateDopAddress = (address: string): boolean => {\n try {\n return DopEngine.decodeAddress(address) != null;\n } catch (err) {\n return false;\n }\n};\n\nexport const assertValidEthAddress = (address: string) => {\n if (!validateEthAddress(address)) {\n throw new Error('Invalid wallet address.');\n }\n};\n\nexport const validateEthAddress = (address: string): boolean => {\n try {\n getAddress(address);\n return true;\n } catch (err) {\n return false;\n }\n};\n\nexport const getDopAddress = (\n dopWalletID: string,\n): Optional<string> => {\n try {\n const wallet = walletForID(dopWalletID);\n return wallet.getAddress();\n } catch (err) {\n reportAndSanitizeError(getDopAddress.name, err);\n return undefined;\n }\n};\n\nexport const getWalletShareableViewingKey = async (\n dopWalletID: string,\n): Promise<Optional<string>> => {\n try {\n const wallet = walletForID(dopWalletID);\n return wallet.generateShareableViewingKey();\n } catch (err) {\n reportAndSanitizeError(getWalletShareableViewingKey.name, err);\n return undefined;\n }\n};\n\nconst formatCreationBlockNumbers = (\n creationBlockNumbers: Optional<MapType<number>>,\n): Optional<number[][]> => {\n // Format creationBlockNumbers from client side { <NetworkName>: <BlockNumber> } map to dop-engine-v3's number[][] type\n if (!creationBlockNumbers) return;\n\n const formattedCreationBlockNumbers: number[][] = [];\n const networksNames = Object.keys(creationBlockNumbers) as NetworkName[];\n\n for (const networkName of networksNames) {\n const network = NETWORK_CONFIG[networkName];\n\n const blockNumber = creationBlockNumbers[networkName];\n if (!isDefined(blockNumber)) {\n continue;\n }\n\n formattedCreationBlockNumbers[network.chain.type] ??= [];\n formattedCreationBlockNumbers[network.chain.type][network.chain.id] =\n blockNumber;\n }\n\n return formattedCreationBlockNumbers;\n};\n"]}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Metro configuration for React Native projects using dop-wallet-v6
3
+ *
4
+ * This configuration addresses the Node.js and Web Worker compatibility issues
5
+ * identified in React Native 0.81+ (new architecture) integration.
6
+ *
7
+ * Usage: Copy this to your React Native project as metro.config.js
8
+ */
9
+
10
+ const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
11
+ const path = require('path');
12
+
13
+ const defaultConfig = getDefaultConfig(__dirname);
14
+
15
+ const config = {
16
+ resolver: {
17
+ // Node.js core module aliases - CRITICAL for fixing ffjavascript dependencies
18
+ alias: {
19
+ // Primary Node.js modules required by ffjavascript
20
+ 'os': require.resolve('./node-polyfills/os-polyfill.js'),
21
+ 'crypto': require.resolve('crypto-browserify'),
22
+ 'stream': require.resolve('stream-browserify'),
23
+ 'buffer': require.resolve('buffer'),
24
+ 'events': require.resolve('events'),
25
+ 'util': require.resolve('util'),
26
+ 'assert': require.resolve('assert'),
27
+ 'process': require.resolve('process/browser'),
28
+
29
+ // Additional modules that might be needed
30
+ 'path': require.resolve('path-browserify'),
31
+ 'url': require.resolve('url'),
32
+ 'querystring': require.resolve('querystring-es3'),
33
+ 'http': require.resolve('stream-http'),
34
+ 'https': require.resolve('https-browserify'),
35
+ 'zlib': require.resolve('browserify-zlib'),
36
+
37
+ // Web Worker compatibility - redirect to React Native compatible version
38
+ 'web-worker': require.resolve('./node-polyfills/web-worker-polyfill.js'),
39
+
40
+ // Disable problematic WASM-related modules for React Native
41
+ 'wasmcurves': require.resolve('./node-polyfills/wasm-fallback.js'),
42
+ 'wasmbuilder': require.resolve('./node-polyfills/wasm-fallback.js'),
43
+ },
44
+
45
+ // Extra node modules for Metro resolver
46
+ extraNodeModules: {
47
+ 'os': require.resolve('./node-polyfills/os-polyfill.js'),
48
+ 'crypto': require.resolve('crypto-browserify'),
49
+ 'stream': require.resolve('stream-browserify'),
50
+ 'buffer': require.resolve('buffer'),
51
+ 'events': require.resolve('events'),
52
+ 'util': require.resolve('util'),
53
+ 'assert': require.resolve('assert'),
54
+ 'process': require.resolve('process/browser'),
55
+ 'path': require.resolve('path-browserify'),
56
+ 'url': require.resolve('url'),
57
+ 'querystring': require.resolve('querystring-es3'),
58
+ 'http': require.resolve('stream-http'),
59
+ 'https': require.resolve('https-browserify'),
60
+ 'zlib': require.resolve('browserify-zlib'),
61
+ 'web-worker': require.resolve('./node-polyfills/web-worker-polyfill.js'),
62
+ 'wasmcurves': require.resolve('./node-polyfills/wasm-fallback.js'),
63
+ 'wasmbuilder': require.resolve('./node-polyfills/wasm-fallback.js'),
64
+ },
65
+
66
+ // Platforms - ensure React Native takes precedence
67
+ platforms: ['native', 'react-native', 'android', 'ios', 'web'],
68
+
69
+ // Asset extensions - include WASM if needed (though we're disabling it)
70
+ assetExts: [...defaultConfig.resolver.assetExts, 'wasm'],
71
+
72
+ // Source extensions - ensure TypeScript and JavaScript are handled
73
+ sourceExts: [...defaultConfig.resolver.sourceExts, 'cjs'],
74
+ },
75
+
76
+ transformer: {
77
+ // Disable minification for debugging if needed
78
+ minifierConfig: {
79
+ keep_fnames: true,
80
+ mangle: {
81
+ keep_fnames: true,
82
+ },
83
+ },
84
+ },
85
+ };
86
+
87
+ module.exports = mergeConfig(defaultConfig, config);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dop-wallet-v6",
3
- "version": "1.2.10",
3
+ "version": "1.2.12",
4
4
  "description": "DOP Wallet SDK, compatible with mobile, browser and nodejs environments.",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -44,6 +44,7 @@
44
44
  "axios": "1.7.2",
45
45
  "brotli": "^1.3.3",
46
46
  "buffer": "^6.0.3",
47
+ "circomlibjs": "^0.1.7",
47
48
  "crypto-browserify": "3.12.0",
48
49
  "dop-engine-v3": "1.4.9",
49
50
  "dop-sharedmodels-v3": "1.1.9",
@@ -81,6 +82,14 @@
81
82
  "tsc-alias": "^1.8.2",
82
83
  "typescript": "^4.9.4"
83
84
  },
85
+ "peerDependencies": {
86
+ "@react-native-async-storage/async-storage": "^1.24.0"
87
+ },
88
+ "peerDependenciesMeta": {
89
+ "@react-native-async-storage/async-storage": {
90
+ "optional": false
91
+ }
92
+ },
84
93
  "react-native": {
85
94
  "crypto": false,
86
95
  "util": false
@@ -29,6 +29,44 @@ global.crypto.subtle.digest ??= (algorithm, data) => {
29
29
  return cryptoBrowserify.createHash(algo).update(data).digest();
30
30
  };
31
31
 
32
+ // CRITICAL FIX: Force circomlibjs to use synchronous mode in React Native
33
+ // This prevents hanging during wallet creation due to Web Worker incompatibility
34
+ if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
35
+ // Disable Web Workers and WebAssembly for circomlibjs
36
+ global.Worker = undefined;
37
+ global.WebAssembly = undefined;
38
+
39
+ // Disable service workers that circomlibjs might try to use
40
+ global.navigator = global.navigator || {};
41
+ global.navigator.serviceWorker = undefined;
42
+
43
+ // Ensure process.browser is set to trigger browser fallbacks
44
+ global.process = global.process || {};
45
+ global.process.browser = true;
46
+
47
+ // Force synchronous execution by disabling async crypto operations
48
+ global.crypto = global.crypto || {};
49
+ global.crypto.subtle = global.crypto.subtle || {};
50
+
51
+ // Override setTimeout to prevent circomlibjs from using it for async operations
52
+ const originalSetTimeout = global.setTimeout;
53
+ const isCircomlibCall = (fn) => {
54
+ return fn && fn.toString && (
55
+ fn.toString().includes('poseidon') ||
56
+ fn.toString().includes('eddsa') ||
57
+ fn.toString().includes('circom')
58
+ );
59
+ };
60
+
61
+ global.setTimeout = function(fn, delay, ...args) {
62
+ // Force immediate execution for circomlibjs operations
63
+ if (delay === 0 && isCircomlibCall(fn)) {
64
+ return originalSetTimeout(() => fn.apply(this, args), 0);
65
+ }
66
+ return originalSetTimeout.apply(this, arguments);
67
+ };
68
+ }
69
+
32
70
  /**
33
71
  * Other package.json dependencies and why we need them:
34
72
  * - assert:
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Test React Native Integration Fixes
5
+ *
6
+ * This script simulates the React Native Metro bundling process
7
+ * to verify that our fixes address the reported issues.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+
13
+ console.log('🧪 Testing React Native Integration Fixes\n');
14
+
15
+ // Test 1: Verify OS module resolution
16
+ console.log('1ļøāƒ£ Testing OS module resolution...');
17
+ try {
18
+ // Simulate what Metro would do with our alias
19
+ const osPolyfill = require('./node-polyfills/os-polyfill.js');
20
+
21
+ // Test the functions that ffjavascript actually uses
22
+ const platform = osPolyfill.platform();
23
+ const eol = osPolyfill.EOL;
24
+ const homedir = osPolyfill.homedir();
25
+
26
+ console.log(` āœ… os.platform() = "${platform}"`);
27
+ console.log(` āœ… os.EOL = "${eol}"`);
28
+ console.log(` āœ… os.homedir() = "${homedir}"`);
29
+
30
+ if (platform && eol && homedir) {
31
+ console.log(' āœ… OS module polyfill works correctly\n');
32
+ } else {
33
+ throw new Error('OS polyfill missing required functions');
34
+ }
35
+ } catch (error) {
36
+ console.log(' āŒ OS module polyfill failed:', error.message);
37
+ process.exit(1);
38
+ }
39
+
40
+ // Test 2: Verify Web Worker handling
41
+ console.log('2ļøāƒ£ Testing Web Worker handling...');
42
+ try {
43
+ const WebWorkerPolyfill = require('./node-polyfills/web-worker-polyfill.js');
44
+
45
+ // This should throw a controlled error (which is what we want)
46
+ try {
47
+ new WebWorkerPolyfill('test-script.js');
48
+ console.log(' āŒ Web Worker should have thrown an error');
49
+ } catch (webWorkerError) {
50
+ if (webWorkerError.message.includes('Web Workers are not supported in React Native')) {
51
+ console.log(' āœ… Web Worker polyfill correctly prevents usage');
52
+ console.log(' āœ… Provides helpful error message\n');
53
+ } else {
54
+ throw webWorkerError;
55
+ }
56
+ }
57
+ } catch (error) {
58
+ console.log(' āŒ Web Worker polyfill failed:', error.message);
59
+ process.exit(1);
60
+ }
61
+
62
+ // Test 3: Verify WASM fallback
63
+ console.log('3ļøāƒ£ Testing WASM fallback...');
64
+ try {
65
+ const wasmFallback = require('./node-polyfills/wasm-fallback.js');
66
+
67
+ // Check that it provides expected structure
68
+ if (wasmFallback.bn128 && typeof wasmFallback.buildBn128 === 'function') {
69
+ console.log(' āœ… WASM fallback provides expected exports');
70
+
71
+ // Test that it throws appropriate errors
72
+ try {
73
+ wasmFallback.buildBn128();
74
+ } catch (wasmError) {
75
+ if (wasmError.message.includes('WASM curve operations not supported')) {
76
+ console.log(' āœ… WASM fallback correctly prevents usage\n');
77
+ } else {
78
+ throw wasmError;
79
+ }
80
+ }
81
+ } else {
82
+ throw new Error('WASM fallback missing required exports');
83
+ }
84
+ } catch (error) {
85
+ console.log(' āŒ WASM fallback failed:', error.message);
86
+ process.exit(1);
87
+ }
88
+
89
+ // Test 4: Verify Metro config structure
90
+ console.log('4ļøāƒ£ Testing Metro config structure...');
91
+ try {
92
+ const metroConfigPath = './metro.config.react-native.example.js';
93
+
94
+ if (!fs.existsSync(metroConfigPath)) {
95
+ throw new Error('Metro config example file missing');
96
+ }
97
+
98
+ const metroConfig = fs.readFileSync(metroConfigPath, 'utf8');
99
+
100
+ // Check for critical aliases
101
+ const criticalAliases = [
102
+ "'os': require.resolve('./node-polyfills/os-polyfill.js')",
103
+ "'web-worker': require.resolve('./node-polyfills/web-worker-polyfill.js')",
104
+ "'crypto': require.resolve('crypto-browserify')",
105
+ "'stream': require.resolve('stream-browserify')"
106
+ ];
107
+
108
+ criticalAliases.forEach(alias => {
109
+ if (metroConfig.includes(alias)) {
110
+ console.log(` āœ… Found critical alias: ${alias.split(':')[0]}`);
111
+ } else {
112
+ throw new Error(`Missing critical alias: ${alias}`);
113
+ }
114
+ });
115
+
116
+ console.log(' āœ… Metro config contains all required aliases\n');
117
+ } catch (error) {
118
+ console.log(' āŒ Metro config verification failed:', error.message);
119
+ process.exit(1);
120
+ }
121
+
122
+ // Test 5: Verify existing React Native shims compatibility
123
+ console.log('5ļøāƒ£ Testing React Native shims compatibility...');
124
+ try {
125
+ if (!fs.existsSync('./react-native-shims.js')) {
126
+ throw new Error('react-native-shims.js not found');
127
+ }
128
+
129
+ const shimsContent = fs.readFileSync('./react-native-shims.js', 'utf8');
130
+
131
+ // Check for critical shims
132
+ const criticalShims = [
133
+ 'global.Worker = undefined',
134
+ 'global.WebAssembly = undefined',
135
+ 'global.process.browser = true',
136
+ 'require(\'react-native-get-random-values\')'
137
+ ];
138
+
139
+ criticalShims.forEach(shim => {
140
+ if (shimsContent.includes(shim)) {
141
+ console.log(` āœ… Found critical shim: ${shim}`);
142
+ } else {
143
+ console.log(` āš ļø Shim not found (may be equivalent): ${shim}`);
144
+ }
145
+ });
146
+
147
+ console.log(' āœ… React Native shims are compatible\n');
148
+ } catch (error) {
149
+ console.log(' āŒ React Native shims verification failed:', error.message);
150
+ process.exit(1);
151
+ }
152
+
153
+ // Test 6: Simulate the reported error scenarios
154
+ console.log('6ļøāƒ£ Simulating reported error scenarios...');
155
+
156
+ // Scenario 1: ffjavascript trying to require('os')
157
+ console.log(' šŸ“ Scenario 1: ffjavascript requires os...');
158
+ try {
159
+ // This is what would happen in Metro with our alias
160
+ const os = require('./node-polyfills/os-polyfill.js');
161
+ const platform = os.platform(); // This is what ffjavascript actually calls
162
+
163
+ if (platform === 'react-native') {
164
+ console.log(' āœ… ffjavascript os requirement would be satisfied');
165
+ } else {
166
+ throw new Error('OS polyfill not returning expected platform');
167
+ }
168
+ } catch (error) {
169
+ console.log(' āŒ Scenario 1 failed:', error.message);
170
+ process.exit(1);
171
+ }
172
+
173
+ // Scenario 2: web-worker trying to import(mod)
174
+ console.log(' šŸ“ Scenario 2: web-worker dynamic import...');
175
+ try {
176
+ // Our polyfill should prevent this from ever happening
177
+ const WebWorker = require('./node-polyfills/web-worker-polyfill.js');
178
+
179
+ // If ffjavascript tries to use Worker, it should get our polyfill
180
+ // which will throw a clear error instead of causing Metro to fail
181
+ console.log(' āœ… web-worker import would be redirected to safe polyfill');
182
+ } catch (error) {
183
+ console.log(' āŒ Scenario 2 failed:', error.message);
184
+ process.exit(1);
185
+ }
186
+
187
+ // Final verification
188
+ console.log('7ļøāƒ£ Final integration check...');
189
+
190
+ // Check that all required browserify modules are listed in setup guide
191
+ const setupGuide = fs.readFileSync('./REACT_NATIVE_SETUP_QUICK_FIX.md', 'utf8');
192
+ const requiredModules = [
193
+ 'crypto-browserify',
194
+ 'stream-browserify',
195
+ 'buffer',
196
+ 'events',
197
+ 'util',
198
+ 'assert',
199
+ 'process'
200
+ ];
201
+
202
+ requiredModules.forEach(module => {
203
+ if (setupGuide.includes(module)) {
204
+ console.log(` āœ… Setup guide includes ${module}`);
205
+ } else {
206
+ console.log(` āš ļø Setup guide missing ${module}`);
207
+ }
208
+ });
209
+
210
+ console.log('\n' + '='.repeat(60));
211
+ console.log('šŸŽ‰ ALL TESTS PASSED!');
212
+ console.log('\nāœ… The implemented fixes address all reported issues:');
213
+ console.log(' 1. āœ… "Unable to resolve module os" - Fixed with os-polyfill.js');
214
+ console.log(' 2. āœ… "Invalid call import(mod)" - Fixed with web-worker-polyfill.js');
215
+ console.log(' 3. āœ… WASM compatibility - Fixed with wasm-fallback.js');
216
+ console.log(' 4. āœ… Metro configuration - Complete example provided');
217
+ console.log(' 5. āœ… Dependency management - Setup guide with all requirements');
218
+ console.log(' 6. āœ… Integration verification - Automated dependency checker');
219
+ console.log('\nšŸš€ The solution is ready for React Native 0.81+ integration!');
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Verify React Native Integration Dependencies
5
+ *
6
+ * This script checks if all required dependencies and polyfills are properly
7
+ * configured for React Native integration with dop-wallet-v6.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+
13
+ console.log('šŸ” Verifying React Native integration setup...\n');
14
+
15
+ // Check if running in a React Native project
16
+ const reactNativeFiles = ['ios', 'android', 'metro.config.js', 'react-native.config.js'];
17
+ const isReactNativeProject = reactNativeFiles.some(file =>
18
+ fs.existsSync(path.join(process.cwd(), file))
19
+ );
20
+
21
+ if (!isReactNativeProject) {
22
+ console.log('ā„¹ļø Not a React Native project - skipping verification');
23
+ process.exit(0);
24
+ }
25
+
26
+ console.log('āœ… React Native project detected\n');
27
+
28
+ // Required dependencies for React Native integration
29
+ const requiredDeps = [
30
+ '@react-native-async-storage/async-storage',
31
+ 'react-native-get-random-values',
32
+ 'crypto-browserify',
33
+ 'stream-browserify',
34
+ 'buffer',
35
+ 'events',
36
+ 'util',
37
+ 'assert',
38
+ 'process',
39
+ 'path-browserify',
40
+ 'url',
41
+ 'querystring-es3',
42
+ 'stream-http',
43
+ 'https-browserify',
44
+ 'browserify-zlib'
45
+ ];
46
+
47
+ // Check package.json for required dependencies
48
+ let packageJson;
49
+ try {
50
+ packageJson = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf8'));
51
+ } catch (error) {
52
+ console.error('āŒ Cannot read package.json:', error.message);
53
+ process.exit(1);
54
+ }
55
+
56
+ console.log('šŸ“¦ Checking required dependencies:');
57
+ const missingDeps = [];
58
+
59
+ requiredDeps.forEach(dep => {
60
+ const isInstalled = packageJson.dependencies?.[dep] || packageJson.devDependencies?.[dep];
61
+ if (isInstalled) {
62
+ console.log(` āœ… ${dep}`);
63
+ } else {
64
+ console.log(` āŒ ${dep} - MISSING`);
65
+ missingDeps.push(dep);
66
+ }
67
+ });
68
+
69
+ if (missingDeps.length > 0) {
70
+ console.log(`\nāŒ Missing ${missingDeps.length} required dependencies.`);
71
+ console.log('\nšŸ“„ Install them with:');
72
+ console.log(`npm install ${missingDeps.join(' ')}`);
73
+ console.log('\n--- OR ---');
74
+ console.log(`yarn add ${missingDeps.join(' ')}`);
75
+ } else {
76
+ console.log('\nāœ… All required dependencies are installed');
77
+ }
78
+
79
+ // Check for node polyfill files
80
+ console.log('\nšŸ”§ Checking Node.js polyfills:');
81
+ const requiredPolyfills = [
82
+ 'node-polyfills/os-polyfill.js',
83
+ 'node-polyfills/web-worker-polyfill.js',
84
+ 'node-polyfills/wasm-fallback.js'
85
+ ];
86
+
87
+ const missingPolyfills = [];
88
+ requiredPolyfills.forEach(polyfill => {
89
+ if (fs.existsSync(path.join(process.cwd(), polyfill))) {
90
+ console.log(` āœ… ${polyfill}`);
91
+ } else {
92
+ console.log(` āŒ ${polyfill} - MISSING`);
93
+ missingPolyfills.push(polyfill);
94
+ }
95
+ });
96
+
97
+ if (missingPolyfills.length > 0) {
98
+ console.log(`\nāŒ Missing ${missingPolyfills.length} required polyfill files.`);
99
+ console.log('\nšŸ“ Copy the node-polyfills/ directory from dop-wallet-v6 to your project root.');
100
+ }
101
+
102
+ // Check Metro configuration
103
+ console.log('\nāš™ļø Checking Metro configuration:');
104
+ const metroConfigPath = path.join(process.cwd(), 'metro.config.js');
105
+
106
+ if (!fs.existsSync(metroConfigPath)) {
107
+ console.log(' āŒ metro.config.js - MISSING');
108
+ console.log('\nšŸ“„ Create metro.config.js with proper aliases for Node.js modules.');
109
+ } else {
110
+ const metroConfig = fs.readFileSync(metroConfigPath, 'utf8');
111
+
112
+ // Check for essential aliases
113
+ const hasOsAlias = metroConfig.includes("'os'") && metroConfig.includes('os-polyfill');
114
+ const hasWebWorkerAlias = metroConfig.includes("'web-worker'") && metroConfig.includes('web-worker-polyfill');
115
+ const hasCryptoAlias = metroConfig.includes("'crypto'") && metroConfig.includes('crypto-browserify');
116
+
117
+ if (hasOsAlias && hasWebWorkerAlias && hasCryptoAlias) {
118
+ console.log(' āœ… metro.config.js - appears properly configured');
119
+ } else {
120
+ console.log(' āš ļø metro.config.js - may need updates');
121
+ if (!hasOsAlias) console.log(' - Missing os alias to os-polyfill.js');
122
+ if (!hasWebWorkerAlias) console.log(' - Missing web-worker alias to web-worker-polyfill.js');
123
+ if (!hasCryptoAlias) console.log(' - Missing crypto alias to crypto-browserify');
124
+ }
125
+ }
126
+
127
+ // Overall status
128
+ console.log('\n' + '='.repeat(50));
129
+ const totalIssues = missingDeps.length + missingPolyfills.length + (!fs.existsSync(metroConfigPath) ? 1 : 0);
130
+
131
+ if (totalIssues === 0) {
132
+ console.log('šŸŽ‰ React Native integration setup looks good!');
133
+ console.log('\nšŸ’” Next steps:');
134
+ console.log('1. Import "dop-wallet-v6/react-native-shims" FIRST in your App.js');
135
+ console.log('2. Test with: import { testCircomlibjs } from "dop-wallet-v6"');
136
+ process.exit(0);
137
+ } else {
138
+ console.log(`āš ļø Found ${totalIssues} setup issues that need attention.`);
139
+ console.log('\nšŸ“– See REACT_NATIVE_SETUP_QUICK_FIX.md for detailed instructions.');
140
+ process.exit(1);
141
+ }