@novastera-oss/nitro-metamask 0.6.2 → 0.7.0

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 (168) hide show
  1. package/NitroMetamask.podspec +12 -3
  2. package/android/build.gradle +10 -13
  3. package/android/cargo-ecies.gradle +59 -78
  4. package/android/src/main/aidl/io/metamask/nativesdk/IMessegeService.aidl +8 -0
  5. package/android/src/main/aidl/io/metamask/nativesdk/IMessegeServiceCallback.aidl +8 -0
  6. package/android/src/main/java/com/margelo/nitro/nitrometamask/HybridNitroMetamask.kt +101 -3
  7. package/android/src/main/java/io/metamask/androidsdk/AnyRequest.kt +8 -0
  8. package/android/src/main/java/io/metamask/androidsdk/ClientMessageServiceCallback.kt +12 -0
  9. package/android/src/main/java/io/metamask/androidsdk/ClientServiceConnection.kt +42 -0
  10. package/android/src/main/java/io/metamask/androidsdk/CommunicationClient.kt +525 -0
  11. package/android/src/main/java/io/metamask/androidsdk/CommunicationClientModule.kt +47 -0
  12. package/android/src/main/java/io/metamask/androidsdk/CommunicationClientModuleInterface.kt +11 -0
  13. package/android/src/main/java/io/metamask/androidsdk/Constants.kt +5 -0
  14. package/android/src/main/java/io/metamask/androidsdk/Crypto.kt +35 -0
  15. package/android/src/main/java/io/metamask/androidsdk/DappMetadata.kt +36 -0
  16. package/android/src/main/java/io/metamask/androidsdk/Encryption.kt +9 -0
  17. package/android/src/main/java/io/metamask/androidsdk/ErrorType.kt +41 -0
  18. package/android/src/main/java/io/metamask/androidsdk/Ethereum.kt +328 -0
  19. package/android/src/main/java/io/metamask/androidsdk/EthereumEventCallback.kt +6 -0
  20. package/android/src/main/java/io/metamask/androidsdk/EthereumMethod.kt +80 -0
  21. package/android/src/main/java/io/metamask/androidsdk/EthereumRequest.kt +7 -0
  22. package/android/src/main/java/io/metamask/androidsdk/EthereumState.kt +7 -0
  23. package/android/src/main/java/io/metamask/androidsdk/KeyExchange.kt +77 -0
  24. package/android/src/main/java/io/metamask/androidsdk/KeyExchangeMessageType.kt +20 -0
  25. package/android/src/main/java/io/metamask/androidsdk/KeyStorage.kt +122 -0
  26. package/android/src/main/java/io/metamask/androidsdk/Logger.kt +18 -0
  27. package/android/src/main/java/io/metamask/androidsdk/Message.kt +3 -0
  28. package/android/src/main/java/io/metamask/androidsdk/MessageType.kt +11 -0
  29. package/android/src/main/java/io/metamask/androidsdk/OriginatorInfo.kt +12 -0
  30. package/android/src/main/java/io/metamask/androidsdk/RequestError.kt +8 -0
  31. package/android/src/main/java/io/metamask/androidsdk/RequestInfo.kt +9 -0
  32. package/android/src/main/java/io/metamask/androidsdk/Result.kt +11 -0
  33. package/android/src/main/java/io/metamask/androidsdk/RpcRequest.kt +7 -0
  34. package/android/src/main/java/io/metamask/androidsdk/SDKInfo.kt +6 -0
  35. package/android/src/main/java/io/metamask/androidsdk/SDKOptions.kt +6 -0
  36. package/android/src/main/java/io/metamask/androidsdk/SecureStorage.kt +9 -0
  37. package/android/src/main/java/io/metamask/androidsdk/SessionConfig.kt +10 -0
  38. package/android/src/main/java/io/metamask/androidsdk/SessionManager.kt +92 -0
  39. package/android/src/main/java/io/metamask/androidsdk/SubmittedRequest.kt +8 -0
  40. package/android/src/main/java/io/metamask/androidsdk/TimeStampGenerator.kt +7 -0
  41. package/android/src/main/jniLibs/arm64-v8a/libecies.so +0 -0
  42. package/android/src/main/jniLibs/armeabi-v7a/libecies.so +0 -0
  43. package/android/src/main/jniLibs/x86/libecies.so +0 -0
  44. package/android/src/main/jniLibs/x86_64/libecies.so +0 -0
  45. package/android/src/test/java/com/margelo/nitro/nitrometamask/CancellationStateMachineTest.kt +128 -0
  46. package/android/src/test/java/com/margelo/nitro/nitrometamask/ChainIdParsingTest.kt +65 -0
  47. package/android/src/test/java/com/margelo/nitro/nitrometamask/ConfigureStateMachineTest.kt +140 -0
  48. package/android/src/test/java/com/margelo/nitro/nitrometamask/ConnectSignJsonTest.kt +76 -0
  49. package/android/src/test/java/com/margelo/nitro/nitrometamask/MetaMaskInstallationCheckTest.kt +42 -0
  50. package/android/src/test/java/com/margelo/nitro/nitrometamask/PersonalSignParamsTest.kt +75 -0
  51. package/ios/Frameworks/Ecies.xcframework/Info.plist +47 -0
  52. package/ios/Frameworks/Ecies.xcframework/ios-arm64/Headers/ecies.h +20 -0
  53. package/ios/Frameworks/Ecies.xcframework/ios-arm64/Headers/module.modulemap +4 -0
  54. package/ios/Frameworks/Ecies.xcframework/ios-arm64/libecies.a +0 -0
  55. package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/Headers/ecies.h +20 -0
  56. package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/Headers/module.modulemap +4 -0
  57. package/ios/Frameworks/Ecies.xcframework/ios-arm64-simulator/libecies.a +0 -0
  58. package/ios/HybridNitroMetamask.swift +119 -54
  59. package/ios/NitroMetamaskTests/CancellationStateMachineTests.swift +150 -0
  60. package/ios/NitroMetamaskTests/ChainIdParsingTests.swift +117 -0
  61. package/ios/NitroMetamaskTests/ConfigureStateMachineTests.swift +174 -0
  62. package/ios/NitroMetamaskTests/ConnectSignJsonTests.swift +168 -0
  63. package/ios/NitroMetamaskTests/DefaultDappUrlTests.swift +80 -0
  64. package/ios/NitroMetamaskTests/PersonalSignParamsTests.swift +101 -0
  65. package/ios/metamask-ios-sdk/CommunicationLayer/CommClient.swift +43 -0
  66. package/ios/metamask-ios-sdk/CommunicationLayer/CommClientFactory.swift +17 -0
  67. package/ios/metamask-ios-sdk/CommunicationLayer/CommLayer.swift +36 -0
  68. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/Deeplink.swift +26 -0
  69. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/DeeplinkClient.swift +199 -0
  70. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/DeeplinkManager.swift +83 -0
  71. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/String.swift +48 -0
  72. package/ios/metamask-ios-sdk/CommunicationLayer/DeeplinkCommLayer/URLOpener.swift +19 -0
  73. package/ios/metamask-ios-sdk/CommunicationLayer/SocketClient.swift +27 -0
  74. package/ios/metamask-ios-sdk/Crypto/Crypto.swift +72 -0
  75. package/ios/metamask-ios-sdk/Crypto/Encoding.swift +15 -0
  76. package/ios/metamask-ios-sdk/Crypto/KeyExchange.swift +236 -0
  77. package/ios/metamask-ios-sdk/DeviceInfo/DeviceInfo.swift +11 -0
  78. package/ios/metamask-ios-sdk/Ethereum/AppMetadata.swift +28 -0
  79. package/ios/metamask-ios-sdk/Ethereum/ErrorType.swift +62 -0
  80. package/ios/metamask-ios-sdk/Ethereum/Ethereum.swift +810 -0
  81. package/ios/metamask-ios-sdk/Ethereum/EthereumMethod.swift +111 -0
  82. package/ios/metamask-ios-sdk/Ethereum/EthereumRequest.swift +40 -0
  83. package/ios/metamask-ios-sdk/Ethereum/EthereumWrapper.swift +10 -0
  84. package/ios/metamask-ios-sdk/Ethereum/RPCRequest.swift +14 -0
  85. package/ios/metamask-ios-sdk/Ethereum/RequestError.swift +88 -0
  86. package/ios/metamask-ios-sdk/Ethereum/ResponseMethod.swift +22 -0
  87. package/ios/metamask-ios-sdk/Ethereum/SubmitRequest.swift +26 -0
  88. package/ios/metamask-ios-sdk/Ethereum/TimestampGenerator.swift +16 -0
  89. package/ios/metamask-ios-sdk/Extensions/NSRecursiveLock.swift +14 -0
  90. package/ios/metamask-ios-sdk/Extensions/Notification.swift +10 -0
  91. package/ios/metamask-ios-sdk/Logger/Logging.swift +27 -0
  92. package/ios/metamask-ios-sdk/Models/AddChainParameters.swift +35 -0
  93. package/ios/metamask-ios-sdk/Models/Event.swift +19 -0
  94. package/ios/metamask-ios-sdk/Models/Mappable.swift +40 -0
  95. package/ios/metamask-ios-sdk/Models/NativeCurrency.swift +25 -0
  96. package/ios/metamask-ios-sdk/Models/OriginatorInfo.swift +26 -0
  97. package/ios/metamask-ios-sdk/Models/RequestInfo.swift +18 -0
  98. package/ios/metamask-ios-sdk/Models/SignContract.swift +48 -0
  99. package/ios/metamask-ios-sdk/Models/Typealiases.swift +9 -0
  100. package/ios/metamask-ios-sdk/Persistence/SecureStore.swift +134 -0
  101. package/ios/metamask-ios-sdk/Persistence/SessionConfig.swift +24 -0
  102. package/ios/metamask-ios-sdk/Persistence/SessionManager.swift +56 -0
  103. package/ios/metamask-ios-sdk/SDK/Dependencies.swift +35 -0
  104. package/ios/metamask-ios-sdk/SDK/MetaMaskSDK.swift +215 -0
  105. package/ios/metamask-ios-sdk/SDK/SDKInfo.swift +37 -0
  106. package/ios/metamask-ios-sdk/SDK/SDKOptions.swift +16 -0
  107. package/lib/commonjs/index.js +50 -3
  108. package/lib/commonjs/index.js.map +1 -1
  109. package/lib/module/index.js +49 -3
  110. package/lib/module/index.js.map +1 -1
  111. package/lib/typescript/src/__tests__/parseNitroError.test.d.ts +2 -0
  112. package/lib/typescript/src/__tests__/parseNitroError.test.d.ts.map +1 -0
  113. package/lib/typescript/src/index.d.ts +43 -3
  114. package/lib/typescript/src/index.d.ts.map +1 -1
  115. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts +34 -6
  116. package/lib/typescript/src/specs/nitro-metamask.nitro.d.ts.map +1 -1
  117. package/nitro.json +8 -2
  118. package/nitrogen/generated/android/NitroMetamask+autolinking.cmake +1 -1
  119. package/nitrogen/generated/android/NitroMetamask+autolinking.gradle +1 -1
  120. package/nitrogen/generated/android/NitroMetamaskOnLoad.cpp +27 -17
  121. package/nitrogen/generated/android/NitroMetamaskOnLoad.hpp +14 -5
  122. package/nitrogen/generated/android/c++/JConnectResult.hpp +2 -2
  123. package/nitrogen/generated/android/c++/JConnectSignResult.hpp +2 -2
  124. package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.cpp +26 -25
  125. package/nitrogen/generated/android/c++/JHybridNitroMetamaskSpec.hpp +20 -22
  126. package/nitrogen/generated/android/c++/JVariant_NullType_Long.cpp +1 -1
  127. package/nitrogen/generated/android/c++/JVariant_NullType_Long.hpp +4 -4
  128. package/nitrogen/generated/android/c++/JVariant_NullType_String.cpp +1 -1
  129. package/nitrogen/generated/android/c++/JVariant_NullType_String.hpp +4 -4
  130. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectResult.kt +16 -1
  131. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/ConnectSignResult.kt +18 -1
  132. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/HybridNitroMetamaskSpec.kt +16 -19
  133. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/NitroMetamaskOnLoad.kt +1 -1
  134. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_Long.kt +15 -12
  135. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrometamask/Variant_NullType_String.kt +15 -12
  136. package/nitrogen/generated/ios/NitroMetamask+autolinking.rb +3 -1
  137. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.cpp +1 -1
  138. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Bridge.hpp +2 -2
  139. package/nitrogen/generated/ios/NitroMetamask-Swift-Cxx-Umbrella.hpp +1 -1
  140. package/nitrogen/generated/ios/NitroMetamaskAutolinking.mm +1 -1
  141. package/nitrogen/generated/ios/NitroMetamaskAutolinking.swift +9 -8
  142. package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.cpp +1 -1
  143. package/nitrogen/generated/ios/c++/HybridNitroMetamaskSpecSwift.hpp +7 -1
  144. package/nitrogen/generated/ios/swift/ConnectResult.swift +1 -2
  145. package/nitrogen/generated/ios/swift/ConnectSignResult.swift +1 -2
  146. package/nitrogen/generated/ios/swift/Func_void_ConnectResult.swift +1 -2
  147. package/nitrogen/generated/ios/swift/Func_void_ConnectSignResult.swift +1 -2
  148. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -2
  149. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -2
  150. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__int64_t_.swift +1 -2
  151. package/nitrogen/generated/ios/swift/Func_void_std__variant_nitro__NullType__std__string_.swift +1 -2
  152. package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec.swift +3 -4
  153. package/nitrogen/generated/ios/swift/HybridNitroMetamaskSpec_cxx.swift +9 -2
  154. package/nitrogen/generated/ios/swift/Variant_NullType_Int64.swift +14 -2
  155. package/nitrogen/generated/ios/swift/Variant_NullType_String.swift +13 -1
  156. package/nitrogen/generated/shared/c++/ConnectResult.hpp +1 -1
  157. package/nitrogen/generated/shared/c++/ConnectSignResult.hpp +1 -1
  158. package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.cpp +1 -1
  159. package/nitrogen/generated/shared/c++/HybridNitroMetamaskSpec.hpp +1 -1
  160. package/package.json +18 -13
  161. package/rust/ecies-jni/Cargo.lock +50 -86
  162. package/rust/ecies-jni/Cargo.toml +1 -1
  163. package/rust/ecies-jni/src/lib.rs +164 -100
  164. package/src/__tests__/parseNitroError.test.ts +35 -0
  165. package/src/index.ts +53 -5
  166. package/src/specs/nitro-metamask.nitro.ts +34 -6
  167. package/scripts/verify-16k-page-alignment.py +0 -117
  168. package/scripts/verify-16k-page-alignment.sh +0 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@novastera-oss/nitro-metamask",
