@novastera-oss/nitro-metamask 0.2.7 → 0.3.3

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 (58) hide show
  1. package/LICENSE +21 -201
  2. package/NitroMetamask.podspec +1 -1
  3. package/README.md +75 -228
  4. package/android/CMakeLists.txt +3 -0
  5. package/android/build.gradle +24 -18
  6. package/android/fix-prefab.gradle +1 -1
  7. package/android/gradle.properties +2 -2
  8. package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridNitroMetamask.kt +409 -0
  9. package/android/src/main/java/com/margelo/nitro/nitrometamask/MetamaskContextHolder.kt +4 -25
  10. package/android/src/main/java/com/margelo/nitro/nitrometamask/NitroMetamaskPackage.kt +36 -7
  11. package/ios/Bridge.h +2 -2
  12. package/ios/HybridNitroMetamask.swift +241 -0
  13. package/lib/commonjs/index.js +20 -0
  14. package/lib/commonjs/index.js.map +1 -0
  15. package/lib/commonjs/package.json +1 -0
  16. package/lib/commonjs/specs/nitro-metamask.nitro.js +6 -0
  17. package/lib/commonjs/specs/nitro-metamask.nitro.js.map +1 -0
  18. package/lib/module/index.js +16 -0
  19. package/lib/module/index.js.map +1 -0
  20. package/lib/module/specs/nitro-metamask.nitro.js +4 -0
  21. package/lib/module/specs/nitro-metamask.nitro.js.map +1 -0
  22. package/lib/typescript/src/index.d.ts +15 -0
  23. package/lib/typescript/src/index.d.ts.map +1 -0
  24. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts +23 -0
  25. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts.map +1 -0
  26. package/nitro.json +4 -4
  27. package/nitrogen/generated/android/NitroMetamask+autolinking.cmake +2 -2
  28. package/nitrogen/generated/android/NitroMetamaskOnLoad.cpp +4 -4
  29. package/nitrogen/generated/android/c++/{JHybridMetamaskConnectorSpec.cpp → JHybridNitroMetamaskSpec.cpp} +31 -10
  30. package/nitrogen/generated/android/c++/{JHybridMetamaskConnectorSpec.hpp → JHybridNitroMetamaskSpec.hpp} +12 -10
  31. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/{HybridMetamaskConnectorSpec.kt → HybridNitroMetamaskSpec.kt} +14 -6
  32. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.cpp +9 -9
  33. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.hpp +38 -13
  34. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Umbrella.hpp +6 -5
  35. package/nitrogen/generated/ios/NitroMetamaskAutolinking.mm +3 -3
  36. package/nitrogen/generated/ios/NitroMetamaskAutolinking.swift +6 -6
  37. package/nitrogen/generated/ios/c++/{HybridMetamaskConnectorSpecSwift.cpp → HybridNitroMetamaskSpecSwift.cpp} +2 -2
  38. package/nitrogen/generated/ios/c++/{HybridMetamaskConnectorSpecSwift.hpp → HybridNitroMetamaskSpecSwift.hpp} +28 -13
  39. package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec.swift +59 -0
  40. package/nitrogen/generated/ios/swift/{HybridMetamaskConnectorSpec_cxx.swift → HybridNitroMetamaskSpec_cxx.swift} +55 -18
  41. package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp +24 -0
  42. package/nitrogen/generated/shared/c++/{HybridMetamaskConnectorSpec.hpp → HybridNitroMetamaskSpec.hpp} +13 -10
  43. package/package.json +55 -39
  44. package/react-native.config.js +4 -1
  45. package/src/index.ts +14 -5
  46. package/src/specs/nitro-metamask.nitro.ts +21 -0
  47. package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridMetamaskConnector.kt +0 -126
  48. package/ios/HybridMetamaskConnector.swift +0 -97
  49. package/lib/MetamaskConnector.nitro.d.ts +0 -12
  50. package/lib/MetamaskConnector.nitro.js +0 -1
  51. package/lib/index.d.ts +0 -3
  52. package/lib/index.js +0 -2
  53. package/lib/specs/Example.nitro.d.ts +0 -0
  54. package/lib/specs/Example.nitro.js +0 -2
  55. package/nitrogen/generated/ios/swift/HybridMetamaskConnectorSpec.swift +0 -57
  56. package/nitrogen/generated/shared/c++/HybridMetamaskConnectorSpec.cpp +0 -22
  57. package/src/MetamaskConnector.nitro.ts +0 -13
  58. package/src/specs/Example.nitro.ts +0 -1
