@novastera-oss/nitro-metamask 0.3.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +124 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridNitroMetamask.kt +583 -0
  4. package/android/src/main/java/com/{nitrometamask → margelo/nitro/nitrometamask}/MetamaskContextHolder.kt +1 -1
  5. package/android/src/main/java/com/{nitrometamask → margelo/nitro/nitrometamask}/NitroMetamaskPackage.kt +1 -1
  6. package/app.plugin.js +121 -0
  7. package/ios/HybridNitroMetamask.swift +107 -1
  8. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts +36 -1
  9. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts.map +1 -1
  10. package/nitrogen/generated/android/NitroMetamask+autolinking.cmake +2 -0
  11. package/nitrogen/generated/android/c++/JConnectResult.hpp +3 -3
  12. package/nitrogen/generated/android/c++/JConnectSignResult.hpp +65 -0
  13. package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.cpp +62 -0
  14. package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.hpp +4 -0
  15. package/nitrogen/generated/android/c++/JVariant_NullType_Long.cpp +26 -0
  16. package/nitrogen/generated/android/c++/JVariant_NullType_Long.hpp +69 -0
  17. package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +26 -0
  18. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +70 -0
  19. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectResult.kt +2 -2
  20. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectSignResult.kt +44 -0
  21. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/HybridNitroMetamaskSpec.kt +17 -0
  22. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_Long.kt +59 -0
  23. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_String.kt +59 -0
  24. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.cpp +24 -0
  25. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.hpp +217 -0
  26. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Umbrella.hpp +6 -0
  27. package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.hpp +37 -1
  28. package/nitrogen/generated/ios/swift/ConnectResult.swift +2 -2
  29. package/nitrogen/generated/ios/swift/ConnectSignResult.swift +40 -0
  30. package/nitrogen/generated/ios/swift/Func_void_ConnectSignResult.swift +47 -0
  31. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__int64_t_.swift +59 -0
  32. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__std__string_.swift +59 -0
  33. package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec.swift +4 -0
  34. package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec_cxx.swift +96 -0
  35. package/nitrogen/generated/ios/swift/Variant_NullType_Int64.swift +18 -0
  36. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +18 -0
  37. package/nitrogen/generated/shared/c++/ConnectResult.hpp +5 -5
  38. package/nitrogen/generated/shared/c++/ConnectSignResult.hpp +91 -0
  39. package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp +4 -0
  40. package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.hpp +11 -1
  41. package/package.json +4 -3
  42. package/react-native.config.js +1 -1
  43. package/src/specs/nitro-metamask.nitro.ts +37 -1
  44. package/android/src/main/java/com/nitrometamask/HybridNitroMetamask.kt +0 -146
package/README.md CHANGED
@@ -20,6 +20,130 @@ Novastera authentication with native mobile libraries
20
20
  npm install @novastera-oss/nitro-metamask react-native-nitro-modules