3
- "version": "0.6.2",
3
+ "version": "0.7.0",
4
4
  "description": "Native mobile MetaMask wallet integration for React Native. Part of Novastera CRM/ERP platform ecosystem. Provides secure authentication and message signing for Web3 mobile applications.",
5
5
  "main": "./lib/commonjs/index.js",
6
6
  "module": "./lib/module/index.js",
@@ -12,8 +12,7 @@
12
12
  "clean": "git clean -dfX",
13
13
  "release": "semantic-release",
14
14
  "build": "npm run typecheck && bob build",
15
- "codegen": "nitrogen --logLevel=\"debug\" && npm run build",
16
- "build:ecies:all-abis": "cd example/android && ./gradlew :app:assembleRelease -PreactNativeArchitectures=arm64-v8a,armeabi-v7a,x86_64,x86 -PNitroMetamask_buildEciesFromSource=true --no-daemon --stacktrace"
15
+ "codegen": "nitrogen --logLevel=\"debug\" && npm run build"
17
16
  },
18
17
  "keywords": [
19
18
  "react-native",
@@ -49,6 +48,10 @@
49
48
  "android/proguard-rules.pro",
50
49
  "android/src",
51
50
  "android/src/main/jniLibs",
51
+ "android/src/main/java/io/metamask/**",
52
+ "android/src/main/aidl/**",
53
+ "ios/metamask-ios-sdk/**",
54
+ "ios/Frameworks/**",
52
55
  "ios/**/*.h",
53
56
  "ios/**/*.m",
54
57
  "ios/**/*.mm",
@@ -59,9 +62,7 @@
59
62
  "README.md",
60
63
  "rust/ecies-jni/Cargo.toml",
61
64
  "rust/ecies-jni/src",
62
- "rust/ecies-jni/Cargo.lock",
63
- "scripts/verify-16k-page-alignment.sh",
64
- "scripts/verify-16k-page-alignment.py"
65
+ "rust/ecies-jni/Cargo.lock"
65
66
  ],
