dop-wallet-v6 1.2.13 → 1.2.15
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/ASYNCSTORAGE_FIX_SUMMARY.md +79 -0
- package/BUILD_SUCCESS_SUMMARY.md +103 -0
- package/DOP_WALLET_V6_WALLET_CREATION_GUIDE.md +305 -0
- package/REACT_NATIVE_FIXES_COMPLETE.md +162 -0
- package/REACT_NATIVE_INTEGRATION_FIXES.md +167 -0
- package/REACT_NATIVE_SETUP_QUICK_FIX.md +189 -0
- package/REACT_NATIVE_WALLET_HANGING_FIX.md +270 -0
- package/README.md +14 -1
- package/VERIFICATION_COMPLETE.md +138 -0
- package/WALLET_CREATION_MIGRATION_COMPLETE.md +80 -0
- package/dist/services/dop/core/react-native-init.d.ts +18 -0
- package/dist/services/dop/core/react-native-init.js +30 -24
- package/dist/services/dop/core/react-native-init.js.map +1 -1
- package/dist/services/dop/crypto/react-native-crypto-provider.d.ts +41 -0
- package/dist/services/dop/crypto/react-native-crypto-provider.js +146 -0
- package/dist/services/dop/crypto/react-native-crypto-provider.js.map +1 -0
- package/dist/services/dop/crypto/react-native-rapidsnark-prover.d.ts +49 -0
- package/dist/services/dop/crypto/react-native-rapidsnark-prover.js +202 -0
- package/dist/services/dop/crypto/react-native-rapidsnark-prover.js.map +1 -0
- package/dist/services/dop/util/runtime.d.ts +1 -0
- package/dist/services/dop/util/runtime.js +34 -2
- package/dist/services/dop/util/runtime.js.map +1 -1
- package/dist/services/dop/wallets/wallets.js +47 -46
- package/dist/services/dop/wallets/wallets.js.map +1 -1
- package/issuev3.md +50 -35
- package/metro.config.react-native.example.js +10 -8
- package/node-polyfills/fs-polyfill.js +54 -0
- package/node-polyfills/path-polyfill.js +36 -0
- package/node-polyfills/process-polyfill.js +61 -0
- package/node-polyfills/url-polyfill.js +32 -0
- package/node-polyfills/util-polyfill.js +76 -0
- package/package.json +14 -3
- package/problem.md +41 -0
- package/react-native-shims.js +27 -10
- package/react-native.js +12 -0
- package/WEB_WORKER_TROUBLESHOOTING.md +0 -180
- package/node-polyfills/package.json +0 -9
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# React Native Integration Fixes
|
|
2
|
+
|
|
3
|
+
## Problem Summary
|
|
4
|
+
|
|
5
|
+
Users were experiencing critical setup issues when integrating the DOP Wallet v6 SDK into React Native applications:
|
|
6
|
+
|
|
7
|
+
1. **"Cannot read property 'call' of undefined" errors** during wallet initialization
|
|
8
|
+
2. **Missing polyfill documentation** - essential polyfills were not documented
|
|
9
|
+
3. **Metro configuration requirements** - Node.js core modules needed browserify aliases
|
|
10
|
+
4. **Import order issues** - polyfills needed to be imported in specific order
|
|
11
|
+
|
|
12
|
+
## Root Causes
|
|
13
|
+
|
|
14
|
+
### 1. Missing Polyfills
|
|
15
|
+
The SDK requires several polyfills that were not documented:
|
|
16
|
+
- `react-native-get-random-values` - for crypto.getRandomValues()
|
|
17
|
+
- `react-native-url-polyfill` - for URL APIs
|
|
18
|
+
- `buffer` - for Node.js Buffer support
|
|
19
|
+
|
|
20
|
+
### 2. Missing Metro Configuration
|
|
21
|
+
React Native's Metro bundler needed aliases for Node.js core modules:
|
|
22
|
+
- `stream` → `stream-browserify`
|
|
23
|
+
- `crypto` → `crypto-browserify`
|
|
24
|
+
- `http` → `stream-http`
|
|
25
|
+
- `https` → `https-browserify`
|
|
26
|
+
- `url` → `url`
|
|
27
|
+
- `zlib` → `browserify-zlib`
|
|
28
|
+
- `path` → `path-browserify`
|
|
29
|
+
|
|
30
|
+
### 3. Import Order Dependencies
|
|
31
|
+
Polyfills must be imported before any other modules, including the DOP Wallet SDK.
|
|
32
|
+
|
|
33
|
+
## Solutions Implemented
|
|
34
|
+
|
|
35
|
+
### 1. Updated Integration Guide
|
|
36
|
+
|
|
37
|
+
**File**: `DOP_WALLET_V6_REACT_NATIVE_INTEGRATION_GUIDE.md`
|
|
38
|
+
|
|
39
|
+
#### Added Complete Dependencies Section
|
|
40
|
+
- Comprehensive list of all required dependencies
|
|
41
|
+
- Single command to install everything
|
|
42
|
+
- Version specifications
|
|
43
|
+
|
|
44
|
+
#### Added Metro Configuration
|
|
45
|
+
- Complete `metro.config.js` template
|
|
46
|
+
- Node.js core module aliases
|
|
47
|
+
- Resolver configuration
|
|
48
|
+
|
|
49
|
+
#### Added Critical Import Order Instructions
|
|
50
|
+
- Step-by-step polyfill import guide
|
|
51
|
+
- Warning about import order requirements
|
|
52
|
+
- Global Buffer setup
|
|
53
|
+
|
|
54
|
+
#### Enhanced Troubleshooting Section
|
|
55
|
+
- Specific error messages and solutions
|
|
56
|
+
- Setup verification scripts
|
|
57
|
+
- Complete dependency checklist
|
|
58
|
+
- Debug mode instructions
|
|
59
|
+
|
|
60
|
+
### 2. Documentation Improvements
|
|
61
|
+
|
|
62
|
+
#### Complete Example Updates
|
|
63
|
+
- Proper App.js setup with correct import order
|
|
64
|
+
- Full React Native component example
|
|
65
|
+
- Service file structure
|
|
66
|
+
|
|
67
|
+
#### Platform-Specific Setup
|
|
68
|
+
- iOS Podfile requirements
|
|
69
|
+
- Android build.gradle configuration
|
|
70
|
+
- Pod install instructions
|
|
71
|
+
|
|
72
|
+
#### Verification Tools
|
|
73
|
+
- Setup verification script
|
|
74
|
+
- Runtime checks for polyfills
|
|
75
|
+
- Debug logging helpers
|
|
76
|
+
|
|
77
|
+
## Before vs After
|
|
78
|
+
|
|
79
|
+
### Before (Broken)
|
|
80
|
+
```typescript
|
|
81
|
+
// ❌ This would cause "Cannot read property 'call' of undefined"
|
|
82
|
+
import { createDopWallet } from 'dop-wallet-v6';
|
|
83
|
+
import 'react-native-get-random-values'; // Too late!
|
|
84
|
+
|
|
85
|
+
// Missing Metro config would cause "Module not found" errors
|
|
86
|
+
// Missing dependencies would cause runtime failures
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### After (Working)
|
|
90
|
+
```typescript
|
|
91
|
+
// ✅ Correct order prevents all initialization errors
|
|
92
|
+
import 'react-native-get-random-values';
|
|
93
|
+
import 'react-native-url-polyfill/auto';
|
|
94
|
+
import { Buffer } from 'buffer';
|
|
95
|
+
global.Buffer = global.Buffer || Buffer;
|
|
96
|
+
import 'dop-wallet-v6/react-native-shims';
|
|
97
|
+
|
|
98
|
+
import { createDopWallet } from 'dop-wallet-v6';
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Complete Dependency List
|
|
102
|
+
|
|
103
|
+
### Runtime Dependencies
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"dop-wallet-v6": "^1.2.10",
|
|
107
|
+
"react-native-level-fs": "^3.0.1",
|
|
108
|
+
"@react-native-async-storage/async-storage": "^1.19.0",
|
|
109
|
+
"react-native-get-random-values": "^1.9.0",
|
|
110
|
+
"react-native-url-polyfill": "^2.0.0",
|
|
111
|
+
"buffer": "^6.0.3",
|
|
112
|
+
"stream-browserify": "^3.0.0",
|
|
113
|
+
"crypto-browserify": "^3.12.0",
|
|
114
|
+
"stream-http": "^3.2.0",
|
|
115
|
+
"https-browserify": "^1.0.0",
|
|
116
|
+
"url": "^0.11.3",
|
|
117
|
+
"browserify-zlib": "^0.2.0",
|
|
118
|
+
"path-browserify": "^1.0.1"
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Metro Configuration
|
|
123
|
+
```javascript
|
|
124
|
+
config.resolver.alias = {
|
|
125
|
+
'stream': require.resolve('stream-browserify'),
|
|
126
|
+
'crypto': require.resolve('crypto-browserify'),
|
|
127
|
+
'http': require.resolve('stream-http'),
|
|
128
|
+
'https': require.resolve('https-browserify'),
|
|
129
|
+
'url': require.resolve('url'),
|
|
130
|
+
'zlib': require.resolve('browserify-zlib'),
|
|
131
|
+
'path': require.resolve('path-browserify'),
|
|
132
|
+
'fs': require.resolve('react-native-level-fs'),
|
|
133
|
+
};
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Impact
|
|
137
|
+
|
|
138
|
+
### For Users
|
|
139
|
+
- ✅ **Eliminates setup errors** - No more "Cannot read property 'call' of undefined"
|
|
140
|
+
- ✅ **Clear documentation** - Step-by-step setup instructions
|
|
141
|
+
- ✅ **Verification tools** - Scripts to test setup before integration
|
|
142
|
+
- ✅ **Comprehensive troubleshooting** - Solutions for common issues
|
|
143
|
+
|
|
144
|
+
### For Developers
|
|
145
|
+
- ✅ **Reduced support burden** - Fewer setup-related issues
|
|
146
|
+
- ✅ **Better developer experience** - Clear integration path
|
|
147
|
+
- ✅ **Future-proof setup** - Handles React Native polyfill requirements
|
|
148
|
+
|
|
149
|
+
## Validation
|
|
150
|
+
|
|
151
|
+
The updated integration guide includes:
|
|
152
|
+
1. **Setup verification script** to test polyfill installation
|
|
153
|
+
2. **Complete example** showing working integration
|
|
154
|
+
3. **Troubleshooting guide** for common issues
|
|
155
|
+
4. **Dependency checklist** for verification
|
|
156
|
+
|
|
157
|
+
Users can now follow the guide step-by-step and have a working integration without encountering the previously reported errors.
|
|
158
|
+
|
|
159
|
+
## Version Compatibility
|
|
160
|
+
|
|
161
|
+
This fix documentation is for:
|
|
162
|
+
- **DOP Wallet v6**: v1.2.10+
|
|
163
|
+
- **React Native**: 0.65+
|
|
164
|
+
- **Metro**: 0.76+
|
|
165
|
+
- **Node.js**: 16+
|
|
166
|
+
|
|
167
|
+
The solutions are forward-compatible and should work with future versions of these dependencies.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# React Native Setup Guide for dop-wallet-v6
|
|
2
|
+
|
|
3
|
+
This guide addresses the specific integration issues identified in React Native 0.81+ (new architecture) environments.
|
|
4
|
+
|
|
5
|
+
## Quick Fix for Existing Issues
|
|
6
|
+
|
|
7
|
+
If you're experiencing Metro bundling failures with errors like:
|
|
8
|
+
- `Error: Unable to resolve module os from node_modules/ffjavascript/build/main.cjs`
|
|
9
|
+
- `Invalid call at line 201: import(mod)` from web-worker
|
|
10
|
+
- App hanging during wallet creation
|
|
11
|
+
|
|
12
|
+
Follow these steps:
|
|
13
|
+
|
|
14
|
+
### 1. Install Required Dependencies
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install \
|
|
18
|
+
@react-native-async-storage/async-storage \
|
|
19
|
+
react-native-get-random-values \
|
|
20
|
+
crypto-browserify \
|
|
21
|
+
stream-browserify \
|
|
22
|
+
buffer \
|
|
23
|
+
events \
|
|
24
|
+
util \
|
|
25
|
+
assert \
|
|
26
|
+
process \
|
|
27
|
+
path-browserify \
|
|
28
|
+
url \
|
|
29
|
+
querystring-es3 \
|
|
30
|
+
stream-http \
|
|
31
|
+
https-browserify \
|
|
32
|
+
browserify-zlib
|
|
33
|
+
|
|
34
|
+
# or with yarn
|
|
35
|
+
yarn add \
|
|
36
|
+
@react-native-async-storage/async-storage \
|
|
37
|
+
react-native-get-random-values \
|
|
38
|
+
crypto-browserify \
|
|
39
|
+
stream-browserify \
|
|
40
|
+
buffer \
|
|
41
|
+
events \
|
|
42
|
+
util \
|
|
43
|
+
assert \
|
|
44
|
+
process \
|
|
45
|
+
path-browserify \
|
|
46
|
+
url \
|
|
47
|
+
querystring-es3 \
|
|
48
|
+
stream-http \
|
|
49
|
+
https-browserify \
|
|
50
|
+
browserify-zlib
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. Copy Node.js Polyfills
|
|
54
|
+
|
|
55
|
+
Copy the `node-polyfills/` directory from this package to your React Native project root:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
your-react-native-project/
|
|
59
|
+
├── node-polyfills/
|
|
60
|
+
│ ├── os-polyfill.js
|
|
61
|
+
│ ├── web-worker-polyfill.js
|
|
62
|
+
│ └── wasm-fallback.js
|
|
63
|
+
├── metro.config.js
|
|
64
|
+
└── ...
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. Update Metro Configuration
|
|
68
|
+
|
|
69
|
+
Copy the `metro.config.react-native.example.js` as your `metro.config.js`:
|
|
70
|
+
|
|
71
|
+
```javascript
|
|
72
|
+
// metro.config.js - Copy from metro.config.react-native.example.js
|
|
73
|
+
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
|
|
74
|
+
|
|
75
|
+
const defaultConfig = getDefaultConfig(__dirname);
|
|
76
|
+
|
|
77
|
+
const config = {
|
|
78
|
+
resolver: {
|
|
79
|
+
alias: {
|
|
80
|
+
'os': require.resolve('./node-polyfills/os-polyfill.js'),
|
|
81
|
+
'crypto': require.resolve('crypto-browserify'),
|
|
82
|
+
'stream': require.resolve('stream-browserify'),
|
|
83
|
+
'web-worker': require.resolve('./node-polyfills/web-worker-polyfill.js'),
|
|
84
|
+
// ... other aliases (see full example)
|
|
85
|
+
},
|
|
86
|
+
// ... other configuration
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
module.exports = mergeConfig(defaultConfig, config);
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 4. Initialize the SDK Properly
|
|
94
|
+
|
|
95
|
+
In your app's entry point (typically `App.js` or `index.js`):
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
// CRITICAL: Import shims FIRST, before any other dop-wallet-v6 imports
|
|
99
|
+
import 'dop-wallet-v6/react-native-shims';
|
|
100
|
+
|
|
101
|
+
// Then import the SDK
|
|
102
|
+
import {
|
|
103
|
+
startDopEngineReactNative,
|
|
104
|
+
createDopWalletSafe,
|
|
105
|
+
testCircomlibjs
|
|
106
|
+
} from 'dop-wallet-v6';
|
|
107
|
+
|
|
108
|
+
// Your app code...
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 5. Test the Integration
|
|
112
|
+
|
|
113
|
+
Add this test to verify everything is working:
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
import { testCircomlibjs } from 'dop-wallet-v6';
|
|
117
|
+
|
|
118
|
+
const testDopWalletIntegration = async () => {
|
|
119
|
+
try {
|
|
120
|
+
console.log('Testing dop-wallet-v6 integration...');
|
|
121
|
+
|
|
122
|
+
// This will throw an error if the integration has issues
|
|
123
|
+
await testCircomlibjs();
|
|
124
|
+
|
|
125
|
+
console.log('✅ dop-wallet-v6 integration successful!');
|
|
126
|
+
return true;
|
|
127
|
+
} catch (error) {
|
|
128
|
+
console.error('❌ dop-wallet-v6 integration failed:', error);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Call this in your app's startup
|
|
134
|
+
testDopWalletIntegration();
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Common Error Solutions
|
|
138
|
+
|
|
139
|
+
### Error: "Unable to resolve module os"
|
|
140
|
+
- **Solution**: Ensure the Metro config includes the os-polyfill.js alias
|
|
141
|
+
- **Root cause**: ffjavascript requires Node.js 'os' module
|
|
142
|
+
|
|
143
|
+
### Error: "Invalid call import(mod)"
|
|
144
|
+
- **Solution**: Ensure web-worker is aliased to web-worker-polyfill.js
|
|
145
|
+
- **Root cause**: web-worker package uses dynamic imports incompatible with Metro
|
|
146
|
+
|
|
147
|
+
### App hangs during wallet creation
|
|
148
|
+
- **Solution**: Ensure react-native-shims.js is imported FIRST
|
|
149
|
+
- **Root cause**: circomlibjs trying to use Web Workers in React Native
|
|
150
|
+
|
|
151
|
+
### Error: "Cannot read property 'call' of undefined"
|
|
152
|
+
- **Solution**: Install all browserify polyfills (crypto, stream, buffer, etc.)
|
|
153
|
+
- **Root cause**: Missing Node.js core module polyfills
|
|
154
|
+
|
|
155
|
+
## Architecture Notes
|
|
156
|
+
|
|
157
|
+
The integration works by:
|
|
158
|
+
|
|
159
|
+
1. **Polyfill Layer**: Node.js polyfills provide React Native-compatible implementations
|
|
160
|
+
2. **Metro Aliases**: Redirect problematic modules to safe alternatives
|
|
161
|
+
3. **React Native Shims**: Force circomlibjs into synchronous mode
|
|
162
|
+
4. **Database Layer**: Use memdown + AsyncStorage for persistence
|
|
163
|
+
|
|
164
|
+
This approach maintains full SDK functionality while being compatible with React Native's JavaScript runtime constraints.
|
|
165
|
+
|
|
166
|
+
## Performance Considerations
|
|
167
|
+
|
|
168
|
+
- **Synchronous Mode**: Crypto operations run synchronously, which may block the UI for complex operations
|
|
169
|
+
- **No Web Workers**: All operations run on the main thread
|
|
170
|
+
- **JavaScript Fallbacks**: Pure JS implementations instead of optimized WASM
|
|
171
|
+
|
|
172
|
+
For better UX, consider showing loading indicators during wallet operations.
|
|
173
|
+
|
|
174
|
+
## Troubleshooting
|
|
175
|
+
|
|
176
|
+
If issues persist:
|
|
177
|
+
|
|
178
|
+
1. Clear Metro cache: `npx react-native start --reset-cache`
|
|
179
|
+
2. Clear node_modules: `rm -rf node_modules && npm install`
|
|
180
|
+
3. Check that shims are imported first
|
|
181
|
+
4. Verify all polyfill dependencies are installed
|
|
182
|
+
5. Test with the `testCircomlibjs()` function
|
|
183
|
+
|
|
184
|
+
## Support
|
|
185
|
+
|
|
186
|
+
For additional issues, check the integration guide in the SDK documentation or file an issue with:
|
|
187
|
+
- React Native version
|
|
188
|
+
- Metro bundler output
|
|
189
|
+
- Device/simulator information
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# 🚨 CRITICAL FIX: React Native Wallet Creation Hanging
|
|
2
|
+
|
|
3
|
+
## Problem Summary
|
|
4
|
+
|
|
5
|
+
**Issue**: `createDopWallet()` hangs indefinitely in React Native without any error messages.
|
|
6
|
+
|
|
7
|
+
**Root Cause**: The `circomlibjs` cryptographic library attempts to use Web Workers and WebAssembly, which are not available in React Native, causing the key derivation process to hang during wallet creation.
|
|
8
|
+
|
|
9
|
+
## ✅ IMMEDIATE SOLUTION
|
|
10
|
+
|
|
11
|
+
### 1. Update Your App.js (Entry Point)
|
|
12
|
+
|
|
13
|
+
Add these lines **at the very top** of your App.js, before any other imports:
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
// CRITICAL: Add this FIRST, before any other imports
|
|
17
|
+
import 'react-native-get-random-values';
|
|
18
|
+
import 'react-native-url-polyfill/auto';
|
|
19
|
+
import { Buffer } from 'buffer';
|
|
20
|
+
|
|
21
|
+
// Make Buffer available globally
|
|
22
|
+
global.Buffer = global.Buffer || Buffer;
|
|
23
|
+
|
|
24
|
+
// CRITICAL FIX: Disable Web Workers and WebAssembly for circomlibjs
|
|
25
|
+
global.Worker = undefined;
|
|
26
|
+
global.WebAssembly = undefined;
|
|
27
|
+
global.navigator = global.navigator || {};
|
|
28
|
+
global.navigator.serviceWorker = undefined;
|
|
29
|
+
|
|
30
|
+
// Import DOP Wallet shims (this includes additional circomlibjs fixes)
|
|
31
|
+
import 'dop-wallet-v6/react-native-shims';
|
|
32
|
+
|
|
33
|
+
// NOW safe to import your React components
|
|
34
|
+
import React from 'react';
|
|
35
|
+
import { AppRegistry } from 'react-native';
|
|
36
|
+
import YourMainComponent from './YourMainComponent';
|
|
37
|
+
|
|
38
|
+
const App = () => <YourMainComponent />;
|
|
39
|
+
AppRegistry.registerComponent('YourAppName', () => App);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 2. Use Safe Wallet Creation
|
|
43
|
+
|
|
44
|
+
Replace your current wallet creation code with the new safe method:
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { testCircomlibjs, createDopWalletSafe } from 'dop-wallet-v6';
|
|
48
|
+
|
|
49
|
+
export const createWalletSafely = async () => {
|
|
50
|
+
try {
|
|
51
|
+
// Test circomlibjs first
|
|
52
|
+
console.log('Testing circomlibjs...');
|
|
53
|
+
await testCircomlibjs();
|
|
54
|
+
console.log('✅ CircomLibJS working correctly');
|
|
55
|
+
|
|
56
|
+
// Create wallet with timeout protection
|
|
57
|
+
const encryptionKey = Buffer.from('your-32-byte-hex-key', 'hex');
|
|
58
|
+
const mnemonic = 'your twelve word mnemonic phrase here or leave undefined';
|
|
59
|
+
|
|
60
|
+
const wallet = await createDopWalletSafe(
|
|
61
|
+
encryptionKey,
|
|
62
|
+
mnemonic,
|
|
63
|
+
undefined, // creationBlockNumbers
|
|
64
|
+
0, // derivationIndex
|
|
65
|
+
60000 // 60 second timeout
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
console.log('✅ Wallet created successfully:', wallet.id);
|
|
69
|
+
return wallet;
|
|
70
|
+
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error('❌ Wallet creation failed:', error);
|
|
73
|
+
|
|
74
|
+
if (error.message.includes('timed out')) {
|
|
75
|
+
Alert.alert(
|
|
76
|
+
'Wallet Creation Timeout',
|
|
77
|
+
'The wallet creation process timed out. This usually indicates compatibility issues. Please restart the app and try again.'
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 3. Debug if Still Having Issues
|
|
87
|
+
|
|
88
|
+
If the wallet creation still hangs, use this debug function to isolate the problem:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { testCircomlibjs } from 'dop-wallet-v6';
|
|
92
|
+
|
|
93
|
+
export const debugCircomLibJS = async () => {
|
|
94
|
+
console.log('🔍 Starting CircomLibJS debug test...');
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
// Test with 30 second timeout
|
|
98
|
+
const timeoutPromise = new Promise((_, reject) =>
|
|
99
|
+
setTimeout(() => reject(new Error('CircomLibJS test timed out after 30 seconds')), 30000)
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const testPromise = testCircomlibjs();
|
|
103
|
+
|
|
104
|
+
await Promise.race([testPromise, timeoutPromise]);
|
|
105
|
+
|
|
106
|
+
console.log('✅ CircomLibJS debug test PASSED');
|
|
107
|
+
return true;
|
|
108
|
+
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.error('❌ CircomLibJS debug test FAILED:', error);
|
|
111
|
+
|
|
112
|
+
if (error.message.includes('timed out')) {
|
|
113
|
+
console.error(`
|
|
114
|
+
⚠️ CIRCOMLIBJS IS HANGING!
|
|
115
|
+
|
|
116
|
+
SOLUTIONS:
|
|
117
|
+
1. Restart your React Native app completely
|
|
118
|
+
2. Ensure you added the Worker/WebAssembly disabling code to App.js
|
|
119
|
+
3. Clear Metro cache: npx react-native start --reset-cache
|
|
120
|
+
4. Check that react-native-shims.js is being imported correctly
|
|
121
|
+
`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 🛠️ Additional Fixes
|
|
130
|
+
|
|
131
|
+
### Metro Configuration
|
|
132
|
+
|
|
133
|
+
Ensure your `metro.config.js` includes proper Node.js polyfills:
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
const { getDefaultConfig } = require('expo/metro-config');
|
|
137
|
+
|
|
138
|
+
const config = getDefaultConfig(__dirname);
|
|
139
|
+
|
|
140
|
+
config.resolver.alias = {
|
|
141
|
+
'crypto': require.resolve('crypto-browserify'),
|
|
142
|
+
'stream': require.resolve('stream-browserify'),
|
|
143
|
+
'util': require.resolve('util'),
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// Critical: Ensure circomlibjs uses browser fallbacks
|
|
147
|
+
config.transformer.minifierConfig = {
|
|
148
|
+
mangle: {
|
|
149
|
+
keep_fnames: true, // Keep function names for circomlibjs
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
module.exports = config;
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Package.json Dependencies
|
|
157
|
+
|
|
158
|
+
Ensure you have all required dependencies:
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"dependencies": {
|
|
163
|
+
"dop-wallet-v6": "^1.2.10",
|
|
164
|
+
"react-native-get-random-values": "^1.9.0",
|
|
165
|
+
"react-native-url-polyfill": "^2.0.0",
|
|
166
|
+
"buffer": "^6.0.3",
|
|
167
|
+
"crypto-browserify": "^3.12.0",
|
|
168
|
+
"stream-browserify": "^3.0.0",
|
|
169
|
+
"util": "^0.12.5"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## 🧪 Testing Your Fix
|
|
175
|
+
|
|
176
|
+
Use this simple test to verify everything is working:
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import { Alert } from 'react-native';
|
|
180
|
+
import { testCircomlibjs, createDopWalletSafe } from 'dop-wallet-v6';
|
|
181
|
+
|
|
182
|
+
export const testWalletIntegration = async () => {
|
|
183
|
+
try {
|
|
184
|
+
console.log('🧪 Starting wallet integration test...');
|
|
185
|
+
|
|
186
|
+
// Step 1: Test circomlibjs
|
|
187
|
+
console.log('Step 1: Testing circomlibjs...');
|
|
188
|
+
await testCircomlibjs();
|
|
189
|
+
console.log('✅ Step 1 passed');
|
|
190
|
+
|
|
191
|
+
// Step 2: Test engine initialization
|
|
192
|
+
console.log('Step 2: Testing engine initialization...');
|
|
193
|
+
await initializeDopEngine();
|
|
194
|
+
console.log('✅ Step 2 passed');
|
|
195
|
+
|
|
196
|
+
// Step 3: Test wallet creation
|
|
197
|
+
console.log('Step 3: Testing wallet creation...');
|
|
198
|
+
const encryptionKey = Buffer.from('4b22bfaa2cd4826c04efa1beb5c3debf8a534223200ce50ce3ca979af93911c1', 'hex');
|
|
199
|
+
const testWallet = await createDopWalletSafe(
|
|
200
|
+
encryptionKey,
|
|
201
|
+
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about',
|
|
202
|
+
undefined,
|
|
203
|
+
0,
|
|
204
|
+
30000 // 30 second timeout for testing
|
|
205
|
+
);
|
|
206
|
+
console.log('✅ Step 3 passed - Wallet ID:', testWallet.id);
|
|
207
|
+
|
|
208
|
+
Alert.alert('✅ Success', 'All wallet integration tests passed!');
|
|
209
|
+
return true;
|
|
210
|
+
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.error('❌ Wallet integration test failed:', error);
|
|
213
|
+
Alert.alert('❌ Test Failed', `Error: ${error.message}`);
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## 📞 When to Contact Support
|
|
220
|
+
|
|
221
|
+
Contact the DOP team if:
|
|
222
|
+
|
|
223
|
+
1. ✅ You've implemented all the fixes above
|
|
224
|
+
2. ✅ The `testCircomlibjs()` function passes
|
|
225
|
+
3. ❌ But `createDopWalletSafe()` still hangs
|
|
226
|
+
|
|
227
|
+
Include this debug information:
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
// Run this and include the output when contacting support
|
|
231
|
+
export const collectDebugInfo = async () => {
|
|
232
|
+
const debugInfo = {
|
|
233
|
+
platform: Platform.OS,
|
|
234
|
+
reactNativeVersion: require('react-native/package.json').version,
|
|
235
|
+
timestamp: new Date().toISOString(),
|
|
236
|
+
|
|
237
|
+
// Test basic environment
|
|
238
|
+
hasBuffer: typeof Buffer !== 'undefined',
|
|
239
|
+
hasCrypto: typeof global.crypto !== 'undefined',
|
|
240
|
+
hasWorker: typeof global.Worker !== 'undefined',
|
|
241
|
+
hasWebAssembly: typeof global.WebAssembly !== 'undefined',
|
|
242
|
+
|
|
243
|
+
// Test circomlibjs
|
|
244
|
+
circomlibsTest: null,
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
try {
|
|
248
|
+
await testCircomlibjs();
|
|
249
|
+
debugInfo.circomlibsTest = 'PASSED';
|
|
250
|
+
} catch (error) {
|
|
251
|
+
debugInfo.circomlibsTest = `FAILED: ${error.message}`;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
console.log('Debug Info for Support:', JSON.stringify(debugInfo, null, 2));
|
|
255
|
+
return debugInfo;
|
|
256
|
+
};
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Summary for React Native Developers
|
|
260
|
+
|
|
261
|
+
**The main issue**: DOP Wallet uses advanced cryptography (`circomlibjs`) that doesn't work out-of-the-box in React Native.
|
|
262
|
+
|
|
263
|
+
**The solution**:
|
|
264
|
+
1. Disable Web Workers/WebAssembly **before** importing DOP Wallet
|
|
265
|
+
2. Use the new `createDopWalletSafe()` function with timeout protection
|
|
266
|
+
3. Test with `testCircomlibjs()` to verify everything works
|
|
267
|
+
|
|
268
|
+
**Most important**: Add the Worker/WebAssembly disabling code at the very top of your App.js file, before any other imports.
|
|
269
|
+
|
|
270
|
+
This fix resolves the hanging wallet creation issue that was blocking React Native integration.
|
package/README.md
CHANGED
|
@@ -6,5 +6,18 @@ The DOP Wallet SDK is an open-source project developed by [DOP](https://www.dop.
|
|
|
6
6
|
|
|
7
7
|
The Wallet SDK enables dApp and DeFi developers to provide privacy to users safely and conveniently on Ethereum, Polygon and BNB Chain.
|
|
8
8
|
|
|
9
|
-
The repo is written in TypeScript, and compatible with
|
|
9
|
+
The repo is written in TypeScript, and compatible with **Node.js**, **modern web browsers**, and **React Native**.
|
|
10
|
+
|
|
11
|
+
## 📱 React Native Support
|
|
12
|
+
|
|
13
|
+
This SDK now has comprehensive React Native support with optimized polyfills and easy integration:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import 'react-native-get-random-values';
|
|
17
|
+
import { DopWallet } from 'dop-wallet-v6/react-native';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**📚 Quick Start:** See [REACT_NATIVE_INTEGRATION_GUIDE.md](./REACT_NATIVE_INTEGRATION_GUIDE.md) for complete setup instructions.
|
|
21
|
+
|
|
22
|
+
**🔧 Verify Compatibility:** Run `npm run verify-rn-compatibility` to ensure your setup is correct.
|
|
10
23
|
|