@@ -0,0 +1,241 @@
1
+ import NitroModules
2
+ import MetaMaskSDK
3
+ import Foundation
4
+
5
+ final class HybridNitroMetamask: HybridNitroMetamaskSpec {
6
+ private let sdk = MetaMaskSDK.shared
7
+
8
+ // Configurable dapp URL - stored for consistency with Android
9
+ // iOS SDK handles deep linking automatically via Info.plist
10
+ private var dappUrl: String? = nil
11
+
12
+ func configure(dappUrl: String?) {
13
+ // iOS SDK handles deep linking automatically via Info.plist
14
+ // Store the URL for consistency with Android implementation
15
+ self.dappUrl = dappUrl
16
+ NSLog("NitroMetamask: configure: Dapp URL set to \(dappUrl ?? "default"). Deep link handled automatically via Info.plist")
17
+ }
18
+
19
+ func connect() -> Promise<ConnectResult> {
20
+ // Use Promise.async with Swift async/await for best practice in Nitro modules
21
+ // Reference: https://nitro.margelo.com/docs/types/promises
22
+ return Promise.async {
23
+ // Based on MetaMask iOS SDK docs: let connectResult = await metamaskSDK.connect()
24
+ // Reference: https://github.com/MetaMask/metamask-ios-sdk
25
+ let connectResult = try await self.sdk.connect()
26
+
27
+ switch connectResult {
28
+ case .success:
29
+ // After successful connection, get account info from SDK
30
+ // Note: sdk.account is a String (address), not an object
31
+ // Reference: https://raw.githubusercontent.com/MetaMask/metamask-ios-sdk/924d91bb3e98a5383c3082d6d5ba3ddac9e1c565/README.md
32
+ guard let address = self.sdk.account, !address.isEmpty else {
33
+ throw NSError(
34
+ domain: "MetamaskConnector",
35
+ code: -1,
36
+ userInfo: [NSLocalizedDescriptionKey: "MetaMask SDK returned no address after connection"]
37
+ )
38
+ }
39
+
40
+ // Parse chainId from hex string (e.g., "0x1") to number
41
+ // Nitro requires chainId to be a number, not a string, for type safety
42
+ guard
43
+ let chainIdHex = self.sdk.chainId,
44
+ !chainIdHex.isEmpty,
45
+ let chainIdInt = Int(chainIdHex.replacingOccurrences(of: "0x", with: ""), radix: 16)
46
+ else {
47
+ throw NSError(
48
+ domain: "MetamaskConnector",
49
+ code: -1,
50
+ userInfo: [NSLocalizedDescriptionKey: "Invalid chainId format"]
51
+ )
52
+ }
53
+
54
+ return ConnectResult(
55
+ address: address,
56
+ chainId: Double(chainIdInt)
57
+ )
58
+
59
+ case .failure(let error):
60
+ throw error
61
+ }
62
+ }
63
+ }
64
+
65
+ func signMessage(message: String) -> Promise<String> {
66
+ // Use Promise.async with Swift async/await for best practice in Nitro modules
67
+ // Reference: https://nitro.margelo.com/docs/types/promises
68
+ return Promise.async {
69
+ // Use explicit sign() method (requires connection first via connect())
70
+ // This is more explicit and predictable than connectAndSign() which forces connection
71
+ // Nitro encourages explicit object state, not convenience shortcuts
72
+ guard let account = self.sdk.account, !account.isEmpty else {
73
+ throw NSError(
74
+ domain: "MetamaskConnector",
75
+ code: -1,
76
+ userInfo: [NSLocalizedDescriptionKey: "No connected account. Call connect() first."]
77
+ )
78
+ }
79
+
80
+ // Create EthereumRequest for personal_sign
81
+ // Based on MetaMask iOS SDK docs: params are [account, message]
82
+ // Reference: https://raw.githubusercontent.com/MetaMask/metamask-ios-sdk/924d91bb3e98a5383c3082d6d5ba3ddac9e1c565/README.md
83
+ let params: [String] = [account, message]
84
+ let request = EthereumRequest(
85
+ method: .personalSign,
86
+ params: params
87
+ )
88
+
89
+ // Make the request using the SDK's async request method
90
+ let result = try await self.sdk.request(request)
91
+
92
+ // Extract signature from response
93
+ // The signature should be a hex-encoded string (0x-prefixed)
94
+ if let signature = result as? String {
95
+ return signature
96
+ } else if let dict = result as? [String: Any], let sig = dict["signature"] as? String ?? dict["result"] as? String {
97
+ return sig
98
+ } else {
99
+ throw NSError(
100
+ domain: "MetamaskConnector",
101
+ code: -1,
102
+ userInfo: [NSLocalizedDescriptionKey: "Invalid signature response format"]
103
+ )
104
+ }
105
+ }
106
+ }
107
+
108
+ func connectSign(nonce: String, exp: Int64) -> Promise<String> {
109
+ // Use Promise.async with Swift async/await for best practice in Nitro modules
110
+ // Reference: https://nitro.margelo.com/docs/types/promises
111
+ // Based on MetaMask iOS SDK: connect and sign in one call
112
+ // Reference: https://github.com/MetaMask/metamask-ios-sdk
113
+ return Promise.async {
114
+ // First, ensure we're connected
115
+ var address = self.sdk.account
116
+ var chainIdHex = self.sdk.chainId
117
+
118
+ // If not connected, connect first
119
+ if address == nil || address?.isEmpty == true || chainIdHex == nil || chainIdHex?.isEmpty == true {
120
+ let connectResult = try await self.sdk.connect()
121
+
122
+ switch connectResult {
123
+ case .success:
124
+ address = self.sdk.account
125
+ chainIdHex = self.sdk.chainId
126
+
127
+ guard let account = address, !account.isEmpty else {
128
+ throw NSError(
129
+ domain: "MetamaskConnector",
130
+ code: -1,
131
+ userInfo: [NSLocalizedDescriptionKey: "MetaMask SDK returned no address after connection"]
132
+ )
133
+ }
134
+
135
+ guard let chainId = chainIdHex, !chainId.isEmpty,
136
+ let chainIdInt = Int(chainId.replacingOccurrences(of: "0x", with: ""), radix: 16) else {
137
+ throw NSError(
138
+ domain: "MetamaskConnector",
139
+ code: -1,
140
+ userInfo: [NSLocalizedDescriptionKey: "Invalid chainId format"]
141
+ )
142
+ }
143
+
144
+ // Construct JSON message
145
+ let messageDict: [String: Any] = [
146
+ "address": account,
147
+ "chainID": chainIdInt,
148
+ "nonce": nonce,
149
+ "exp": exp
150
+ ]
151
+
152
+ guard let jsonData = try? JSONSerialization.data(withJSONObject: messageDict),
153
+ let message = String(data: jsonData, encoding: .utf8) else {
154
+ throw NSError(
155
+ domain: "MetamaskConnector",
156
+ code: -1,
157
+ userInfo: [NSLocalizedDescriptionKey: "Failed to create JSON message"]
158
+ )
159
+ }
160
+
161
+ // Create EthereumRequest for personal_sign
162
+ let params: [String] = [account, message]
163
+ let request = EthereumRequest(
164
+ method: .personalSign,
165
+ params: params
166
+ )
167
+
168
+ // Make the request using the SDK's async request method
169
+ let result = try await self.sdk.request(request)
170
+
171
+ // Extract signature from response
172
+ if let signature = result as? String {
173
+ return signature
174
+ } else if let dict = result as? [String: Any], let sig = dict["signature"] as? String ?? dict["result"] as? String {
175
+ return sig
176
+ } else {
177
+ throw NSError(
178
+ domain: "MetamaskConnector",
179
+ code: -1,
180
+ userInfo: [NSLocalizedDescriptionKey: "Invalid signature response format"]
181
+ )
182
+ }
183
+
184
+ case .failure(let error):
185
+ throw error
186
+ }
187
+ } else {
188
+ // Already connected, construct message and sign
189
+ guard let account = address, !account.isEmpty,
190
+ let chainId = chainIdHex, !chainId.isEmpty,
191
+ let chainIdInt = Int(chainId.replacingOccurrences(of: "0x", with: ""), radix: 16) else {
192
+ throw NSError(
193
+ domain: "MetamaskConnector",
194
+ code: -1,
195
+ userInfo: [NSLocalizedDescriptionKey: "Invalid connection state"]
196
+ )
197
+ }
198
+
199
+ // Construct JSON message
200
+ let messageDict: [String: Any] = [
201
+ "address": account,
202
+ "chainID": chainIdInt,
203
+ "nonce": nonce,
204
+ "exp": Int64(exp)
205
+ ]
206
+
207
+ guard let jsonData = try? JSONSerialization.data(withJSONObject: messageDict),
208
+ let message = String(data: jsonData, encoding: .utf8) else {
209
+ throw NSError(
210
+ domain: "MetamaskConnector",
211
+ code: -1,
212
+ userInfo: [NSLocalizedDescriptionKey: "Failed to create JSON message"]
213
+ )
214
+ }
215
+
216
+ // Create EthereumRequest for personal_sign
217
+ let params: [String] = [account, message]
218
+ let request = EthereumRequest(
219
+ method: .personalSign,
220
+ params: params
221
+ )
222
+
223
+ // Make the request using the SDK's async request method
224
+ let result = try await self.sdk.request(request)
225
+
226
+ // Extract signature from response
227
+ if let signature = result as? String {
228
+ return signature
229
+ } else if let dict = result as? [String: Any], let sig = dict["signature"] as? String ?? dict["result"] as? String {
230
+ return sig
231
+ } else {
232
+ throw NSError(
233
+ domain: "MetamaskConnector",
234
+ code: -1,
235
+ userInfo: [NSLocalizedDescriptionKey: "Invalid signature response format"]
236
+ )
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NitroMetamask = void 0;
7
+ var _reactNativeNitroModules = require("react-native-nitro-modules");
8
+ /**
9
+ * NitroMetamask - MetaMask connector for React Native
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { NitroMetamask } from '@novastera-oss/nitro-metamask'
14
+ *
15
+ * const result = await NitroMetamask.connect()
16
+ * const signature = await NitroMetamask.signMessage('Hello')
17
+ * ```
18
+ */
19
+ const NitroMetamask = exports.NitroMetamask = _reactNativeNitroModules.NitroModules.createHybridObject('NitroMetamask');
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNativeNitroModules","require","NitroMetamask","exports","NitroModules","createHybridObject"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;AAAA,IAAAA,wBAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAGE,qCAAY,CAACC,kBAAkB,CAAoB,eAAe,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=nitro-metamask.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/nitro-metamask.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ /**
5
+ * NitroMetamask - MetaMask connector for React Native
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { NitroMetamask } from '@novastera-oss/nitro-metamask'
10
+ *
11
+ * const result = await NitroMetamask.connect()
12
+ * const signature = await NitroMetamask.signMessage('Hello')
13
+ * ```
14
+ */
15
+ export const NitroMetamask = NitroModules.createHybridObject('NitroMetamask');
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NitroModules","NitroMetamask","createHybridObject"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,GAAGD,YAAY,CAACE,kBAAkB,CAAoB,eAAe,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=nitro-metamask.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["specs/nitro-metamask.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import type { NitroMetamask as NitroMetamaskSpec, ConnectResult } from './specs/nitro-metamask.nitro';
2
+ /**
3
+ * NitroMetamask - MetaMask connector for React Native
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { NitroMetamask } from '@novastera-oss/nitro-metamask'
8
+ *
9
+ * const result = await NitroMetamask.connect()
10
+ * const signature = await NitroMetamask.signMessage('Hello')
11
+ * ```
12
+ */
13
+ export declare const NitroMetamask: NitroMetamaskSpec;
14
+ export type { ConnectResult, NitroMetamaskSpec };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,IAAI,iBAAiB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAErG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,mBAAsE,CAAA;AAEhG,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { type HybridObject } from 'react-native-nitro-modules';
2
+ export interface ConnectResult {
3
+ address: string;
4
+ chainId: number;
5
+ }
6
+ export interface NitroMetamask extends HybridObject<{
7
+ ios: 'swift';
8
+ android: 'kotlin';
9
+ }> {
10
+ /**
11
+ * Configure the dapp URL for MetaMask SDK validation.
12
+ * This URL is only used for SDK validation - the deep link return is handled automatically via AndroidManifest.xml.
13
+ *
14
+ * @param dappUrl - A valid HTTP/HTTPS URL (e.g., "https://yourdomain.com").
15
+ * If not provided, defaults to "https://novastera.com".
16
+ * This is separate from the deep link scheme which is auto-detected from your manifest.
17
+ */
18
+ configure(dappUrl?: string): void;
19
+ connect(): Promise<ConnectResult>;
20
+ signMessage(message: string): Promise<string>;
21
+ connectSign(nonce: string, exp: bigint): Promise<string>;
22
+ }
23
+ //# sourceMappingURL=nitro-metamask.nitro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nitro-metamask.nitro.d.ts","sourceRoot":"","sources":["../../../../src/specs/nitro-metamask.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAc,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;IACtF;;;;;;;OAOG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;IACjC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACzD"}
package/nitro.json CHANGED
@@ -13,12 +13,12 @@
13
13
  "androidCxxLibName": "NitroMetamask"
14
14
  },
15
15
  "autolinking": {
16
- "MetamaskConnector": {
17
- "swift": "HybridMetamaskConnector",
18
- "kotlin": "HybridMetamaskConnector"
16
+ "NitroMetamask": {
17
+ "swift": "HybridNitroMetamask",
18
+ "kotlin": "HybridNitroMetamask"
19
19
  }
20
20
  },
21
21
  "ignorePaths": [
22
22
  "**/node_modules"
23
23
  ]
24
- }
24
+ }
@@ -33,9 +33,9 @@ target_sources(
33
33
  # Autolinking Setup
34
34
  ../nitrogen/generated/android/NitroMetamaskOnLoad.cpp
35
35
  # Shared Nitrogen C++ sources
36
- ../nitrogen/generated/shared/c++/HybridMetamaskConnectorSpec.cpp
36
+ ../nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp
37
37
  # Android-specific Nitrogen C++ sources
38
- ../nitrogen/generated/android/c++/JHybridMetamaskConnectorSpec.cpp
38
+ ../nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.cpp
39
39
  )
40
40
 
41
41
  # From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
@@ -15,7 +15,7 @@
15
15
  #include <fbjni/fbjni.h>
16
16
  #include <NitroModules/HybridObjectRegistry.hpp>
17
17
 
18
- #include "JHybridMetamaskConnectorSpec.hpp"
18
+ #include "JHybridNitroMetamaskSpec.hpp"
19
19
  #include <NitroModules/DefaultConstructableObject.hpp>
20
20
 
21
21
  namespace margelo::nitro::nitrometamask {
@@ -27,13 +27,13 @@ int initialize(JavaVM* vm) {
27
27
 
28
28
  return facebook::jni::initialize(vm, [] {
29
29
  // Register native JNI methods
30
- margelo::nitro::nitrometamask::JHybridMetamaskConnectorSpec::registerNatives();
30
+ margelo::nitro::nitrometamask::JHybridNitroMetamaskSpec::registerNatives();
31
31
 
32
32
  // Register Nitro Hybrid Objects
33
33
  HybridObjectRegistry::registerHybridObjectConstructor(
34
- "MetamaskConnector",
34
+ "NitroMetamask",
35
35
  []() -> std::shared_ptr<HybridObject> {
36
- static DefaultConstructableObject<JHybridMetamaskConnectorSpec::javaobject> object("com/margelo/nitro/nitrometamask/HybridMetamaskConnector");
36
+ static DefaultConstructableObject<JHybridNitroMetamaskSpec::javaobject> object("com/margelo/nitro/nitrometamask/HybridNitroMetamask");
37
37
  auto instance = object.create();
38
38
  return instance->cthis()->shared();
39
39
  }
@@ -1,11 +1,11 @@
1
1
  ///
2
- /// JHybridMetamaskConnectorSpec.cpp
2
+ /// JHybridNitroMetamaskSpec.cpp
3
3
  /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
4
  /// https://github.com/mrousavy/nitro
5
5
  /// Copyright © 2026 Marc Rousavy @ Margelo
6
6
  ///
7
7
 
8
- #include "JHybridMetamaskConnectorSpec.hpp"
8
+ #include "JHybridNitroMetamaskSpec.hpp"
9
9
 
10
10
  // Forward declaration of `ConnectResult` to properly resolve imports.
11
11
  namespace margelo::nitro::nitrometamask { struct ConnectResult; }
@@ -15,30 +15,31 @@ namespace margelo::nitro::nitrometamask { struct ConnectResult; }
15
15
  #include <NitroModules/JPromise.hpp>
16
16
  #include "JConnectResult.hpp"
17
17
  #include <string>
18
+ #include <optional>
18
19
 
19
20
  namespace margelo::nitro::nitrometamask {
20
21
 
21
- jni::local_ref<JHybridMetamaskConnectorSpec::jhybriddata> JHybridMetamaskConnectorSpec::initHybrid(jni::alias_ref<jhybridobject> jThis) {
22
+ jni::local_ref<JHybridNitroMetamaskSpec::jhybriddata> JHybridNitroMetamaskSpec::initHybrid(jni::alias_ref<jhybridobject> jThis) {
22
23
  return makeCxxInstance(jThis);
23
24
  }
24
25
 
25
- void JHybridMetamaskConnectorSpec::registerNatives() {
26
+ void JHybridNitroMetamaskSpec::registerNatives() {
26
27
  registerHybrid({
27
- makeNativeMethod("initHybrid", JHybridMetamaskConnectorSpec::initHybrid),
28
+ makeNativeMethod("initHybrid", JHybridNitroMetamaskSpec::initHybrid),
28
29
  });
29
30
  }
30
31
 
31
- size_t JHybridMetamaskConnectorSpec::getExternalMemorySize() noexcept {
32
+ size_t JHybridNitroMetamaskSpec::getExternalMemorySize() noexcept {
32
33
  static const auto method = javaClassStatic()->getMethod<jlong()>("getMemorySize");
33
34
  return method(_javaPart);
34
35
  }
35
36
 
36
- void JHybridMetamaskConnectorSpec::dispose() noexcept {
37
+ void JHybridNitroMetamaskSpec::dispose() noexcept {
37
38
  static const auto method = javaClassStatic()->getMethod<void()>("dispose");
38
39
  method(_javaPart);
39
40
  }
40
41
 
41
- std::string JHybridMetamaskConnectorSpec::toString() {
42
+ std::string JHybridNitroMetamaskSpec::toString() {
42
43
  static const auto method = javaClassStatic()->getMethod<jni::JString()>("toString");
43
44
  auto javaString = method(_javaPart);
44
45
  return javaString->toStdString();
@@ -48,7 +49,11 @@ namespace margelo::nitro::nitrometamask {
48
49
 
49
50
 
50
51
  // Methods
51
- std::shared_ptr<Promise<ConnectResult>> JHybridMetamaskConnectorSpec::connect() {
52
+ void JHybridNitroMetamaskSpec::configure(const std::optional<std::string>& dappUrl) {
53
+ static const auto method = javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* dappUrl */)>("configure");
54
+ method(_javaPart, dappUrl.has_value() ? jni::make_jstring(dappUrl.value()) : nullptr);
55
+ }
56
+ std::shared_ptr<Promise<ConnectResult>> JHybridNitroMetamaskSpec::connect() {
52
57
  static const auto method = javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("connect");
53
58
  auto __result = method(_javaPart);
54
59
  return [&]() {
@@ -64,7 +69,7 @@ namespace margelo::nitro::nitrometamask {
64
69
  return __promise;
65
70
  }();
66
71
  }
67
- std::shared_ptr<Promise<std::string>> JHybridMetamaskConnectorSpec::signMessage(const std::string& message) {
72
+ std::shared_ptr<Promise<std::string>> JHybridNitroMetamaskSpec::signMessage(const std::string& message) {
68
73
  static const auto method = javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* message */)>("signMessage");
69
74
  auto __result = method(_javaPart, jni::make_jstring(message));
70
75
  return [&]() {
@@ -80,5 +85,21 @@ namespace margelo::nitro::nitrometamask {
80
85
  return __promise;
81
86
  }();
82
87
  }
88
+ std::shared_ptr<Promise<std::string>> JHybridNitroMetamaskSpec::connectSign(const std::string& nonce, int64_t exp) {
89
+ static const auto method = javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* nonce */, int64_t /* exp */)>("connectSign");
90
+ auto __result = method(_javaPart, jni::make_jstring(nonce), exp);
91
+ return [&]() {
92
+ auto __promise = Promise<std::string>::create();
93
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
94
+ auto __result = jni::static_ref_cast<jni::JString>(__boxedResult);
95
+ __promise->resolve(__result->toStdString());
96
+ });
97
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
98
+ jni::JniException __jniError(__throwable);
99
+ __promise->reject(std::make_exception_ptr(__jniError));
100
+ });
101
+ return __promise;
102
+ }();
103
+ }
83
104
 
84
105
  } // namespace margelo::nitro::nitrometamask
@@ -1,5 +1,5 @@
1
1
  ///
2
- /// HybridMetamaskConnectorSpec.hpp
2
+ /// HybridNitroMetamaskSpec.hpp
3
3
  /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
4
  /// https://github.com/mrousavy/nitro
5
5
  /// Copyright © 2026 Marc Rousavy @ Margelo
@@ -9,7 +9,7 @@
9
9
 
10
10
  #include <NitroModules/JHybridObject.hpp>
11
11
  #include <fbjni/fbjni.h>
12
- #include "HybridMetamaskConnectorSpec.hpp"
12
+ #include "HybridNitroMetamaskSpec.hpp"
13
13
 
14
14
 
15
15
 
@@ -18,22 +18,22 @@ namespace margelo::nitro::nitrometamask {
18
18
 
19
19
  using namespace facebook;
20
20
 
21
- class JHybridMetamaskConnectorSpec: public jni::HybridClass<JHybridMetamaskConnectorSpec, JHybridObject>,
22
- public virtual HybridMetamaskConnectorSpec {
21
+ class JHybridNitroMetamaskSpec: public jni::HybridClass<JHybridNitroMetamaskSpec, JHybridObject>,
22
+ public virtual HybridNitroMetamaskSpec {
23
23
  public:
24
- static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/nitrometamask/HybridMetamaskConnectorSpec;";
24
+ static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/nitrometamask/HybridNitroMetamaskSpec;";
25
25
  static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
26
26
  static void registerNatives();
27
27
 
28
28
  protected:
29
29
  // C++ constructor (called from Java via `initHybrid()`)
30
- explicit JHybridMetamaskConnectorSpec(jni::alias_ref<jhybridobject> jThis) :
31
- HybridObject(HybridMetamaskConnectorSpec::TAG),
30
+ explicit JHybridNitroMetamaskSpec(jni::alias_ref<jhybridobject> jThis) :
31
+ HybridObject(HybridNitroMetamaskSpec::TAG),
32
32
  HybridBase(jThis),
33
33
  _javaPart(jni::make_global(jThis)) {}
34
34
 
35
35
  public:
36
- ~JHybridMetamaskConnectorSpec() override {
36
+ ~JHybridNitroMetamaskSpec() override {
37
37
  // Hermes GC can destroy JS objects on a non-JNI Thread.
38
38
  jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
39
39
  }
@@ -44,7 +44,7 @@ namespace margelo::nitro::nitrometamask {
44
44
  std::string toString() override;
45
45
 
46
46
  public:
47
- inline const jni::global_ref<JHybridMetamaskConnectorSpec::javaobject>& getJavaPart() const noexcept {
47
+ inline const jni::global_ref<JHybridNitroMetamaskSpec::javaobject>& getJavaPart() const noexcept {
48
48
  return _javaPart;
49
49
  }
50
50
 
@@ -54,13 +54,15 @@ namespace margelo::nitro::nitrometamask {
54
54
 
55
55
  public:
56
56
  // Methods
57
+ void configure(const std::optional<std::string>& dappUrl) override;
57
58
  std::shared_ptr<Promise<ConnectResult>> connect() override;
58
59
  std::shared_ptr<Promise<std::string>> signMessage(const std::string& message) override;
60
+ std::shared_ptr<Promise<std::string>> connectSign(const std::string& nonce, int64_t exp) override;
59
61
 
60
62
  private:
61
63
  friend HybridBase;
62
64
  using HybridBase::HybridBase;
63
- jni::global_ref<JHybridMetamaskConnectorSpec::javaobject> _javaPart;
65
+ jni::global_ref<JHybridNitroMetamaskSpec::javaobject> _javaPart;
64
66
  };
65
67
 
66
68
  } // namespace margelo::nitro::nitrometamask
@@ -1,5 +1,5 @@
1
1
  ///
2
- /// HybridMetamaskConnectorSpec.kt
2
+ /// HybridNitroMetamaskSpec.kt
3
3
  /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
4
  /// https://github.com/mrousavy/nitro
5
5
  /// Copyright © 2026 Marc Rousavy @ Margelo
@@ -14,8 +14,8 @@ import com.margelo.nitro.core.Promise
14
14
  import com.margelo.nitro.core.HybridObject
15
15
 
16
16
  /**
17
- * A Kotlin class representing the MetamaskConnector HybridObject.
18
- * Implement this abstract class to create Kotlin-based instances of MetamaskConnector.
17
+ * A Kotlin class representing the NitroMetamask HybridObject.
18
+ * Implement this abstract class to create Kotlin-based instances of NitroMetamask.
19
19
  */
20
20
  @DoNotStrip
21
21
  @Keep
@@ -24,7 +24,7 @@ import com.margelo.nitro.core.HybridObject
24
24
  "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet",
25
25
  "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName"
26
26
  )
27
- abstract class HybridMetamaskConnectorSpec: HybridObject() {
27
+ abstract class HybridNitroMetamaskSpec: HybridObject() {
28
28
  @DoNotStrip
29
29
  private var mHybridData: HybridData = initHybrid()
30
30
 
@@ -39,13 +39,17 @@ abstract class HybridMetamaskConnectorSpec: HybridObject() {
39
39
 
40
40
  // Default implementation of `HybridObject.toString()`
41
41
  override fun toString(): String {
42
- return "[HybridObject MetamaskConnector]"
42
+ return "[HybridObject NitroMetamask]"
43
43
  }
44
44
 
45
45
  // Properties
46
46
 
47
47
 
48
48
  // Methods
49
+ @DoNotStrip
50
+ @Keep
51
+ abstract fun configure(dappUrl: String?): Unit
52
+
49
53
  @DoNotStrip
50
54
  @Keep
51
55
  abstract fun connect(): Promise<ConnectResult>
@@ -53,10 +57,14 @@ abstract class HybridMetamaskConnectorSpec: HybridObject() {
53
57
  @DoNotStrip
54
58
  @Keep
55
59
  abstract fun signMessage(message: String): Promise<String>
60
+
61
+ @DoNotStrip
62
+ @Keep
63
+ abstract fun connectSign(nonce: String, exp: Long): Promise<String>
56
64
 
57
65
  private external fun initHybrid(): HybridData
58
66
 
59
67
  companion object {
60
- protected const val TAG = "HybridMetamaskConnectorSpec"
68
+ protected const val TAG = "HybridNitroMetamaskSpec"
61
69
  }
62
70
  }