66
67
  "workspaces": [
67
68
  "example"
@@ -79,25 +80,29 @@
79
80
  "registry": "https://registry.npmjs.org/"
80
81
  },
81
82
  "devDependencies": {
82
- "@jamesacarr/eslint-formatter-github-actions": "^0.2.0",
83
+ "@babel/core": "^7.29.0",
84
+ "@babel/preset-env": "^7.29.2",
85
+ "@babel/preset-typescript": "^7.28.5",
83
86
  "@semantic-release/changelog": "^6.0.3",
84
87
  "@semantic-release/git": "^10.0.1",
85
88
  "@types/jest": "^29.5.12",
86
89
  "@types/react": "19.2.0",
87
- "nitrogen": "0.32.0",
90
+ "babel-jest": "^30.3.0",
91
+ "conventional-changelog-conventionalcommits": "^9.1.0",
92
+ "jest": "^30.3.0",
93
+ "nitrogen": "^0.35.5",
88
94
  "react": "19.2.0",
89
95
  "react-native": "0.83",
90
- "react-native-builder-bob": "^0.40.17",
91
- "react-native-nitro-modules": "0.32.0",
92
- "conventional-changelog-conventionalcommits": "^9.1.0",
96
+ "react-native-builder-bob": "^0.40.18",
97
+ "react-native-nitro-modules": "0.35.5",
93
98
  "semantic-release": "^25.0.2",
94
99
  "typescript": "^5.8.3"
95
100
  },