21
21
  ```
22
22
 
23
+ ### Android Configuration
24
+
25
+ **Required:** Add a deep link intent filter to enable MetaMask to return to your app after connecting or signing.
26
+
27
+ **File:** `android/app/src/main/AndroidManifest.xml`
28
+
29
+ Add this inside your `MainActivity` `<activity>` tag:
30
+
31
+ ```xml
32
+ <activity
33
+ android:name=".MainActivity"
34
+ android:launchMode="singleTask"
35
+ ...>
36
+ <!-- Existing intent filters -->
37
+
38
+ <!-- Deep link intent filter for MetaMask callback -->
39
+ <intent-filter>
40
+ <action android:name="android.intent.action.VIEW" />
41
+ <category android:name="android.intent.category.DEFAULT" />
42
+ <category android:name="android.intent.category.BROWSABLE" />
43
+ <data android:scheme="nitrometamask" android:host="mmsdk" />
44
+ </intent-filter>
45
+ </activity>
46
+ ```
47
+
48
+ **Important:**
49
+ - Ensure `android:launchMode="singleTask"` is set on your MainActivity (recommended for deep linking)
50
+ - This allows MetaMask to return to your app after the user approves the connection or signature
51
+
52
+ ### iOS Configuration
53
+
54
+ **For Expo projects:** The package includes an Expo config plugin that automatically adds the required AppDelegate code. Just add the plugin to your `app.json` or `app.config.js`:
55
+
56
+ ```json
57
+ {
58
+ "expo": {
59
+ "plugins": ["@novastera-oss/nitro-metamask"]
60
+ }
61
+ }
62
+ ```
63
+
64
+ The plugin will automatically:
65
+ - Add the `import MetaMaskSDK` statement
66
+ - Add the `application(_:open:options:)` method to handle MetaMask deep links
67
+ - Work with both Swift and Objective-C AppDelegate files
68
+
69
+ **For bare React Native projects:** Add deep link handling manually in your `AppDelegate.swift` (or `AppDelegate.m` for Objective-C):
70
+
71
+ **File:** `ios/YourAppName/AppDelegate.swift`
72
+
73
+ ```swift
74
+ import MetaMaskSDK
75
+
76
+ // ... existing AppDelegate code ...
77
+
78
+ // Handle deep links from MetaMask wallet
79
+ // MetaMask returns to the app via deep link after signing/connecting
80
+ func application(
81
+ _ app: UIApplication,
82
+ open url: URL,
83
+ options: [UIApplication.OpenURLOptionsKey: Any] = [:]
84
+ ) -> Bool {
85
+ // Check if this is a MetaMask deep link (host="mmsdk")
86
+ if let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
87
+ components.host == "mmsdk" {
88
+ // Handle MetaMask deep link return
89
+ MetaMaskSDK.shared.handleUrl(url)
90
+ return true
91
+ }
92
+
93
+ // Handle other deep links (e.g., React Native Linking)
94
+ return false
95
+ }
96
+ ```
97
+
98
+ **Info.plist:** The URL scheme is automatically detected from your `Info.plist` `CFBundleURLSchemes` configuration. Ensure you have a URL scheme configured (e.g., `nitrometamask`).
99
+
100
+ ## Usage
101
+
102
+ ```typescript
103
+ import { NitroMetamask } from '@novastera-oss/nitro-metamask';
104
+
105
+ // Optional: Configure dapp URL (only needed if you have a website)
106
+ // If not called, defaults to "https://novastera.com"
107
+ // This URL is ONLY used for SDK validation - the deep link return is handled automatically
108
+ NitroMetamask.configure('https://yourdomain.com'); // Optional
109
+
110
+ // Connect to MetaMask
111
+ const connectResult = await NitroMetamask.connect();
112
+ console.log('Connected:', connectResult.address, 'Chain:', connectResult.chainId);
113
+
114
+ // Sign a message (requires connection first)
115
+ const signature = await NitroMetamask.signMessage('Hello from my app!');
116
+
117
+ // Connect and sign in one call (convenience method)
118
+ // This constructs a JSON message with address, chainID, nonce, and exp
119
+ const nonce = 'random-nonce-123';
120
+ const exp = BigInt(Date.now() + 42000); // 42 seconds from now (use BigInt for timestamp)
121
+ const signature = await NitroMetamask.connectSign(nonce, exp);
122
+ ```
123
+
124
+ ### How Deep Linking Works
125
+
126
+ **Important:** The MetaMask SDK requires a valid HTTP/HTTPS URL for `DappMetadata.url` validation, but this is **separate** from the deep link that returns to your app.
127
+
128
+ **Two separate things:**
129
+ 1. **DappMetadata.url** (optional, configurable):
130
+ - Used only for SDK validation - the SDK checks it's a valid HTTP/HTTPS URL
131
+ - Defaults to `"https://novastera.com"` if not configured
132
+ - You can call `NitroMetamask.configure('https://yourdomain.com')` if you have a website
133
+ - If you don't have a website, the default works fine - it's just for validation
134
+ - [Reference](https://raw.githubusercontent.com/MetaMask/metamask-android-sdk/a448378fbedc3afbf70759ba71294f7819af2f37/metamask-android-sdk/src/main/java/io/metamask/androidsdk/DappMetadata.kt)
135
+
136
+ 2. **Deep Link Return** (automatic):
137
+ - Automatically detected from your `AndroidManifest.xml` intent filter
138
+ - The SDK reads `<data android:scheme="..." android:host="mmsdk" />` and uses it to return to your app
139
+ - This is what actually makes MetaMask return to your app after operations
140
+ - No configuration needed - it's handled automatically
141
+
142
+ **Summary:**
143
+ - The `configure()` URL is just for SDK validation (you can use the default if you don't have a website)
144
+ - The deep link return is handled automatically via your `AndroidManifest.xml`
145
+ - Your app will return correctly as long as the manifest is configured properly
146
+
23
147
  ## Credits
24
148
 
25
149
  Bootstrapped with [create-nitro-module](https://github.com/patrickkabwe/create-nitro-module).
@@ -36,7 +36,7 @@ def getExtOrIntegerDefault(name) {
36
36
  }
37
37
 
38
38
  android {
39
- namespace "com.nitrometamask"
39
+ namespace "com.margelo.nitro.nitrometamask"
40
40
 
41
41
  ndkVersion getExtOrDefault("ndkVersion")
42
42
  compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
@@ -152,6 +152,6 @@ if (isNewArchitectureEnabled()) {
152
152
  react {
153
153
  jsRootDir = file("../src/")
154
154
  libraryName = "NitroMetamask"
155
- codegenJavaPackageName = "com.nitrometamask"
155
+ codegenJavaPackageName = "com.margelo.nitro.nitrometamask"
156
156
  }
157
157
  }