@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.
- package/LICENSE +21 -201
- package/NitroMetamask.podspec +1 -1
- package/README.md +75 -228
- package/android/CMakeLists.txt +3 -0
- package/android/build.gradle +24 -18
- package/android/fix-prefab.gradle +1 -1
- package/android/gradle.properties +2 -2
- package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridNitroMetamask.kt +409 -0
- package/android/src/main/java/com/margelo/nitro/nitrometamask/MetamaskContextHolder.kt +4 -25
- package/android/src/main/java/com/margelo/nitro/nitrometamask/NitroMetamaskPackage.kt +36 -7
- package/ios/Bridge.h +2 -2
- package/ios/HybridNitroMetamask.swift +241 -0
- package/lib/commonjs/index.js +20 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/specs/nitro-metamask.nitro.js +6 -0
- package/lib/commonjs/specs/nitro-metamask.nitro.js.map +1 -0
- package/lib/module/index.js +16 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/specs/nitro-metamask.nitro.js +4 -0
- package/lib/module/specs/nitro-metamask.nitro.js.map +1 -0
- package/lib/typescript/src/index.d.ts +15 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts +23 -0
- package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts.map +1 -0
- package/nitro.json +4 -4
- package/nitrogen/generated/android/NitroMetamask+autolinking.cmake +2 -2
- package/nitrogen/generated/android/NitroMetamaskOnLoad.cpp +4 -4
- package/nitrogen/generated/android/c++/{JHybridMetamaskConnectorSpec.cpp → JHybridNitroMetamaskSpec.cpp} +31 -10
- package/nitrogen/generated/android/c++/{JHybridMetamaskConnectorSpec.hpp → JHybridNitroMetamaskSpec.hpp} +12 -10
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/{HybridMetamaskConnectorSpec.kt → HybridNitroMetamaskSpec.kt} +14 -6
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.cpp +9 -9
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.hpp +38 -13
- package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Umbrella.hpp +6 -5
- package/nitrogen/generated/ios/NitroMetamaskAutolinking.mm +3 -3
- package/nitrogen/generated/ios/NitroMetamaskAutolinking.swift +6 -6
- package/nitrogen/generated/ios/c++/{HybridMetamaskConnectorSpecSwift.cpp → HybridNitroMetamaskSpecSwift.cpp} +2 -2
- package/nitrogen/generated/ios/c++/{HybridMetamaskConnectorSpecSwift.hpp → HybridNitroMetamaskSpecSwift.hpp} +28 -13
- package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec.swift +59 -0
- package/nitrogen/generated/ios/swift/{HybridMetamaskConnectorSpec_cxx.swift → HybridNitroMetamaskSpec_cxx.swift} +55 -18
- package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/{HybridMetamaskConnectorSpec.hpp → HybridNitroMetamaskSpec.hpp} +13 -10
- package/package.json +55 -39
- package/react-native.config.js +4 -1
- package/src/index.ts +14 -5
- package/src/specs/nitro-metamask.nitro.ts +21 -0
- package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridMetamaskConnector.kt +0 -126
- package/ios/HybridMetamaskConnector.swift +0 -97
- package/lib/MetamaskConnector.nitro.d.ts +0 -12
- package/lib/MetamaskConnector.nitro.js +0 -1
- package/lib/index.d.ts +0 -3
- package/lib/index.js +0 -2
- package/lib/specs/Example.nitro.d.ts +0 -0
- package/lib/specs/Example.nitro.js +0 -2
- package/nitrogen/generated/ios/swift/HybridMetamaskConnectorSpec.swift +0 -57
- package/nitrogen/generated/shared/c++/HybridMetamaskConnectorSpec.cpp +0 -22
- package/src/MetamaskConnector.nitro.ts +0 -13
- 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 @@
|
|
|
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 @@
|
|
|
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
|
-
"
|
|
17
|
-
"swift": "
|
|
18
|
-
"kotlin": "
|
|
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++/
|
|
36
|
+
../nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp
|
|
37
37
|
# Android-specific Nitrogen C++ sources
|
|
38
|
-
../nitrogen/generated/android/c++/
|
|
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 "
|
|
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::
|
|
30
|
+
margelo::nitro::nitrometamask::JHybridNitroMetamaskSpec::registerNatives();
|
|
31
31
|
|
|
32
32
|
// Register Nitro Hybrid Objects
|
|
33
33
|
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
34
|
-
"
|
|
34
|
+
"NitroMetamask",
|
|
35
35
|
[]() -> std::shared_ptr<HybridObject> {
|
|
36
|
-
static DefaultConstructableObject<
|
|
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
|
-
///
|
|
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 "
|
|
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<
|
|
22
|
+
jni::local_ref<JHybridNitroMetamaskSpec::jhybriddata> JHybridNitroMetamaskSpec::initHybrid(jni::alias_ref<jhybridobject> jThis) {
|
|
22
23
|
return makeCxxInstance(jThis);
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
void
|
|
26
|
+
void JHybridNitroMetamaskSpec::registerNatives() {
|
|
26
27
|
registerHybrid({
|
|
27
|
-
makeNativeMethod("initHybrid",
|
|
28
|
+
makeNativeMethod("initHybrid", JHybridNitroMetamaskSpec::initHybrid),
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
size_t
|
|
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
|
|
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
|
|
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::
|
|
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>>
|
|
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
|
-
///
|
|
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 "
|
|
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
|
|
22
|
-
|
|
21
|
+
class JHybridNitroMetamaskSpec: public jni::HybridClass<JHybridNitroMetamaskSpec, JHybridObject>,
|
|
22
|
+
public virtual HybridNitroMetamaskSpec {
|
|
23
23
|
public:
|
|
24
|
-
static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/nitrometamask/
|
|
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
|
|
31
|
-
HybridObject(
|
|
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
|
-
~
|
|
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<
|
|
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<
|
|
65
|
+
jni::global_ref<JHybridNitroMetamaskSpec::javaobject> _javaPart;
|
|
64
66
|
};
|
|
65
67
|
|
|
66
68
|
} // namespace margelo::nitro::nitrometamask
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
///
|
|
2
|
-
///
|
|
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
|
|
18
|
-
* Implement this abstract class to create Kotlin-based instances of
|
|
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
|
|
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
|
|
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 = "
|
|
68
|
+
protected const val TAG = "HybridNitroMetamaskSpec"
|
|
61
69
|
}
|
|
62
70
|
}
|