96
101
  "peerDependencies": {
102
+ "@expo/config-plugins": "*",
97
103
  "react": "*",
98
104
  "react-native": "*",
99
- "react-native-nitro-modules": "*",
100
- "@expo/config-plugins": "*"
105
+ "react-native-nitro-modules": "*"
101
106
  },
102
107
  "eslintConfig": {
103
108
  "root": true,
@@ -82,12 +82,6 @@ version = "1.11.1"
82
82
  source = "registry+https://github.com/rust-lang/crates.io-index"
83
83
  checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
84
84
 
85
- [[package]]
86
- name = "cesu8"
87
- version = "1.1.0"
88
- source = "registry+https://github.com/rust-lang/crates.io-index"
89
- checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
90
-
91
85
  [[package]]
92
86
  name = "cfg-if"
93
87
  version = "1.0.4"
@@ -270,27 +264,32 @@ dependencies = [
270
264
 
271
265
  [[package]]
272
266
  name = "jni"
273
- version = "0.21.1"
267
+ version = "0.22.4"
274
268
  source = "registry+https://github.com/rust-lang/crates.io-index"
275
- checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
269
+ checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"
276
270
  dependencies = [
277
- "cesu8",
278
271
  "cfg-if",
279
272
  "combine",
280
- "jni-sys 0.3.1",
273
+ "jni-macros",
274
+ "jni-sys",
281
275
  "log",
276
+ "simd_cesu8",
282
277
  "thiserror",
283
278
  "walkdir",
284
- "windows-sys 0.45.0",
279
+ "windows-link",
285
280
  ]
286
281
 
287
282
  [[package]]
288
- name = "jni-sys"
289
- version = "0.3.1"
283
+ name = "jni-macros"
284
+ version = "0.22.4"
290
285
  source = "registry+https://github.com/rust-lang/crates.io-index"
291
- checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
286
+ checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"
292
287
  dependencies = [
293
- "jni-sys 0.4.1",
288
+ "proc-macro2",
289
+ "quote",
290
+ "rustc_version",
291
+ "simd_cesu8",
292
+ "syn",
294
293
  ]
295
294
 
296
295
  [[package]]
@@ -497,6 +496,15 @@ dependencies = [
497
496
  "bitflags",
498
497
  ]
499
498
 
499
+ [[package]]
500
+ name = "rustc_version"
501
+ version = "0.4.1"
502
+ source = "registry+https://github.com/rust-lang/crates.io-index"
503
+ checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
504
+ dependencies = [
505
+ "semver",
506
+ ]
507
+
500
508
  [[package]]
501
509
  name = "rustversion"
502
510
  version = "1.0.22"
@@ -518,6 +526,12 @@ version = "1.2.0"
518
526
  source = "registry+https://github.com/rust-lang/crates.io-index"
519
527
  checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
520
528
 
529
+ [[package]]
530
+ name = "semver"
531
+ version = "1.0.28"
532
+ source = "registry+https://github.com/rust-lang/crates.io-index"
533
+ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
534
+
521
535
  [[package]]
522
536
  name = "serde"
523
537
  version = "1.0.228"
@@ -559,6 +573,22 @@ dependencies = [
559
573
  "digest 0.10.7",
560
574
  ]
561
575
 
576
+ [[package]]
577
+ name = "simd_cesu8"
578
+ version = "1.1.1"
579
+ source = "registry+https://github.com/rust-lang/crates.io-index"
580
+ checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33"
581
+ dependencies = [
582
+ "rustc_version",
583
+ "simdutf8",
584
+ ]
585
+
586
+ [[package]]
587
+ name = "simdutf8"
588
+ version = "0.1.5"
589
+ source = "registry+https://github.com/rust-lang/crates.io-index"
590
+ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
591
+
562
592
  [[package]]
563
593
  name = "smallvec"
564
594
  version = "1.15.1"
@@ -584,18 +614,18 @@ dependencies = [
584
614
 
585
615
  [[package]]
586
616
  name = "thiserror"
587
- version = "1.0.69"
617
+ version = "2.0.18"
588
618
  source = "registry+https://github.com/rust-lang/crates.io-index"
589
- checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
619
+ checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
590
620
  dependencies = [
591
621
  "thiserror-impl",
592
622
  ]
593
623
 
594
624
  [[package]]
595
625
  name = "thiserror-impl"
596
- version = "1.0.69"
626
+ version = "2.0.18"
597
627
  source = "registry+https://github.com/rust-lang/crates.io-index"
598
- checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
628
+ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
599
629
  dependencies = [
600
630
  "proc-macro2",
601
631
  "quote",
@@ -697,7 +727,7 @@ version = "0.1.11"
697
727
  source = "registry+https://github.com/rust-lang/crates.io-index"
698
728
  checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
699
729
  dependencies = [
700
- "windows-sys 0.61.2",
730
+ "windows-sys",
701
731
  ]
702
732
 
703
733
  [[package]]
@@ -706,15 +736,6 @@ version = "0.2.1"
706
736
  source = "registry+https://github.com/rust-lang/crates.io-index"
707
737
  checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
708
738
 
709
- [[package]]
710
- name = "windows-sys"
711
- version = "0.45.0"
712
- source = "registry+https://github.com/rust-lang/crates.io-index"
713
- checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
714
- dependencies = [
715
- "windows-targets",
716
- ]
717
-
718
739
  [[package]]
719
740
  name = "windows-sys"
720
741
  version = "0.61.2"
@@ -723,60 +744,3 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
723
744
  dependencies = [
724
745
  "windows-link",
725
746
  ]
726
-
727
- [[package]]
728
- name = "windows-targets"
729
- version = "0.42.2"
730
- source = "registry+https://github.com/rust-lang/crates.io-index"
731
- checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
732
- dependencies = [
733
- "windows_aarch64_gnullvm",
734
- "windows_aarch64_msvc",
735
- "windows_i686_gnu",
736
- "windows_i686_msvc",
737
- "windows_x86_64_gnu",
738
- "windows_x86_64_gnullvm",
739
- "windows_x86_64_msvc",
740
- ]
741
-
742
- [[package]]
743
- name = "windows_aarch64_gnullvm"
744
- version = "0.42.2"
745
- source = "registry+https://github.com/rust-lang/crates.io-index"
746
- checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
747
-
748
- [[package]]
749
- name = "windows_aarch64_msvc"
750
- version = "0.42.2"
751
- source = "registry+https://github.com/rust-lang/crates.io-index"
752
- checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
753
-
754
- [[package]]
755
- name = "windows_i686_gnu"
756
- version = "0.42.2"
757
- source = "registry+https://github.com/rust-lang/crates.io-index"
758
- checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
759
-
760
- [[package]]
761
- name = "windows_i686_msvc"
762
- version = "0.42.2"
763
- source = "registry+https://github.com/rust-lang/crates.io-index"
764
- checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
765
-
766
- [[package]]
767
- name = "windows_x86_64_gnu"
768
- version = "0.42.2"
769
- source = "registry+https://github.com/rust-lang/crates.io-index"
770
- checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
771
-
772
- [[package]]
773
- name = "windows_x86_64_gnullvm"
774
- version = "0.42.2"
775
- source = "registry+https://github.com/rust-lang/crates.io-index"
776
- checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
777
-
778
- [[package]]
779
- name = "windows_x86_64_msvc"
780
- version = "0.42.2"
781
- source = "registry+https://github.com/rust-lang/crates.io-index"
782
- checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
@@ -10,7 +10,7 @@ crate-type = ["cdylib"]
10
10
  name = "ecies"
11
11
 
12
12
  [dependencies]
13
- jni = "0.21"
13
+ jni = "0.22"
14
14
  # Match ecies.org / MetaMask stack (secp256k1, AES-256-GCM); pure Rust AES for simpler Android linking
15
15
  ecies = { version = "0.2.10", default-features = false, features = ["std", "aes-rust"] }
16
16
  hex = "0.4"
@@ -1,127 +1,191 @@
1
1
  //! JNI bridge for `io.metamask.ecies.Ecies` (MetaMask Android SDK).
2
2
  //! Rebuilt with NDK r28+ / 16 KB page-size compatible linking (see Gradle + cargo-ndk).
3
+ //!
4
+ //! Symbol naming: Kotlin `@JvmStatic` methods in a `companion object` are exposed
5
+ //! directly on the enclosing class by the JVM, so the JNI symbol is
6
+ //! `Java_io_metamask_ecies_Ecies_<method>` — NOT `..._00024Companion_<method>`.
7
+ //! Verified against upstream libecies.so exports via `nm -D`.
3
8
 
4
9
  use ecies::{decrypt, encrypt, utils::generate_keypair};
10
+ use jni::errors::Result as JniResult;
11
+ use jni::errors::ThrowRuntimeExAndDefault;
12
+ use jni::objects::JClass;
5
13
  use jni::objects::JString;
6
14
  use jni::sys::jstring;
7
- use jni::JNIEnv;
15
+ use jni::{Env, EnvUnowned};
8
16
 
9
- fn empty_jstring(env: &mut JNIEnv) -> jstring {
10
- env.new_string("")
11
- .expect("empty jstring")
12
- .into_raw()
17
+ fn empty_jstring<'local>(env: &mut Env<'local>) -> jstring {
18
+ env.new_string("").expect("empty jstring").into_raw()
13
19
  }
14
20
 
15
- fn jstring_to_string(env: &mut JNIEnv, j: JString) -> Result<String, jni::errors::Error> {
16
- Ok(env.get_string(&j)?.into())
21
+ fn jstring_to_string<'local>(
22
+ _env: &mut Env<'local>,
23
+ j: JString<'local>,
24
+ ) -> Result<String, jni::errors::Error> {
25
+ Ok(j.to_string())
17
26
  }
18
27
 
19
- /// Kotlin: `Ecies.companion.generateSecretKey`
28
+ /// Kotlin: `Ecies.generateSecretKey()` (@JvmStatic in companion object)
20
29
  #[no_mangle]
21
- pub extern "system" fn Java_io_metamask_ecies_Ecies_00024Companion_generateSecretKey(
22
- mut env: JNIEnv,
23
- _class: jni::objects::JClass,
30
+ pub extern "system" fn Java_io_metamask_ecies_Ecies_generateSecretKey<'local>(
31
+ mut unowned_env: EnvUnowned<'local>,
32
+ _class: JClass<'local>,
24
33
  ) -> jstring {
25
- let (sk, _pk) = generate_keypair();
26
- let hex = hex::encode(sk.serialize());
27
- match env.new_string(hex) {
28
- Ok(s) => s.into_raw(),
29
- Err(_) => empty_jstring(&mut env),
30
- }
34
+ unowned_env
35
+ .with_env(|mut env| -> JniResult<jstring> {
36
+ let (sk, _pk) = generate_keypair();
37
+ let hex = hex::encode(sk.serialize());
38
+ match env.new_string(hex) {
39
+ Ok(s) => Ok(s.into_raw()),
40
+ Err(_) => Ok(empty_jstring(&mut env)),
41
+ }
42
+ })
43
+ .resolve::<ThrowRuntimeExAndDefault>()
31
44
  }
32
45
 
33
- /// Kotlin: `Ecies.companion.derivePublicKeyFrom`
46
+ /// Kotlin: `Ecies.derivePublicKeyFrom(secret)` (@JvmStatic in companion object)
34
47
  #[no_mangle]
35
- pub extern "system" fn Java_io_metamask_ecies_Ecies_00024Companion_derivePublicKeyFrom(
36
- mut env: JNIEnv,
37
- _class: jni::objects::JClass,
38
- secret: JString,
48
+ pub extern "system" fn Java_io_metamask_ecies_Ecies_derivePublicKeyFrom<'local>(
49
+ mut unowned_env: EnvUnowned<'local>,
50
+ _class: JClass<'local>,
51
+ secret: JString<'local>,
39
52
  ) -> jstring {
40
- let secret_str = match jstring_to_string(&mut env, secret) {
41
- Ok(s) => s,
42
- Err(_) => return empty_jstring(&mut env),
43
- };
44
- let sk_bytes = match hex::decode(secret_str.trim()) {
45
- Ok(b) => b,
46
- Err(_) => return empty_jstring(&mut env),
47
- };
48
- let sk = match ecies::SecretKey::parse_slice(&sk_bytes) {
49
- Ok(k) => k,
50
- Err(_) => return empty_jstring(&mut env),
51
- };
52
- let pk = ecies::PublicKey::from_secret_key(&sk);
53
- let hex = hex::encode(pk.serialize());
54
- match env.new_string(hex) {
55
- Ok(s) => s.into_raw(),
56
- Err(_) => empty_jstring(&mut env),
57
- }
53
+ unowned_env
54
+ .with_env(|mut env| -> JniResult<jstring> {
55
+ let secret_str = match jstring_to_string(&mut env, secret) {
56
+ Ok(s) => s,
57
+ Err(_) => return Ok(empty_jstring(&mut env)),
58
+ };
59
+ let sk_bytes = match hex::decode(secret_str.trim()) {
60
+ Ok(b) => b,
61
+ Err(_) => return Ok(empty_jstring(&mut env)),
62
+ };
63
+ let sk = match ecies::SecretKey::parse_slice(&sk_bytes) {
64
+ Ok(k) => k,
65
+ Err(_) => return Ok(empty_jstring(&mut env)),
66
+ };
67
+ let pk = ecies::PublicKey::from_secret_key(&sk);
68
+ let hex = hex::encode(pk.serialize());
69
+ match env.new_string(hex) {
70
+ Ok(s) => Ok(s.into_raw()),
71
+ Err(_) => Ok(empty_jstring(&mut env)),
72
+ }
73
+ })
74
+ .resolve::<ThrowRuntimeExAndDefault>()
58
75
  }
59
76
 
60
- /// Kotlin: `Ecies.companion.encryptMessage`
77
+ /// Kotlin: `Ecies.encryptMessage(public, message)` (@JvmStatic in companion object)
61
78
  #[no_mangle]
62
- pub extern "system" fn Java_io_metamask_ecies_Ecies_00024Companion_encryptMessage(
63
- mut env: JNIEnv,
64
- _class: jni::objects::JClass,
65
- public: JString,
66
- message: JString,
79
+ pub extern "system" fn Java_io_metamask_ecies_Ecies_encryptMessage<'local>(
80
+ mut unowned_env: EnvUnowned<'local>,
81
+ _class: JClass<'local>,
82
+ public: JString<'local>,
83
+ message: JString<'local>,
67
84
  ) -> jstring {
68
- let pub_hex = match jstring_to_string(&mut env, public) {
69
- Ok(s) => s,
70
- Err(_) => return empty_jstring(&mut env),
71
- };
72
- let msg_str = match jstring_to_string(&mut env, message) {
73
- Ok(s) => s,
74
- Err(_) => return empty_jstring(&mut env),
75
- };
76
- let pk_bytes = match hex::decode(pub_hex.trim()) {
77
- Ok(b) => b,
78
- Err(_) => return empty_jstring(&mut env),
79
- };
80
- let ct = match encrypt(&pk_bytes, msg_str.as_bytes()) {
81
- Ok(c) => c,
82
- Err(_) => return empty_jstring(&mut env),
83
- };
84
- let hex = hex::encode(ct);
85
- match env.new_string(hex) {
86
- Ok(s) => s.into_raw(),
87
- Err(_) => empty_jstring(&mut env),
88
- }
85
+ unowned_env
86
+ .with_env(|mut env| -> JniResult<jstring> {
87
+ let pub_hex = match jstring_to_string(&mut env, public) {
88
+ Ok(s) => s,
89
+ Err(_) => return Ok(empty_jstring(&mut env)),
90
+ };
91
+ let msg_str = match jstring_to_string(&mut env, message) {
92
+ Ok(s) => s,
93
+ Err(_) => return Ok(empty_jstring(&mut env)),
94
+ };
95
+ let pk_bytes = match hex::decode(pub_hex.trim()) {
96
+ Ok(b) => b,
97
+ Err(_) => return Ok(empty_jstring(&mut env)),
98
+ };
99
+ let ct = match encrypt(&pk_bytes, msg_str.as_bytes()) {
100
+ Ok(c) => c,
101
+ Err(_) => return Ok(empty_jstring(&mut env)),
102
+ };
103
+ let hex = hex::encode(ct);
104
+ match env.new_string(hex) {
105
+ Ok(s) => Ok(s.into_raw()),
106
+ Err(_) => Ok(empty_jstring(&mut env)),
107
+ }
108
+ })
109
+ .resolve::<ThrowRuntimeExAndDefault>()
89
110
  }
90
111
 
91
- /// Kotlin: `Ecies.companion.decryptMessage`
112
+ /// Kotlin: `Ecies.decryptMessage(secret, message)` (@JvmStatic in companion object)
92
113
  #[no_mangle]
93
- pub extern "system" fn Java_io_metamask_ecies_Ecies_00024Companion_decryptMessage(
94
- mut env: JNIEnv,
95
- _class: jni::objects::JClass,
96
- secret: JString,
97
- message: JString,
114
+ pub extern "system" fn Java_io_metamask_ecies_Ecies_decryptMessage<'local>(
115
+ mut unowned_env: EnvUnowned<'local>,
116
+ _class: JClass<'local>,
117
+ secret: JString<'local>,
118
+ message: JString<'local>,
98
119
  ) -> jstring {
99
- let sec_hex = match jstring_to_string(&mut env, secret) {
100
- Ok(s) => s,
101
- Err(_) => return empty_jstring(&mut env),
102
- };
103
- let ct_hex = match jstring_to_string(&mut env, message) {
104
- Ok(s) => s,
105
- Err(_) => return empty_jstring(&mut env),
106
- };
107
- let sk_bytes = match hex::decode(sec_hex.trim()) {
108
- Ok(b) => b,
109
- Err(_) => return empty_jstring(&mut env),
110
- };
111
- let ct_bytes = match hex::decode(ct_hex.trim()) {
112
- Ok(b) => b,
113
- Err(_) => return empty_jstring(&mut env),
114
- };
115
- let plain = match decrypt(&sk_bytes, &ct_bytes) {
116
- Ok(p) => p,
117
- Err(_) => return empty_jstring(&mut env),
118
- };
119
- let text = match String::from_utf8(plain) {
120
- Ok(t) => t,
121
- Err(_) => return empty_jstring(&mut env),
122
- };
123
- match env.new_string(text) {
124
- Ok(s) => s.into_raw(),
125
- Err(_) => empty_jstring(&mut env),
120
+ unowned_env
121
+ .with_env(|mut env| -> JniResult<jstring> {
122
+ let sec_hex = match jstring_to_string(&mut env, secret) {
123
+ Ok(s) => s,
124
+ Err(_) => return Ok(empty_jstring(&mut env)),
125
+ };
126
+ let ct_hex = match jstring_to_string(&mut env, message) {
127
+ Ok(s) => s,
128
+ Err(_) => return Ok(empty_jstring(&mut env)),
129
+ };
130
+ let sk_bytes = match hex::decode(sec_hex.trim()) {
131
+ Ok(b) => b,
132
+ Err(_) => return Ok(empty_jstring(&mut env)),
133
+ };
134
+ let ct_bytes = match hex::decode(ct_hex.trim()) {
135
+ Ok(b) => b,
136
+ Err(_) => return Ok(empty_jstring(&mut env)),
137
+ };
138
+ let plain = match decrypt(&sk_bytes, &ct_bytes) {
139
+ Ok(p) => p,
140
+ Err(_) => return Ok(empty_jstring(&mut env)),
141
+ };
142
+ let text = match String::from_utf8(plain) {
143
+ Ok(t) => t,
144
+ Err(_) => return Ok(empty_jstring(&mut env)),
145
+ };
146
+ match env.new_string(text) {
147
+ Ok(s) => Ok(s.into_raw()),
148
+ Err(_) => Ok(empty_jstring(&mut env)),
149
+ }
150
+ })
151
+ .resolve::<ThrowRuntimeExAndDefault>()
152
+ }
153
+
154
+ #[cfg(test)]
155
+ mod tests {
156
+ macro_rules! assert_jni_symbol {
157
+ ($fn_name:ident) => {{
158
+ let name = stringify!($fn_name);
159
+ assert!(
160
+ !name.contains("_00024Companion_"),
161
+ "Symbol `{}` must NOT contain `_00024Companion_`",
162
+ name
163
+ );
164
+ assert!(
165
+ name.starts_with("Java_io_metamask_ecies_Ecies_"),
166
+ "Symbol `{}` must start with `Java_io_metamask_ecies_Ecies_`",
167
+ name
168
+ );
169
+ }};
170
+ }
171
+
172
+ #[test]
173
+ fn generate_secret_key_symbol_has_no_companion_mangling() {
174
+ assert_jni_symbol!(Java_io_metamask_ecies_Ecies_generateSecretKey);
175
+ }
176
+
177
+ #[test]
178
+ fn derive_public_key_from_symbol_has_no_companion_mangling() {
179
+ assert_jni_symbol!(Java_io_metamask_ecies_Ecies_derivePublicKeyFrom);
180
+ }
181
+
182
+ #[test]
183
+ fn encrypt_message_symbol_has_no_companion_mangling() {
184
+ assert_jni_symbol!(Java_io_metamask_ecies_Ecies_encryptMessage);
185
+ }
186
+
187
+ #[test]
188
+ fn decrypt_message_symbol_has_no_companion_mangling() {
189
+ assert_jni_symbol!(Java_io_metamask_ecies_Ecies_decryptMessage);
126
190
  }
127
191
  }
@@ -0,0 +1,35 @@
1
+ import { parseNitroError } from '../index'
2
+
3
+ // Mock the NitroModules dependency so the module can be imported in a Node/Jest environment
4
+ jest.mock('react-native-nitro-modules', () => ({
5
+ NitroModules: {
6
+ createHybridObject: () => ({}),
7
+ },
8
+ }))
9
+
10
+ describe('parseNitroError', () => {
11
+ it('parses "[2] MetaMask is not installed" into code 2 and the message', () => {
12
+ const result = parseNitroError(new Error('[2] MetaMask is not installed'))
13
+ expect(result).toEqual({ code: 2, message: 'MetaMask is not installed' })
14
+ })
15
+
16
+ it('returns null for a plain error message with no [code] prefix', () => {
17
+ const result = parseNitroError(new Error('Something went wrong'))
18
+ expect(result).toBeNull()
19
+ })
20
+
21
+ it('parses "[0] some error" into code 0 and the message', () => {
22
+ const result = parseNitroError(new Error('[0] some error'))
23
+ expect(result).toEqual({ code: 0, message: 'some error' })
24
+ })
25
+
26
+ it('parses a string input with [code] prefix', () => {
27
+ const result = parseNitroError('[42] timeout')
28
+ expect(result).toEqual({ code: 42, message: 'timeout' })
29
+ })
30
+
31
+ it('returns null for a non-string, non-Error input', () => {
32
+ const result = parseNitroError(null)
33
+ expect(result).toBeNull()
34
+ })
35
+ })