@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.
- package/README.md +124 -0
- package/android/build.gradle +2 -2
- package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridNitroMetamask.kt +583 -0
- package/android/src/main/java/com/{nitrometamask → margelo/nitro/nitrometamask}/MetamaskContextHolder.kt +1 -1
- package/android/src/main/java/com/{nitrometamask → margelo/nitro/nitrometamask}/NitroMetamaskPackage.kt +1 -1
- package/app.plugin.js +121 -0
- package/ios/HybridNitroMetamask.swift +107 -1
- package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts +36 -1
- package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts.map +1 -1
- package/nitrogen/generated/android/NitroMetamask+autolinking.cmake +2 -0
- package/nitrogen/generated/android/c++/JConnectResult.hpp +3 -3
- package/nitrogen/generated/android/c++/JConnectSignResult.hpp +65 -0
- package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.cpp +62 -0
- package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.hpp +4 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Long.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_Long.hpp +69 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +26 -0
- package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +70 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectResult.kt +2 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectSignResult.kt +44 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/HybridNitroMetamaskSpec.kt +17 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_Long.kt +59 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_String.kt +59 -0
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.cpp +24 -0
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.hpp +217 -0
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Umbrella.hpp +6 -0
- package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.hpp +37 -1
- package/nitrogen/generated/ios/swift/ConnectResult.swift +2 -2
- package/nitrogen/generated/ios/swift/ConnectSignResult.swift +40 -0
- package/nitrogen/generated/ios/swift/Func_void_ConnectSignResult.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__int64_t_.swift +59 -0
- package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__std__string_.swift +59 -0
- package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec.swift +4 -0
- package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec_cxx.swift +96 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_Int64.swift +18 -0
- package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +18 -0
- package/nitrogen/generated/shared/c++/ConnectResult.hpp +5 -5
- package/nitrogen/generated/shared/c++/ConnectSignResult.hpp +91 -0
- package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp +4 -0
- package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.hpp +11 -1
- package/package.json +4 -3
- package/react-native.config.js +1 -1
- package/src/specs/nitro-metamask.nitro.ts +37 -1
- 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).
|
package/android/build.gradle
CHANGED
|
@@ -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
|
}
|