dop-wallet-v6 1.3.32 โ 1.3.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +11 -1
- package/README.md +367 -9
- package/dist/services/dop/core/index.d.ts +4 -0
- package/dist/services/dop/core/index.js +5 -0
- package/dist/services/dop/core/index.js.map +1 -1
- package/dist/services/dop/core/react-native-init.js +28 -1
- package/dist/services/dop/core/react-native-init.js.map +1 -1
- package/dist/services/dop/core/react-native-prover-setup.d.ts +51 -0
- package/dist/services/dop/core/react-native-prover-setup.js +227 -0
- package/dist/services/dop/core/react-native-prover-setup.js.map +1 -0
- package/dist/services/dop/crypto/mopro-circuit-loader.d.ts +103 -0
- package/dist/services/dop/crypto/mopro-circuit-loader.js +308 -0
- package/dist/services/dop/crypto/mopro-circuit-loader.js.map +1 -0
- package/dist/services/dop/crypto/mopro-prover-adapter.d.ts +117 -0
- package/dist/services/dop/crypto/mopro-prover-adapter.js +243 -0
- package/dist/services/dop/crypto/mopro-prover-adapter.js.map +1 -0
- package/dist/services/dop/crypto/user-rapidsnark-adapter.d.ts +98 -0
- package/dist/services/dop/crypto/user-rapidsnark-adapter.js +226 -0
- package/dist/services/dop/crypto/user-rapidsnark-adapter.js.map +1 -0
- package/package.json +1 -1
- package/react-native.js +13 -1
|
@@ -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';\nimport { setLoggers } from '../../../utils/logger';\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 */\nexport class ReactNativeLevelDB {\n private db: any;\n private storageKey: string;\n private AsyncStorage: any;\n private persistTimeout: ReturnType<typeof setTimeout> | null = null;\n private isDirty = false;\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 // Try to require AsyncStorage - this will work in React Native\n this.AsyncStorage = require('@react-native-async-storage/async-storage').default;\n } catch (error) {\n // AsyncStorage not available - this is expected in Node.js test environment\n this.AsyncStorage = null;\n }\n }\n\n // Implement AbstractLevelDOWN interface\n async open(callbackOrOptions?: any, callback?: (error?: Error) => void): Promise<void> {\n // Handle both open(callback) and open(options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof callbackOrOptions === 'function') {\n // open(callback) signature\n cb = callbackOrOptions;\n } else if (typeof callback === 'function') {\n // open(options, callback) signature\n cb = callback;\n } else {\n // No callback provided - this shouldn't happen in AbstractLevelDOWN\n throw new Error('No callback provided to open method');\n }\n\n try {\n // Load persisted data from AsyncStorage (only if available)\n if (this.AsyncStorage) {\n try {\n let persistedData: string | null = null;\n \n // Check if data is stored in chunks\n const chunksCount = await this.AsyncStorage.getItem(`${this.storageKey}_chunks`);\n \n if (chunksCount) {\n console.log(`๐ฆ Loading database from ${String(chunksCount)} chunks...`);\n // Reassemble from chunks\n const chunks: string[] = [];\n const count = parseInt(chunksCount, 10);\n \n if (Number.isNaN(count) || count < 0 || count > 1000) {\n throw new Error(`Invalid chunk count: ${String(chunksCount)}`);\n }\n \n for (let i = 0; i < count; i += 1) {\n const chunk = await this.AsyncStorage.getItem(`${this.storageKey}_chunk_${i}`);\n if (chunk) {\n chunks.push(chunk);\n } else {\n console.warn(`โ ๏ธ Missing chunk ${i} of ${count}, data may be incomplete`);\n }\n }\n \n if (chunks.length === 0) {\n throw new Error('No chunks found, but chunk count was set');\n }\n \n persistedData = chunks.join('');\n console.log(`๐ฆ Reassembled ${chunks.length}/${count} chunks (${(persistedData.length / 1024 / 1024).toFixed(2)}MB)`);\n } else {\n // Try to get data directly\n persistedData = await this.AsyncStorage.getItem(this.storageKey);\n if (persistedData) {\n console.log(`๐ฆ Loading database directly (${(persistedData.length / 1024).toFixed(2)}KB)`);\n }\n }\n \n if (persistedData) {\n // Validate JSON before parsing\n if (!persistedData.trim().startsWith('{') || !persistedData.trim().endsWith('}')) {\n throw new Error('Persisted data does not look like valid JSON (missing braces)');\n }\n \n let data: Record<string, any>;\n try {\n data = JSON.parse(persistedData);\n } catch (jsonError) {\n throw new Error(`JSON parse failed: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`);\n }\n \n // Restore data to memdown instance using batch operations\n const keys = Object.keys(data);\n console.log(`๐ฆ Restoring ${keys.length} entries to database...`);\n \n // Prepare batch operations\n const operations: any[] = [];\n for (const [key, value] of Object.entries(data)) {\n // Restore Buffer/Uint8Array types from base64 with type marker\n let restoredValue = value;\n if (value && typeof value === 'object' && '__type' in value) {\n const typedValue = value as { __type: string; data: string };\n if (typedValue.__type === 'Buffer' && typeof typedValue.data === 'string') {\n restoredValue = Buffer.from(typedValue.data, 'base64');\n } else if (typedValue.__type === 'Uint8Array' && typeof typedValue.data === 'string') {\n restoredValue = new Uint8Array(Buffer.from(typedValue.data, 'base64'));\n }\n }\n \n operations.push({ type: 'put', key, value: restoredValue });\n }\n \n // Restore in batches of 500 for better performance\n const batchSize = 500;\n for (let i = 0; i < operations.length; i += batchSize) {\n const batch = operations.slice(i, i + batchSize);\n await new Promise<void>((resolve, reject) => {\n this.db.batch(batch, (err: any) => {\n if (err) reject(err);\n else resolve();\n });\n });\n console.log(`๐ฆ Restored ${Math.min(i + batchSize, operations.length)}/${operations.length} entries...`);\n }\n \n console.log('โ
Successfully restored database from AsyncStorage');\n } else {\n console.log('โน๏ธ No persisted data found, starting with empty database');\n }\n } catch (asyncStorageError) {\n console.error('โ Failed to load from AsyncStorage, clearing corrupted data and starting fresh:', asyncStorageError);\n \n // Clear corrupted data\n try {\n await this.AsyncStorage.removeItem(this.storageKey);\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Try to remove chunks (up to 100 chunks max)\n for (let i = 0; i < 100; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (exists) {\n await this.AsyncStorage.removeItem(chunkKey);\n } else {\n break; // No more chunks\n }\n }\n console.log('๐งน Cleared corrupted AsyncStorage data');\n } catch (clearError) {\n console.warn('โ ๏ธ Failed to clear corrupted data:', clearError);\n }\n }\n }\n \n // Open the memdown database\n this.db.open(cb);\n } catch (error) {\n cb(error as Error);\n }\n }\n\n close(callback: (error?: Error) => void): void {\n // Clear pending persistence timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n \n // Force immediate persistence before closing if dirty\n if (this.isDirty && this.AsyncStorage) {\n console.log('๐พ Persisting database before close...');\n this.isDirty = false;\n this._persistData()\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .then(() => {\n console.log('โ
Database persisted, closing...');\n this.db.close(callback);\n })\n .catch((error) => {\n console.warn('โ ๏ธ Failed to persist on close:', error);\n this.db.close(callback);\n });\n } else {\n this.db.close(callback);\n }\n }\n\n // Public method to force immediate persistence (useful after scan completes)\n async forcePersist(): Promise<void> {\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n if (this.isDirty && this.AsyncStorage) {\n this.isDirty = false;\n await this._persistData();\n }\n }\n\n // Public method to clear all persisted data (use when recovering from storage full errors)\n async clearPersistedData(): Promise<void> {\n console.log('๐งน Clearing all persisted database data from AsyncStorage...');\n await this._cleanupOldChunks();\n console.log('โ
Cleared all persisted data');\n }\n\n put(key: any, value: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both put(key, value, callback) and put(key, value, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // put(key, value, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // put(key, value, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to put method');\n }\n\n this.db.put(key, value, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n get(key: any, optionsOrCallback?: any, callback?: (error?: Error, value?: any) => void): void {\n // Handle both get(key, callback) and get(key, options, callback) signatures\n let cb: (error?: Error, value?: any) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // get(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // get(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to get method');\n }\n\n this.db.get(key, cb);\n }\n\n del(key: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both del(key, callback) and del(key, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // del(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // del(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to del method');\n }\n\n this.db.del(key, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n clear(options: any, callback: (error?: Error) => void): void {\n // Handle clear operation for deleting ranges of keys\n // This is required by dop-engine-v3's clearNamespace function\n const { gte, lte, gt, lt } = options || {};\n \n if (!gte && !gt) {\n callback(new Error('clear() requires gte or gt option'));\n return;\n }\n\n // Use iterator to find all keys in the range and delete them\n const keysToDelete: any[] = [];\n const iterator = this.db.iterator({\n gte,\n lte,\n gt,\n lt,\n keys: true,\n values: false,\n });\n\n const processNext = () => {\n iterator.next((err: any, key: any) => {\n if (err) {\n iterator.end(() => {\n callback(err);\n });\n return;\n }\n\n if (key === undefined) {\n // No more keys - now delete all collected keys\n iterator.end(() => {\n if (keysToDelete.length === 0) {\n callback();\n return;\n }\n\n // Delete keys in batch\n const operations = keysToDelete.map(k => ({ type: 'del', key: k }));\n this.db.batch(operations, (batchErr: any) => {\n if (!batchErr && this.AsyncStorage) {\n this._schedulePersistence();\n }\n callback(batchErr);\n });\n });\n return;\n }\n\n keysToDelete.push(key);\n processNext();\n });\n };\n\n processNext();\n }\n\n batch(operationsOrCallback?: any, optionsOrCallback?: any, callback?: (error?: Error) => void): any {\n // Handle multiple batch signatures:\n // batch() - returns chained batch\n // batch(operations, callback)\n // batch(operations, options, callback)\n \n if (arguments.length === 0) {\n // batch() - return chained batch (not commonly used in LevelUp)\n return this.db.batch();\n }\n\n // Handle batch operations with callback\n const operations = operationsOrCallback;\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // batch(operations, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // batch(operations, options, callback) signature \n cb = callback;\n } else {\n throw new Error('No callback provided to batch method');\n }\n\n this.db.batch(operations, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n iterator(options?: any): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.db.iterator(options);\n }\n\n private _schedulePersistence(): void {\n this.isDirty = true;\n \n // Clear existing timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n }\n \n // Schedule persistence with longer throttling during heavy writes (every 30 seconds)\n // This dramatically improves scan performance by reducing serialization overhead\n this.persistTimeout = setTimeout(() => {\n if (this.isDirty) {\n this.isDirty = false;\n void this._persistData().catch((error) => {\n console.error('โ ๏ธ Scheduled persistence failed:', error?.message || error);\n // Don't log full stack trace to avoid cluttering console\n });\n }\n }, 30000); // Increased from 5s to 30s\n }\n\n private async _persistData(): Promise<void> {\n if (!this.AsyncStorage) return;\n\n const startTime = Date.now();\n let entryCount = 0;\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 entryCount += 1;\n \n // Preserve Buffer/Uint8Array types by converting to base64 with type marker\n if (Buffer.isBuffer(value)) {\n data[key.toString()] = {\n __type: 'Buffer',\n data: value.toString('base64'),\n };\n } else if (value instanceof Uint8Array) {\n data[key.toString()] = {\n __type: 'Uint8Array',\n data: Buffer.from(value).toString('base64'),\n };\n } else {\n data[key.toString()] = value;\n }\n processNext();\n });\n };\n processNext();\n });\n\n // Serialize data\n let jsonData: string;\n try {\n jsonData = JSON.stringify(data);\n } catch (stringifyError) {\n throw new Error(`Failed to stringify data: ${stringifyError instanceof Error ? stringifyError.message : String(stringifyError)}`);\n }\n \n const serializeTime = Date.now() - startTime;\n const dataSizeMB = jsonData.length / 1024 / 1024;\n \n // React Native AsyncStorage has a 6MB per-item limit and total quota limits\n // Use 500KB chunks to stay well within limits and avoid SQLITE_FULL errors\n const chunkSize = 512 * 1024; // 500KB chunks (conservative for Android)\n \n if (jsonData.length > chunkSize) {\n // Split large data into chunks\n const chunks: string[] = [];\n for (let i = 0; i < jsonData.length; i += chunkSize) {\n chunks.push(jsonData.slice(i, i + chunkSize));\n }\n \n console.log(`๐พ Writing ${chunks.length} chunks (${dataSizeMB.toFixed(2)}MB)...`);\n \n // Check if data is too large (warn if over 50MB)\n if (dataSizeMB > 50) {\n console.warn(`โ ๏ธ Database is very large (${dataSizeMB.toFixed(2)}MB). Consider clearing old data.`);\n }\n \n // Write chunks sequentially to avoid overwhelming AsyncStorage\n // Parallel writes can cause SQLITE_FULL errors\n for (let i = 0; i < chunks.length; i += 1) {\n try {\n await this.AsyncStorage.setItem(`${this.storageKey}_chunk_${i}`, chunks[i]);\n } catch (chunkError: any) {\n // If we hit storage quota, clean up partial writes and throw\n console.error(`โ Failed to write chunk ${i}/${chunks.length}:`, chunkError);\n if (chunkError?.message?.includes('full') || chunkError?.code === 13) {\n console.error('๐ฅ Storage quota exceeded! Cleaning up partial writes...');\n // Only clean up the chunks we just tried to write\n for (let j = 0; j <= i; j += 1) {\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunk_${j}`).catch(() => {});\n }\n throw new Error('AsyncStorage quota exceeded. Please clear app data or restart the app.');\n }\n throw chunkError;\n }\n }\n \n // Clean up any extra chunks from previous saves (if we had more chunks before)\n await this._cleanupExtraChunks(chunks.length);\n \n // Only update chunk count after all chunks are written successfully\n await this.AsyncStorage.setItem(`${this.storageKey}_chunks`, chunks.length.toString());\n \n // Remove direct storage if it exists (migrating from direct to chunked)\n await this.AsyncStorage.removeItem(this.storageKey).catch(() => {});\n \n const totalTime = Date.now() - startTime;\n console.log(`โ
Persisted ${entryCount} entries (${dataSizeMB.toFixed(2)}MB in ${chunks.length} chunks) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n } else {\n // Small data, store directly\n await this.AsyncStorage.setItem(this.storageKey, jsonData);\n \n // Clean up chunked storage if it exists (migrating from chunked to direct)\n await this._cleanupAllChunks();\n \n const totalTime = Date.now() - startTime;\n console.log(`โ
Persisted ${entryCount} entries (${(jsonData.length / 1024).toFixed(2)}KB) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n }\n } catch (error: any) {\n console.error('โ Failed to persist data to AsyncStorage:', error);\n console.error('Error details:', {\n message: error?.message,\n code: error?.code,\n stack: error?.stack?.split('\\n')[0]\n });\n \n // If quota exceeded, clear everything to recover\n if (error?.message?.includes('quota') || error?.message?.includes('full')) {\n console.error('๐ฅ Storage full! Clearing all AsyncStorage data for recovery...');\n await this._cleanupAllChunks();\n }\n \n // Don't mark as dirty - if persistence fails, we don't want to retry infinitely\n // The data is still in memory (memdown) so the app can continue working\n // this.isDirty = true;\n \n // Don't throw - this allows the app to continue even if persistence fails\n // throw error;\n }\n }\n\n private async _cleanupExtraChunks(keepChunkCount: number): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunks beyond the new count (cleanup old data)\n for (let i = keepChunkCount; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (!exists) {\n break; // No more chunks to clean\n }\n await this.AsyncStorage.removeItem(chunkKey);\n }\n } catch (cleanupError) {\n console.warn('โ ๏ธ Error during extra chunk cleanup:', cleanupError);\n }\n }\n\n private async _cleanupAllChunks(): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunk metadata\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Remove all chunk entries (try up to 200 chunks)\n for (let i = 0; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (!exists) {\n break; // No more chunks to clean\n }\n await this.AsyncStorage.removeItem(chunkKey);\n }\n } catch (cleanupError) {\n console.warn('โ ๏ธ Error during chunk cleanup:', cleanupError);\n }\n }\n\n // Keep old method for clearing persisted data (full cleanup)\n private async _cleanupOldChunks(): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunk metadata\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Remove old direct storage (if exists)\n await this.AsyncStorage.removeItem(this.storageKey);\n \n // Remove all chunk entries (try up to 200 chunks)\n for (let i = 0; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n await this.AsyncStorage.removeItem(chunkKey).catch(() => {});\n }\n } catch (cleanupError) {\n console.warn('โ ๏ธ Error during full cleanup:', cleanupError);\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 console\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: boolean,\n skipMerkletreeScans: boolean,\n verboseScanLogging: boolean,\n databaseName = 'dop-wallet-db'\n): Promise<void> => {\n // Create React Native compatible database instance with AsyncStorage persistence\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?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n\n // Set up console logging for React Native\n if (shouldDebug) {\n setLoggers(\n (msg: string) => console.log(`[DOP Wallet] ${msg}`),\n (err: Error | string) => {\n if (err instanceof Error) {\n console.error(`[DOP Wallet Error] ${err.message}`, err);\n } else {\n console.error(`[DOP Wallet Error] ${err}`);\n }\n }\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';\nimport { setLoggers } from '../../../utils/logger';\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 */\nexport class ReactNativeLevelDB {\n private db: any;\n private storageKey: string;\n private AsyncStorage: any;\n private persistTimeout: ReturnType<typeof setTimeout> | null = null;\n private isDirty = false;\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 // Try to require AsyncStorage - this will work in React Native\n this.AsyncStorage = require('@react-native-async-storage/async-storage').default;\n } catch (error) {\n // AsyncStorage not available - this is expected in Node.js test environment\n this.AsyncStorage = null;\n }\n }\n\n // Implement AbstractLevelDOWN interface\n async open(callbackOrOptions?: any, callback?: (error?: Error) => void): Promise<void> {\n // Handle both open(callback) and open(options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof callbackOrOptions === 'function') {\n // open(callback) signature\n cb = callbackOrOptions;\n } else if (typeof callback === 'function') {\n // open(options, callback) signature\n cb = callback;\n } else {\n // No callback provided - this shouldn't happen in AbstractLevelDOWN\n throw new Error('No callback provided to open method');\n }\n\n try {\n // Load persisted data from AsyncStorage (only if available)\n if (this.AsyncStorage) {\n try {\n let persistedData: string | null = null;\n \n // Check if data is stored in chunks\n const chunksCount = await this.AsyncStorage.getItem(`${this.storageKey}_chunks`);\n \n if (chunksCount) {\n console.log(`๐ฆ Loading database from ${String(chunksCount)} chunks...`);\n // Reassemble from chunks\n const chunks: string[] = [];\n const count = parseInt(chunksCount, 10);\n \n if (Number.isNaN(count) || count < 0 || count > 1000) {\n throw new Error(`Invalid chunk count: ${String(chunksCount)}`);\n }\n \n for (let i = 0; i < count; i += 1) {\n const chunk = await this.AsyncStorage.getItem(`${this.storageKey}_chunk_${i}`);\n if (chunk) {\n chunks.push(chunk);\n } else {\n console.warn(`โ ๏ธ Missing chunk ${i} of ${count}, data may be incomplete`);\n }\n }\n \n if (chunks.length === 0) {\n throw new Error('No chunks found, but chunk count was set');\n }\n \n persistedData = chunks.join('');\n console.log(`๐ฆ Reassembled ${chunks.length}/${count} chunks (${(persistedData.length / 1024 / 1024).toFixed(2)}MB)`);\n } else {\n // Try to get data directly\n persistedData = await this.AsyncStorage.getItem(this.storageKey);\n if (persistedData) {\n console.log(`๐ฆ Loading database directly (${(persistedData.length / 1024).toFixed(2)}KB)`);\n }\n }\n \n if (persistedData) {\n // Validate JSON before parsing\n if (!persistedData.trim().startsWith('{') || !persistedData.trim().endsWith('}')) {\n throw new Error('Persisted data does not look like valid JSON (missing braces)');\n }\n \n let data: Record<string, any>;\n try {\n data = JSON.parse(persistedData);\n } catch (jsonError) {\n throw new Error(`JSON parse failed: ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`);\n }\n \n // Restore data to memdown instance using batch operations\n const keys = Object.keys(data);\n console.log(`๐ฆ Restoring ${keys.length} entries to database...`);\n \n // Prepare batch operations\n const operations: any[] = [];\n for (const [key, value] of Object.entries(data)) {\n // Restore Buffer/Uint8Array types from base64 with type marker\n let restoredValue = value;\n if (value && typeof value === 'object' && '__type' in value) {\n const typedValue = value as { __type: string; data: string };\n if (typedValue.__type === 'Buffer' && typeof typedValue.data === 'string') {\n restoredValue = Buffer.from(typedValue.data, 'base64');\n } else if (typedValue.__type === 'Uint8Array' && typeof typedValue.data === 'string') {\n restoredValue = new Uint8Array(Buffer.from(typedValue.data, 'base64'));\n }\n }\n \n operations.push({ type: 'put', key, value: restoredValue });\n }\n \n // Restore in batches of 500 for better performance\n const batchSize = 500;\n for (let i = 0; i < operations.length; i += batchSize) {\n const batch = operations.slice(i, i + batchSize);\n await new Promise<void>((resolve, reject) => {\n this.db.batch(batch, (err: any) => {\n if (err) reject(err);\n else resolve();\n });\n });\n console.log(`๐ฆ Restored ${Math.min(i + batchSize, operations.length)}/${operations.length} entries...`);\n }\n \n console.log('โ
Successfully restored database from AsyncStorage');\n } else {\n console.log('โน๏ธ No persisted data found, starting with empty database');\n }\n } catch (asyncStorageError) {\n console.error('โ Failed to load from AsyncStorage, clearing corrupted data and starting fresh:', asyncStorageError);\n \n // Clear corrupted data\n try {\n await this.AsyncStorage.removeItem(this.storageKey);\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Try to remove chunks (up to 100 chunks max)\n for (let i = 0; i < 100; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (exists) {\n await this.AsyncStorage.removeItem(chunkKey);\n } else {\n break; // No more chunks\n }\n }\n console.log('๐งน Cleared corrupted AsyncStorage data');\n } catch (clearError) {\n console.warn('โ ๏ธ Failed to clear corrupted data:', clearError);\n }\n }\n }\n \n // Open the memdown database\n this.db.open(cb);\n } catch (error) {\n cb(error as Error);\n }\n }\n\n close(callback: (error?: Error) => void): void {\n // Clear pending persistence timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n \n // Force immediate persistence before closing if dirty\n if (this.isDirty && this.AsyncStorage) {\n console.log('๐พ Persisting database before close...');\n this.isDirty = false;\n this._persistData()\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n .then(() => {\n console.log('โ
Database persisted, closing...');\n this.db.close(callback);\n })\n .catch((error) => {\n console.warn('โ ๏ธ Failed to persist on close:', error);\n this.db.close(callback);\n });\n } else {\n this.db.close(callback);\n }\n }\n\n // Public method to force immediate persistence (useful after scan completes)\n async forcePersist(): Promise<void> {\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n this.persistTimeout = null;\n }\n if (this.isDirty && this.AsyncStorage) {\n this.isDirty = false;\n await this._persistData();\n }\n }\n\n // Public method to clear all persisted data (use when recovering from storage full errors)\n async clearPersistedData(): Promise<void> {\n console.log('๐งน Clearing all persisted database data from AsyncStorage...');\n await this._cleanupOldChunks();\n console.log('โ
Cleared all persisted data');\n }\n\n put(key: any, value: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both put(key, value, callback) and put(key, value, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // put(key, value, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // put(key, value, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to put method');\n }\n\n this.db.put(key, value, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n get(key: any, optionsOrCallback?: any, callback?: (error?: Error, value?: any) => void): void {\n // Handle both get(key, callback) and get(key, options, callback) signatures\n let cb: (error?: Error, value?: any) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // get(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // get(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to get method');\n }\n\n this.db.get(key, cb);\n }\n\n del(key: any, optionsOrCallback?: any, callback?: (error?: Error) => void): void {\n // Handle both del(key, callback) and del(key, options, callback) signatures\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // del(key, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // del(key, options, callback) signature\n cb = callback;\n } else {\n throw new Error('No callback provided to del method');\n }\n\n this.db.del(key, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n clear(options: any, callback: (error?: Error) => void): void {\n // Handle clear operation for deleting ranges of keys\n // This is required by dop-engine-v3's clearNamespace function\n const { gte, lte, gt, lt } = options || {};\n \n if (!gte && !gt) {\n callback(new Error('clear() requires gte or gt option'));\n return;\n }\n\n // Use iterator to find all keys in the range and delete them\n const keysToDelete: any[] = [];\n const iterator = this.db.iterator({\n gte,\n lte,\n gt,\n lt,\n keys: true,\n values: false,\n });\n\n const processNext = () => {\n iterator.next((err: any, key: any) => {\n if (err) {\n iterator.end(() => {\n callback(err);\n });\n return;\n }\n\n if (key === undefined) {\n // No more keys - now delete all collected keys\n iterator.end(() => {\n if (keysToDelete.length === 0) {\n callback();\n return;\n }\n\n // Delete keys in batch\n const operations = keysToDelete.map(k => ({ type: 'del', key: k }));\n this.db.batch(operations, (batchErr: any) => {\n if (!batchErr && this.AsyncStorage) {\n this._schedulePersistence();\n }\n callback(batchErr);\n });\n });\n return;\n }\n\n keysToDelete.push(key);\n processNext();\n });\n };\n\n processNext();\n }\n\n batch(operationsOrCallback?: any, optionsOrCallback?: any, callback?: (error?: Error) => void): any {\n // Handle multiple batch signatures:\n // batch() - returns chained batch\n // batch(operations, callback)\n // batch(operations, options, callback)\n \n if (arguments.length === 0) {\n // batch() - return chained batch (not commonly used in LevelUp)\n return this.db.batch();\n }\n\n // Handle batch operations with callback\n const operations = operationsOrCallback;\n let cb: (error?: Error) => void;\n \n if (typeof optionsOrCallback === 'function') {\n // batch(operations, callback) signature\n cb = optionsOrCallback;\n } else if (typeof callback === 'function') {\n // batch(operations, options, callback) signature \n cb = callback;\n } else {\n throw new Error('No callback provided to batch method');\n }\n\n this.db.batch(operations, (err: any) => {\n if (!err && this.AsyncStorage) {\n // Schedule throttled persistence\n this._schedulePersistence();\n }\n cb(err);\n });\n }\n\n iterator(options?: any): any {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return this.db.iterator(options);\n }\n\n private _schedulePersistence(): void {\n this.isDirty = true;\n \n // Clear existing timeout\n if (this.persistTimeout) {\n clearTimeout(this.persistTimeout);\n }\n \n // Schedule persistence with longer throttling during heavy writes (every 30 seconds)\n // This dramatically improves scan performance by reducing serialization overhead\n this.persistTimeout = setTimeout(() => {\n if (this.isDirty) {\n this.isDirty = false;\n void this._persistData().catch((error) => {\n console.error('โ ๏ธ Scheduled persistence failed:', error?.message || error);\n // Don't log full stack trace to avoid cluttering console\n });\n }\n }, 30000); // Increased from 5s to 30s\n }\n\n private async _persistData(): Promise<void> {\n if (!this.AsyncStorage) return;\n\n const startTime = Date.now();\n let entryCount = 0;\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 entryCount += 1;\n \n // Preserve Buffer/Uint8Array types by converting to base64 with type marker\n if (Buffer.isBuffer(value)) {\n data[key.toString()] = {\n __type: 'Buffer',\n data: value.toString('base64'),\n };\n } else if (value instanceof Uint8Array) {\n data[key.toString()] = {\n __type: 'Uint8Array',\n data: Buffer.from(value).toString('base64'),\n };\n } else {\n data[key.toString()] = value;\n }\n processNext();\n });\n };\n processNext();\n });\n\n // Serialize data\n let jsonData: string;\n try {\n jsonData = JSON.stringify(data);\n } catch (stringifyError) {\n throw new Error(`Failed to stringify data: ${stringifyError instanceof Error ? stringifyError.message : String(stringifyError)}`);\n }\n \n const serializeTime = Date.now() - startTime;\n const dataSizeMB = jsonData.length / 1024 / 1024;\n \n // React Native AsyncStorage has a 6MB per-item limit and total quota limits\n // Use 500KB chunks to stay well within limits and avoid SQLITE_FULL errors\n const chunkSize = 512 * 1024; // 500KB chunks (conservative for Android)\n \n if (jsonData.length > chunkSize) {\n // Split large data into chunks\n const chunks: string[] = [];\n for (let i = 0; i < jsonData.length; i += chunkSize) {\n chunks.push(jsonData.slice(i, i + chunkSize));\n }\n \n console.log(`๐พ Writing ${chunks.length} chunks (${dataSizeMB.toFixed(2)}MB)...`);\n \n // Check if data is too large (warn if over 50MB)\n if (dataSizeMB > 50) {\n console.warn(`โ ๏ธ Database is very large (${dataSizeMB.toFixed(2)}MB). Consider clearing old data.`);\n }\n \n // Write chunks sequentially to avoid overwhelming AsyncStorage\n // Parallel writes can cause SQLITE_FULL errors\n for (let i = 0; i < chunks.length; i += 1) {\n try {\n await this.AsyncStorage.setItem(`${this.storageKey}_chunk_${i}`, chunks[i]);\n } catch (chunkError: any) {\n // If we hit storage quota, clean up partial writes and throw\n console.error(`โ Failed to write chunk ${i}/${chunks.length}:`, chunkError);\n if (chunkError?.message?.includes('full') || chunkError?.code === 13) {\n console.error('๐ฅ Storage quota exceeded! Cleaning up partial writes...');\n // Only clean up the chunks we just tried to write\n for (let j = 0; j <= i; j += 1) {\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunk_${j}`).catch(() => {});\n }\n throw new Error('AsyncStorage quota exceeded. Please clear app data or restart the app.');\n }\n throw chunkError;\n }\n }\n \n // Clean up any extra chunks from previous saves (if we had more chunks before)\n await this._cleanupExtraChunks(chunks.length);\n \n // Only update chunk count after all chunks are written successfully\n await this.AsyncStorage.setItem(`${this.storageKey}_chunks`, chunks.length.toString());\n \n // Remove direct storage if it exists (migrating from direct to chunked)\n await this.AsyncStorage.removeItem(this.storageKey).catch(() => {});\n \n const totalTime = Date.now() - startTime;\n console.log(`โ
Persisted ${entryCount} entries (${dataSizeMB.toFixed(2)}MB in ${chunks.length} chunks) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n } else {\n // Small data, store directly\n await this.AsyncStorage.setItem(this.storageKey, jsonData);\n \n // Clean up chunked storage if it exists (migrating from chunked to direct)\n await this._cleanupAllChunks();\n \n const totalTime = Date.now() - startTime;\n console.log(`โ
Persisted ${entryCount} entries (${(jsonData.length / 1024).toFixed(2)}KB) in ${totalTime}ms (serialize: ${serializeTime}ms)`);\n }\n } catch (error: any) {\n console.error('โ Failed to persist data to AsyncStorage:', error);\n console.error('Error details:', {\n message: error?.message,\n code: error?.code,\n stack: error?.stack?.split('\\n')[0]\n });\n \n // If quota exceeded, clear everything to recover\n if (error?.message?.includes('quota') || error?.message?.includes('full')) {\n console.error('๐ฅ Storage full! Clearing all AsyncStorage data for recovery...');\n await this._cleanupAllChunks();\n }\n \n // Don't mark as dirty - if persistence fails, we don't want to retry infinitely\n // The data is still in memory (memdown) so the app can continue working\n // this.isDirty = true;\n \n // Don't throw - this allows the app to continue even if persistence fails\n // throw error;\n }\n }\n\n private async _cleanupExtraChunks(keepChunkCount: number): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunks beyond the new count (cleanup old data)\n for (let i = keepChunkCount; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (!exists) {\n break; // No more chunks to clean\n }\n await this.AsyncStorage.removeItem(chunkKey);\n }\n } catch (cleanupError) {\n console.warn('โ ๏ธ Error during extra chunk cleanup:', cleanupError);\n }\n }\n\n private async _cleanupAllChunks(): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunk metadata\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Remove all chunk entries (try up to 200 chunks)\n for (let i = 0; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n const exists = await this.AsyncStorage.getItem(chunkKey);\n if (!exists) {\n break; // No more chunks to clean\n }\n await this.AsyncStorage.removeItem(chunkKey);\n }\n } catch (cleanupError) {\n console.warn('โ ๏ธ Error during chunk cleanup:', cleanupError);\n }\n }\n\n // Keep old method for clearing persisted data (full cleanup)\n private async _cleanupOldChunks(): Promise<void> {\n if (!this.AsyncStorage) return;\n \n try {\n // Remove chunk metadata\n await this.AsyncStorage.removeItem(`${this.storageKey}_chunks`);\n \n // Remove old direct storage (if exists)\n await this.AsyncStorage.removeItem(this.storageKey);\n \n // Remove all chunk entries (try up to 200 chunks)\n for (let i = 0; i < 200; i += 1) {\n const chunkKey = `${this.storageKey}_chunk_${i}`;\n await this.AsyncStorage.removeItem(chunkKey).catch(() => {});\n }\n } catch (cleanupError) {\n console.warn('โ ๏ธ Error during full cleanup:', cleanupError);\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 console\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: boolean,\n skipMerkletreeScans: boolean,\n verboseScanLogging: boolean,\n databaseName = 'dop-wallet-db'\n): Promise<void> => {\n // Create React Native compatible database instance with AsyncStorage persistence\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?: Error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n\n // Set up console logging for React Native\n if (shouldDebug) {\n setLoggers(\n (msg: string) => console.log(`[DOP Wallet] ${msg}`),\n (err: Error | string) => {\n if (err instanceof Error) {\n console.error(`[DOP Wallet Error] ${err.message}`, err);\n } else {\n console.error(`[DOP Wallet Error] ${err}`);\n }\n }\n );\n }\n\n // Initialize the DOP Engine with the React Native database\n await 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 // CRITICAL: Auto-setup Rapidsnark prover for React Native\n // This enables proof generation for transfers, shield, and unshield operations\n const { autoSetupProverForReactNative } = await import('./react-native-prover-setup');\n await autoSetupProverForReactNative();\n};\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Native Prover Setup
|
|
3
|
+
*
|
|
4
|
+
* This module enables fully on-device zero-knowledge proof generation in React Native
|
|
5
|
+
* using Mopro (Mobile Prover) toolkit.
|
|
6
|
+
*
|
|
7
|
+
* SUPPORTED APPROACHES:
|
|
8
|
+
* 1. Mopro (Recommended) - Full on-device proof generation with native performance
|
|
9
|
+
* 2. Backend Witness Service - Generate witness on backend, proof on device with Rapidsnark
|
|
10
|
+
* 3. Encrypted Transfers Only - Shield operations without proof generation
|
|
11
|
+
*
|
|
12
|
+
* MOPRO INTEGRATION:
|
|
13
|
+
* - Witness generation: Native C++/Rust (2-29x faster than browser)
|
|
14
|
+
* - Proof generation: Native Arkworks or Rapidsnark (8-15x faster than browser)
|
|
15
|
+
* - No WebAssembly required (bypasses React Native limitations)
|
|
16
|
+
* - No backend service needed
|
|
17
|
+
*
|
|
18
|
+
* @see https://zkmopro.org/docs/intro
|
|
19
|
+
* @see MOPRO_INTEGRATION_PLAN.md
|
|
20
|
+
*/
|
|
21
|
+
import { type MoproCircuitLoader } from '../crypto/mopro-circuit-loader';
|
|
22
|
+
/**
|
|
23
|
+
* Check if proof generation is available in React Native
|
|
24
|
+
* Tries Mopro first (recommended), then falls back to Rapidsnark backend approach
|
|
25
|
+
*/
|
|
26
|
+
export declare const checkReactNativeProverSupport: () => Promise<{
|
|
27
|
+
available: boolean;
|
|
28
|
+
method: 'mopro' | 'rapidsnark-backend' | 'none';
|
|
29
|
+
message: string;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Setup Mopro prover for React Native
|
|
33
|
+
* Configures DOP Engine to use Mopro for fully on-device proof generation
|
|
34
|
+
*
|
|
35
|
+
* @param useRapidsnark - Use Rapidsnark backend instead of Arkworks (default: false)
|
|
36
|
+
* @returns true if setup successful
|
|
37
|
+
*/
|
|
38
|
+
export declare const setupMoproProver: (useRapidsnark?: boolean) => Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Setup Groth16 prover for React Native
|
|
41
|
+
* Tries Mopro first, falls back to checking Rapidsnark backend availability
|
|
42
|
+
*/
|
|
43
|
+
export declare const setupReactNativeProver: () => Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Auto-setup prover if in React Native environment
|
|
46
|
+
*/
|
|
47
|
+
export declare const autoSetupProverForReactNative: () => Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get circuit loader instance (for manual circuit preloading)
|
|
50
|
+
*/
|
|
51
|
+
export declare const getCircuitLoader: () => Promise<MoproCircuitLoader | null>;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* React Native Prover Setup
|
|
4
|
+
*
|
|
5
|
+
* This module enables fully on-device zero-knowledge proof generation in React Native
|
|
6
|
+
* using Mopro (Mobile Prover) toolkit.
|
|
7
|
+
*
|
|
8
|
+
* SUPPORTED APPROACHES:
|
|
9
|
+
* 1. Mopro (Recommended) - Full on-device proof generation with native performance
|
|
10
|
+
* 2. Backend Witness Service - Generate witness on backend, proof on device with Rapidsnark
|
|
11
|
+
* 3. Encrypted Transfers Only - Shield operations without proof generation
|
|
12
|
+
*
|
|
13
|
+
* MOPRO INTEGRATION:
|
|
14
|
+
* - Witness generation: Native C++/Rust (2-29x faster than browser)
|
|
15
|
+
* - Proof generation: Native Arkworks or Rapidsnark (8-15x faster than browser)
|
|
16
|
+
* - No WebAssembly required (bypasses React Native limitations)
|
|
17
|
+
* - No backend service needed
|
|
18
|
+
*
|
|
19
|
+
* @see https://zkmopro.org/docs/intro
|
|
20
|
+
* @see MOPRO_INTEGRATION_PLAN.md
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.getCircuitLoader = exports.autoSetupProverForReactNative = exports.setupReactNativeProver = exports.setupMoproProver = exports.checkReactNativeProverSupport = void 0;
|
|
24
|
+
const prover_1 = require("./prover");
|
|
25
|
+
const runtime_1 = require("../util/runtime");
|
|
26
|
+
const react_native_rapidsnark_prover_1 = require("../crypto/react-native-rapidsnark-prover");
|
|
27
|
+
const mopro_prover_adapter_1 = require("../crypto/mopro-prover-adapter");
|
|
28
|
+
const mopro_circuit_loader_1 = require("../crypto/mopro-circuit-loader");
|
|
29
|
+
/**
|
|
30
|
+
* Check if proof generation is available in React Native
|
|
31
|
+
* Tries Mopro first (recommended), then falls back to Rapidsnark backend approach
|
|
32
|
+
*/
|
|
33
|
+
const checkReactNativeProverSupport = async () => {
|
|
34
|
+
if (!runtime_1.isReactNative) {
|
|
35
|
+
return {
|
|
36
|
+
available: true,
|
|
37
|
+
method: 'none',
|
|
38
|
+
message: 'Not in React Native environment'
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
// Try to initialize Mopro (fully on-device)
|
|
43
|
+
const moproInit = await (0, mopro_prover_adapter_1.initializeMopro)();
|
|
44
|
+
const rnfsInit = await (0, mopro_circuit_loader_1.initializeRNFS)();
|
|
45
|
+
if (moproInit && rnfsInit && (0, mopro_prover_adapter_1.isMoproAvailable)() && (0, mopro_circuit_loader_1.isRNFSAvailable)()) {
|
|
46
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
47
|
+
console.log('โ
MOPRO PROOF GENERATION AVAILABLE');
|
|
48
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
49
|
+
console.log('');
|
|
50
|
+
console.log('๐ Fully on-device proof generation enabled via Mopro');
|
|
51
|
+
console.log(' - No backend witness service needed');
|
|
52
|
+
console.log(' - Native performance (8-25x faster than browser)');
|
|
53
|
+
console.log(' - All DOP operations work fully on-device');
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
56
|
+
return {
|
|
57
|
+
available: true,
|
|
58
|
+
method: 'mopro',
|
|
59
|
+
message: 'Mopro initialized successfully'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Mopro not available, try Rapidsnark backend approach
|
|
63
|
+
const rapidsnarkInit = await (0, react_native_rapidsnark_prover_1.initializeRapidsnark)();
|
|
64
|
+
if (rapidsnarkInit && (0, react_native_rapidsnark_prover_1.isRapidsnarkAvailable)()) {
|
|
65
|
+
console.warn('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
66
|
+
console.warn('โ ๏ธ RAPIDSNARK AVAILABLE (BACKEND WITNESS REQUIRED)');
|
|
67
|
+
console.warn('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
68
|
+
console.warn('');
|
|
69
|
+
console.warn('Rapidsnark is available for proof generation, but witness');
|
|
70
|
+
console.warn('calculation must be done on a backend service.');
|
|
71
|
+
console.warn('');
|
|
72
|
+
console.warn('For fully on-device proof generation, install Mopro:');
|
|
73
|
+
console.warn(' npm install mopro-ffi react-native-fs');
|
|
74
|
+
console.warn(' See: https://zkmopro.org/docs/setup/react-native-setup');
|
|
75
|
+
console.warn('');
|
|
76
|
+
console.warn('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
77
|
+
return {
|
|
78
|
+
available: true,
|
|
79
|
+
method: 'rapidsnark-backend',
|
|
80
|
+
message: 'Rapidsnark available, backend witness required'
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Neither Mopro nor Rapidsnark available
|
|
84
|
+
console.error('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
85
|
+
console.error('โ ๏ธ REACT NATIVE PROOF GENERATION NOT AVAILABLE');
|
|
86
|
+
console.error('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
87
|
+
console.error('');
|
|
88
|
+
console.error('The DOP SDK cannot generate zero-knowledge proofs in');
|
|
89
|
+
console.error('React Native because SnarkJS requires WebAssembly.');
|
|
90
|
+
console.error('');
|
|
91
|
+
console.error('RECOMMENDED SOLUTION:');
|
|
92
|
+
console.error('');
|
|
93
|
+
console.error('Install Mopro for fully on-device proof generation:');
|
|
94
|
+
console.error(' npm install mopro-ffi react-native-fs');
|
|
95
|
+
console.error(' Setup guide: https://zkmopro.org/docs/setup/react-native-setup');
|
|
96
|
+
console.error('');
|
|
97
|
+
console.error('Benefits:');
|
|
98
|
+
console.error(' โ
No backend service needed');
|
|
99
|
+
console.error(' โ
8-25x faster than browser');
|
|
100
|
+
console.error(' โ
Native iOS/Android performance');
|
|
101
|
+
console.error(' โ
Privacy-preserving (no data leaves device)');
|
|
102
|
+
console.error('');
|
|
103
|
+
console.error('ALTERNATIVE SOLUTIONS:');
|
|
104
|
+
console.error('');
|
|
105
|
+
console.error('1. Backend Witness Service:');
|
|
106
|
+
console.error(' Install @iden3/react-native-rapidsnark for proof generation');
|
|
107
|
+
console.error(' Set up backend service for witness calculation');
|
|
108
|
+
console.error('');
|
|
109
|
+
console.error('2. Encrypted Transfers Only:');
|
|
110
|
+
console.error(' Shield operations work without proof generation');
|
|
111
|
+
console.error('');
|
|
112
|
+
console.error('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');
|
|
113
|
+
return {
|
|
114
|
+
available: false,
|
|
115
|
+
method: 'none',
|
|
116
|
+
message: 'No proof generation method available'
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error('Error checking React Native prover support:', error);
|
|
121
|
+
return {
|
|
122
|
+
available: false,
|
|
123
|
+
method: 'none',
|
|
124
|
+
message: `Error: ${error instanceof Error ? error.message : String(error)}`
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
exports.checkReactNativeProverSupport = checkReactNativeProverSupport;
|
|
129
|
+
/**
|
|
130
|
+
* Setup Mopro prover for React Native
|
|
131
|
+
* Configures DOP Engine to use Mopro for fully on-device proof generation
|
|
132
|
+
*
|
|
133
|
+
* @param useRapidsnark - Use Rapidsnark backend instead of Arkworks (default: false)
|
|
134
|
+
* @returns true if setup successful
|
|
135
|
+
*/
|
|
136
|
+
const setupMoproProver = async (useRapidsnark = false) => {
|
|
137
|
+
if (!runtime_1.isReactNative) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
// Initialize Mopro and RNFS
|
|
142
|
+
const moproInit = await (0, mopro_prover_adapter_1.initializeMopro)();
|
|
143
|
+
const rnfsInit = await (0, mopro_circuit_loader_1.initializeRNFS)();
|
|
144
|
+
if (!moproInit || !rnfsInit) {
|
|
145
|
+
console.error('โ Failed to initialize Mopro or RNFS');
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
console.log('๐ง Setting up Mopro prover for DOP Engine...');
|
|
149
|
+
// Create Mopro adapter
|
|
150
|
+
const proofLib = useRapidsnark ? mopro_prover_adapter_1.ProofLib.Rapidsnark : mopro_prover_adapter_1.ProofLib.Arkworks;
|
|
151
|
+
const moproAdapter = new mopro_prover_adapter_1.MoproProverAdapter(proofLib);
|
|
152
|
+
// Create circuit loader
|
|
153
|
+
const circuitLoader = await (0, mopro_circuit_loader_1.createCircuitLoader)();
|
|
154
|
+
// Get DOP Engine prover instance
|
|
155
|
+
const prover = (0, prover_1.getProver)();
|
|
156
|
+
// Circuit ID mapping for DOP Engine
|
|
157
|
+
const CIRCUIT_IDS = {
|
|
158
|
+
dop: 0,
|
|
159
|
+
decrypt: 1,
|
|
160
|
+
nullify: 2
|
|
161
|
+
};
|
|
162
|
+
// Configure DOP Engine to use Mopro as native prover
|
|
163
|
+
const moproNativeProver = async (circuitId, _datBuffer, zkeyBuffer, jsonInputs, progressCallback) => {
|
|
164
|
+
// Convert circuit ID to name
|
|
165
|
+
const circuitName = Object.keys(CIRCUIT_IDS).find(key => CIRCUIT_IDS[key] === circuitId) ?? `circuit-${circuitId}`;
|
|
166
|
+
// Load circuit file to device filesystem
|
|
167
|
+
const zkeyPath = await circuitLoader.loadCircuit(circuitName, new Uint8Array(zkeyBuffer));
|
|
168
|
+
// Generate proof with Mopro
|
|
169
|
+
return moproAdapter.generateProof(circuitName, zkeyPath, jsonInputs, progressCallback);
|
|
170
|
+
};
|
|
171
|
+
// Set the native prover in DOP Engine
|
|
172
|
+
prover.setNativeProverGroth16(moproNativeProver, CIRCUIT_IDS);
|
|
173
|
+
console.log('โ
Mopro prover setup complete');
|
|
174
|
+
console.log(` Using proof backend: ${proofLib}`);
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.error('โ Mopro prover setup failed:', error);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
exports.setupMoproProver = setupMoproProver;
|
|
183
|
+
/**
|
|
184
|
+
* Setup Groth16 prover for React Native
|
|
185
|
+
* Tries Mopro first, falls back to checking Rapidsnark backend availability
|
|
186
|
+
*/
|
|
187
|
+
const setupReactNativeProver = async () => {
|
|
188
|
+
if (!runtime_1.isReactNative) {
|
|
189
|
+
return true; // Not in React Native, nothing to do
|
|
190
|
+
}
|
|
191
|
+
const support = await (0, exports.checkReactNativeProverSupport)();
|
|
192
|
+
if (support.method === 'mopro') {
|
|
193
|
+
// Try to setup Mopro
|
|
194
|
+
const moproSetup = await (0, exports.setupMoproProver)();
|
|
195
|
+
if (moproSetup) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return support.available;
|
|
200
|
+
};
|
|
201
|
+
exports.setupReactNativeProver = setupReactNativeProver;
|
|
202
|
+
/**
|
|
203
|
+
* Auto-setup prover if in React Native environment
|
|
204
|
+
*/
|
|
205
|
+
const autoSetupProverForReactNative = async () => {
|
|
206
|
+
if (runtime_1.isReactNative) {
|
|
207
|
+
await (0, exports.setupReactNativeProver)();
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
exports.autoSetupProverForReactNative = autoSetupProverForReactNative;
|
|
211
|
+
/**
|
|
212
|
+
* Get circuit loader instance (for manual circuit preloading)
|
|
213
|
+
*/
|
|
214
|
+
const getCircuitLoader = async () => {
|
|
215
|
+
if (!runtime_1.isReactNative || !(0, mopro_circuit_loader_1.isRNFSAvailable)()) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
return await (0, mopro_circuit_loader_1.createCircuitLoader)();
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
console.error('Failed to create circuit loader:', error);
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
exports.getCircuitLoader = getCircuitLoader;
|
|
227
|
+
//# sourceMappingURL=react-native-prover-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native-prover-setup.js","sourceRoot":"","sources":["../../../../src/services/dop/core/react-native-prover-setup.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * React Native Prover Setup\n * \n * This module enables fully on-device zero-knowledge proof generation in React Native\n * using Mopro (Mobile Prover) toolkit.\n * \n * SUPPORTED APPROACHES:\n * 1. Mopro (Recommended) - Full on-device proof generation with native performance\n * 2. Backend Witness Service - Generate witness on backend, proof on device with Rapidsnark\n * 3. Encrypted Transfers Only - Shield operations without proof generation\n * \n * MOPRO INTEGRATION:\n * - Witness generation: Native C++/Rust (2-29x faster than browser)\n * - Proof generation: Native Arkworks or Rapidsnark (8-15x faster than browser)\n * - No WebAssembly required (bypasses React Native limitations)\n * - No backend service needed\n * \n * @see https://zkmopro.org/docs/intro\n * @see MOPRO_INTEGRATION_PLAN.md\n */\n\nimport { getProver, type FormattedCircuitInputsDop, type Proof } from './prover';\nimport { isReactNative } from '../util/runtime';\nimport { initializeRapidsnark, isRapidsnarkAvailable } from '../crypto/react-native-rapidsnark-prover';\nimport { \n initializeMopro, \n isMoproAvailable, \n MoproProverAdapter,\n ProofLib\n} from '../crypto/mopro-prover-adapter';\nimport { \n initializeRNFS,\n isRNFSAvailable,\n createCircuitLoader,\n type MoproCircuitLoader\n} from '../crypto/mopro-circuit-loader';\n\n/**\n * Check if proof generation is available in React Native\n * Tries Mopro first (recommended), then falls back to Rapidsnark backend approach\n */\nexport const checkReactNativeProverSupport = async (): Promise<{\n available: boolean;\n method: 'mopro' | 'rapidsnark-backend' | 'none';\n message: string;\n}> => {\n if (!isReactNative) {\n return {\n available: true,\n method: 'none',\n message: 'Not in React Native environment'\n };\n }\n\n try {\n // Try to initialize Mopro (fully on-device)\n const moproInit = await initializeMopro();\n const rnfsInit = await initializeRNFS();\n \n if (moproInit && rnfsInit && isMoproAvailable() && isRNFSAvailable()) {\n console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n console.log('โ
MOPRO PROOF GENERATION AVAILABLE');\n console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n console.log('');\n console.log('๐ Fully on-device proof generation enabled via Mopro');\n console.log(' - No backend witness service needed');\n console.log(' - Native performance (8-25x faster than browser)');\n console.log(' - All DOP operations work fully on-device');\n console.log('');\n console.log('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n \n return {\n available: true,\n method: 'mopro',\n message: 'Mopro initialized successfully'\n };\n }\n\n // Mopro not available, try Rapidsnark backend approach\n const rapidsnarkInit = await initializeRapidsnark();\n \n if (rapidsnarkInit && isRapidsnarkAvailable()) {\n console.warn('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n console.warn('โ ๏ธ RAPIDSNARK AVAILABLE (BACKEND WITNESS REQUIRED)');\n console.warn('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n console.warn('');\n console.warn('Rapidsnark is available for proof generation, but witness');\n console.warn('calculation must be done on a backend service.');\n console.warn('');\n console.warn('For fully on-device proof generation, install Mopro:');\n console.warn(' npm install mopro-ffi react-native-fs');\n console.warn(' See: https://zkmopro.org/docs/setup/react-native-setup');\n console.warn('');\n console.warn('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n \n return {\n available: true,\n method: 'rapidsnark-backend',\n message: 'Rapidsnark available, backend witness required'\n };\n }\n\n // Neither Mopro nor Rapidsnark available\n console.error('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n console.error('โ ๏ธ REACT NATIVE PROOF GENERATION NOT AVAILABLE');\n console.error('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n console.error('');\n console.error('The DOP SDK cannot generate zero-knowledge proofs in');\n console.error('React Native because SnarkJS requires WebAssembly.');\n console.error('');\n console.error('RECOMMENDED SOLUTION:');\n console.error('');\n console.error('Install Mopro for fully on-device proof generation:');\n console.error(' npm install mopro-ffi react-native-fs');\n console.error(' Setup guide: https://zkmopro.org/docs/setup/react-native-setup');\n console.error('');\n console.error('Benefits:');\n console.error(' โ
No backend service needed');\n console.error(' โ
8-25x faster than browser');\n console.error(' โ
Native iOS/Android performance');\n console.error(' โ
Privacy-preserving (no data leaves device)');\n console.error('');\n console.error('ALTERNATIVE SOLUTIONS:');\n console.error('');\n console.error('1. Backend Witness Service:');\n console.error(' Install @iden3/react-native-rapidsnark for proof generation');\n console.error(' Set up backend service for witness calculation');\n console.error('');\n console.error('2. Encrypted Transfers Only:');\n console.error(' Shield operations work without proof generation');\n console.error('');\n console.error('โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ');\n \n return {\n available: false,\n method: 'none',\n message: 'No proof generation method available'\n };\n \n } catch (error) {\n console.error('Error checking React Native prover support:', error);\n return {\n available: false,\n method: 'none',\n message: `Error: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n};\n\n/**\n * Setup Mopro prover for React Native\n * Configures DOP Engine to use Mopro for fully on-device proof generation\n * \n * @param useRapidsnark - Use Rapidsnark backend instead of Arkworks (default: false)\n * @returns true if setup successful\n */\nexport const setupMoproProver = async (useRapidsnark = false): Promise<boolean> => {\n if (!isReactNative) {\n return true;\n }\n\n try {\n // Initialize Mopro and RNFS\n const moproInit = await initializeMopro();\n const rnfsInit = await initializeRNFS();\n\n if (!moproInit || !rnfsInit) {\n console.error('โ Failed to initialize Mopro or RNFS');\n return false;\n }\n\n console.log('๐ง Setting up Mopro prover for DOP Engine...');\n\n // Create Mopro adapter\n const proofLib = useRapidsnark ? ProofLib.Rapidsnark : ProofLib.Arkworks;\n const moproAdapter = new MoproProverAdapter(proofLib);\n\n // Create circuit loader\n const circuitLoader = await createCircuitLoader();\n\n // Get DOP Engine prover instance\n const prover = getProver();\n\n // Circuit ID mapping for DOP Engine\n const CIRCUIT_IDS = {\n dop: 0,\n decrypt: 1,\n nullify: 2\n };\n\n // Configure DOP Engine to use Mopro as native prover\n const moproNativeProver = async (\n circuitId: number,\n _datBuffer: Buffer,\n zkeyBuffer: Buffer,\n jsonInputs: FormattedCircuitInputsDop,\n progressCallback?: (progress: number) => void\n ): Promise<Proof> => {\n // Convert circuit ID to name\n const circuitName: string = Object.keys(CIRCUIT_IDS).find(\n key => CIRCUIT_IDS[key as keyof typeof CIRCUIT_IDS] === circuitId\n ) ?? `circuit-${circuitId}`;\n\n // Load circuit file to device filesystem\n const zkeyPath = await circuitLoader.loadCircuit(\n circuitName,\n new Uint8Array(zkeyBuffer)\n );\n\n // Generate proof with Mopro\n return moproAdapter.generateProof(\n circuitName,\n zkeyPath,\n jsonInputs,\n progressCallback\n );\n };\n\n // Set the native prover in DOP Engine\n prover.setNativeProverGroth16(moproNativeProver as any, CIRCUIT_IDS);\n \n console.log('โ
Mopro prover setup complete');\n console.log(` Using proof backend: ${proofLib}`);\n \n return true;\n\n } catch (error) {\n console.error('โ Mopro prover setup failed:', error);\n return false;\n }\n};\n\n/**\n * Setup Groth16 prover for React Native\n * Tries Mopro first, falls back to checking Rapidsnark backend availability\n */\nexport const setupReactNativeProver = async (): Promise<boolean> => {\n if (!isReactNative) {\n return true; // Not in React Native, nothing to do\n }\n\n const support = await checkReactNativeProverSupport();\n \n if (support.method === 'mopro') {\n // Try to setup Mopro\n const moproSetup = await setupMoproProver();\n if (moproSetup) {\n return true;\n }\n }\n\n return support.available;\n};\n\n/**\n * Auto-setup prover if in React Native environment\n */\nexport const autoSetupProverForReactNative = async (): Promise<void> => {\n if (isReactNative) {\n await setupReactNativeProver();\n }\n};\n\n/**\n * Get circuit loader instance (for manual circuit preloading)\n */\nexport const getCircuitLoader = async (): Promise<MoproCircuitLoader | null> => {\n if (!isReactNative || !isRNFSAvailable()) {\n return null;\n }\n\n try {\n return await createCircuitLoader();\n } catch (error) {\n console.error('Failed to create circuit loader:', error);\n return null;\n }\n};\n"]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mopro Circuit Loader for React Native
|
|
3
|
+
*
|
|
4
|
+
* This module handles loading and caching DOP circuit files (zkey) on
|
|
5
|
+
* the React Native device filesystem. Circuit files are downloaded from
|
|
6
|
+
* IPFS by the artifact downloader and then saved to the app's document
|
|
7
|
+
* directory for use by Mopro's native proof generation.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Caches circuit file paths to avoid repeated file operations
|
|
11
|
+
* - Handles circuit file compression (brotli)
|
|
12
|
+
* - Preloads circuits at app startup for faster proof generation
|
|
13
|
+
* - Manages cleanup of old circuit files
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Circuit file information
|
|
17
|
+
*/
|
|
18
|
+
interface CircuitInfo {
|
|
19
|
+
circuitId: string;
|
|
20
|
+
zkeyPath: string;
|
|
21
|
+
fileSize: number;
|
|
22
|
+
loadedAt: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Initialize React Native filesystem module
|
|
26
|
+
*/
|
|
27
|
+
export declare const initializeRNFS: () => Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Check if RNFS is available
|
|
30
|
+
*/
|
|
31
|
+
export declare const isRNFSAvailable: () => boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Mopro Circuit Loader Class
|
|
34
|
+
*
|
|
35
|
+
* Manages circuit files on the React Native filesystem
|
|
36
|
+
*/
|
|
37
|
+
export declare class MoproCircuitLoader {
|
|
38
|
+
private circuitCache;
|
|
39
|
+
private circuitsDir;
|
|
40
|
+
private initialized;
|
|
41
|
+
constructor();
|
|
42
|
+
/**
|
|
43
|
+
* Initialize the circuit loader
|
|
44
|
+
* Creates the circuits directory if it doesn't exist
|
|
45
|
+
*/
|
|
46
|
+
initialize(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Load a circuit file from buffer and save to filesystem
|
|
49
|
+
*
|
|
50
|
+
* @param circuitId - Circuit identifier (e.g., '1x2', '2x2')
|
|
51
|
+
* @param zkeyBuffer - The zkey file buffer
|
|
52
|
+
* @returns Path to the saved zkey file
|
|
53
|
+
*/
|
|
54
|
+
loadCircuit(circuitId: string, zkeyBuffer: Uint8Array): Promise<string>;
|
|
55
|
+
/**
|
|
56
|
+
* Preload multiple circuits at app startup
|
|
57
|
+
* This prevents delays during first proof generation
|
|
58
|
+
*
|
|
59
|
+
* @param circuits - Map of circuitId to zkeyBuffer
|
|
60
|
+
*/
|
|
61
|
+
preloadCircuits(circuits: Map<string, Uint8Array>): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Get cached circuit info
|
|
64
|
+
*/
|
|
65
|
+
getCircuitInfo(circuitId: string): CircuitInfo | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Clear all cached circuits from memory
|
|
68
|
+
* (Files remain on disk)
|
|
69
|
+
*/
|
|
70
|
+
clearCache(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Delete circuit files from filesystem
|
|
73
|
+
*
|
|
74
|
+
* @param circuitIds - Array of circuit IDs to delete, or empty to delete all
|
|
75
|
+
*/
|
|
76
|
+
deleteCircuits(circuitIds?: string[]): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Get total size of cached circuits
|
|
79
|
+
*/
|
|
80
|
+
getTotalCacheSize(): number;
|
|
81
|
+
/**
|
|
82
|
+
* Get cache statistics
|
|
83
|
+
*/
|
|
84
|
+
getCacheStats(): {
|
|
85
|
+
circuitCount: number;
|
|
86
|
+
totalSize: string;
|
|
87
|
+
circuits: CircuitInfo[];
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Convert Uint8Array to base64 string
|
|
91
|
+
*/
|
|
92
|
+
private static bufferToBase64;
|
|
93
|
+
/**
|
|
94
|
+
* Format file size for human readability
|
|
95
|
+
*/
|
|
96
|
+
private static formatFileSize;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create a circuit loader instance
|
|
100
|
+
* Automatically initializes RNFS if not already done
|
|
101
|
+
*/
|
|
102
|
+
export declare const createCircuitLoader: () => Promise<MoproCircuitLoader>;
|
|
103
|
+
export {};
|