diff --git a/android/build.gradle b/android/build.gradle index 21946e6d..084b6541 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,12 +4,12 @@ import org.apache.tools.ant.taskdefs.condition.Os buildscript { ext { - buildToolsVersion = "34.0.0" + buildToolsVersion = "35.0.0" minSdkVersion = 28 - compileSdkVersion = 34 - targetSdkVersion = 34 - ndkVersion = "26.1.10909125" - kotlinVersion = "1.9.24" + compileSdkVersion = 35 + targetSdkVersion = 35 + ndkVersion = "27.1.12297006" + kotlinVersion = "1.9.25" glideVersion= "4.12.0" firebaseIidVersion = "21.1.0" } diff --git a/android/gradle.properties b/android/gradle.properties index c7b4d1b3..1d3f3366 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -39,3 +39,6 @@ newArchEnabled=false # Use this property to enable or disable the Hermes JS engine. # If set to false, you will be using JSC instead. hermesEnabled=true + +# Suppress warning about using compileSdk = 35 with older Android Gradle Plugin +android.suppressUnsupportedCompileSdk=35 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index c4355a8d..fb4ca323 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1375,7 +1375,7 @@ PODS: - React-Core - react-native-safe-area-context (4.10.5): - React-Core - - react-native-skia (1.5.3): + - react-native-skia (1.12.4): - DoubleConversion - glog - hermes-engine @@ -1684,7 +1684,7 @@ PODS: - React-logger (= 0.75.4) - React-perflogger (= 0.75.4) - React-utils (= 0.75.4) - - RealmJS (12.13.2): + - RealmJS (12.14.2): - React - RNArgon2 (2.0.1): - CatCrypto @@ -2299,7 +2299,7 @@ SPEC CHECKSUMS: react-native-get-random-values: 21325b2244dfa6b58878f51f9aa42821e7ba3d06 react-native-netinfo: f0a9899081c185db1de5bb2fdc1c88c202a059ac react-native-safe-area-context: a240ad4b683349e48b1d51fed1611138d1bdad97 - react-native-skia: 2ddddc0cda79a7fe0bbae14a9844f01c0fdff743 + react-native-skia: 56d126fa2d216f4056929db508102126663bce93 react-native-slider: 97ce0bd921f40de79cead9754546d5e4e7ba44f8 react-native-tcp-socket: e724380c910c2e704816ec817ed28f1342246ff7 react-native-webview-mm: c518409c962c1f0f95c08bb6a700b9f97aff131b @@ -2329,7 +2329,7 @@ SPEC CHECKSUMS: React-utils: cbe8b8b3d7b2ac282e018e46f0e7b25cdc87c5a0 ReactCodegen: 4bcb34e6b5ebf6eef5cee34f55aa39991ea1c1f1 ReactCommon: 6a952e50c2a4b694731d7682aaa6c79bc156e4ad - RealmJS: bfe9a997a1f813c05c432c94405753879572a1a2 + RealmJS: ab0e1afd06ef856f8ae396520da1690bcaa669f8 RNArgon2: 1481820722fd4af1575c09f7fc9ad67c00ee8a42 RNBootSplash: e025d4ee98d942ee6c8b495a6fe66339a6b5f6dd RNCAsyncStorage: d35c79ffba52c1013013e16b1fc295aec2feabb6 diff --git a/loc/en-US.json b/loc/en-US.json index 4d0f9b16..e6cd4940 100644 --- a/loc/en-US.json +++ b/loc/en-US.json @@ -714,6 +714,7 @@ "rationaleCreateWallet": "Your password is required to create a new wallet", "rationaleSeeRecoveryPhrase": "to view your Secret Recovery Phrase", "rationaleGetXPub": "Your password is required to see your extended public key", + "rationaleUpdateStorage": "Your password is required to update the storage", "authFailed": "Authentication Failed", "authFailedDescription": "You can try again, or you may completely wipe and reset the app", "retry": "Retry", @@ -890,6 +891,7 @@ "technicalIssues": "We are experiencing an issue, please try again later", "address": "Enter address...", "addressOrENS": "Enter address or ENS domain...", + "eip681Warning": "Warning: QR scan includes transfer instructions. Confirm the recipient address before proceeding.", "max": "Max", "minAmount": "Min transfer value: {minAmount} {token}", "balance": "Balance {0}", @@ -932,6 +934,10 @@ "advanced": "Advanced", "deleteAll": "Delete all data", "refreshAll": "Refresh metadata", + "updateStorage": "Update storage", + "updateStorageNotification": "Processing...", + "updateStorageNotificationSuccess": "Storage updated Successfully!", + "updateStorageNotificationError": "Error: Storage not updated!", "refreshAllDesc": "Clears cache for all NFTs and assets", "header": "Settings", "hideBalances": "Hide balances", diff --git a/package.json b/package.json index 478df73f..67cb807c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "superwallet", - "version": "1.18.1", + "version": "1.21.0", "private": true, "scripts": { "android": "react-native run-android", @@ -9,7 +9,7 @@ "dev": "react-native start --experimental-debugger", "android-reverse": "adb reverse tcp:8081 tcp:8081", "git2json": "./tools/git-info.sh > git-info.json", - "cleanstart": "cd android/; ./gradlew clean; cd ..; rm -r -f /tmp/metro-cache/; rm -r -f node_modules/; yarn cache clean; yarn; yarn start --reset-cache", + "cleanstart": "cd android/; ./gradlew clean; cd ..; rm -r -f /tmp/metro-cache/; rm -r -f node_modules/; rm -rf ios/.xcode.env.local; yarn cache clean; yarn; yarn start --reset-cache", "postinstall": "rn-nodeify --install events,process --hack; yarn git2json; yarn patch-package", "android:emu:build": "cd android && ./gradlew assembleRelease", "android:install": "adb install android/app/build/outputs/apk/release/app-release.apk", @@ -42,7 +42,7 @@ "@realm/react": "0.11.0", "@reown/walletkit": "1.0.0", "@shopify/flash-list": "1.7.1", - "@shopify/react-native-skia": "1.5.3", + "@shopify/react-native-skia": "1.12.4", "@solana/spl-token": "0.3.8", "@solana/web3.js": "1.91.7", "@tanstack/react-query": "5.51.9", @@ -112,7 +112,7 @@ "react-native-svg": "15.8.0", "react-native-tcp-socket": "6.0.6", "react-native-url-polyfill": "1.3.0", - "realm": "12.13.2", + "realm": "12.14.2", "rn-nodeify": "10.3.0", "serialize-error": "11.0.1", "stream-browserify": "3.0.0", diff --git a/patches/expo-modules-core+1.12.26.patch b/patches/expo-modules-core+1.12.26.patch new file mode 100644 index 00000000..c38b4811 --- /dev/null +++ b/patches/expo-modules-core+1.12.26.patch @@ -0,0 +1,451 @@ +diff --git a/node_modules/expo-modules-core/android/build/generated/source/buildConfig/debug/expo/modules/BuildConfig.java b/node_modules/expo-modules-core/android/build/generated/source/buildConfig/debug/expo/modules/BuildConfig.java +new file mode 100644 +index 0000000..3ded53c +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/generated/source/buildConfig/debug/expo/modules/BuildConfig.java +@@ -0,0 +1,12 @@ ++/** ++ * Automatically generated file. DO NOT MODIFY ++ */ ++package expo.modules; ++ ++public final class BuildConfig { ++ public static final boolean DEBUG = Boolean.parseBoolean("true"); ++ public static final String LIBRARY_PACKAGE_NAME = "expo.modules"; ++ public static final String BUILD_TYPE = "debug"; ++ // Field from default config. ++ public static final boolean IS_NEW_ARCHITECTURE_ENABLED = false; ++} +diff --git a/node_modules/expo-modules-core/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/node_modules/expo-modules-core/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +new file mode 100644 +index 0000000..2e9937d +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +@@ -0,0 +1,18 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/node_modules/expo-modules-core/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +new file mode 100644 +index 0000000..abb1565 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +@@ -0,0 +1,18 @@ ++{ ++ "version": 3, ++ "artifactType": { ++ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS", ++ "kind": "Directory" ++ }, ++ "applicationId": "expo.modules", ++ "variantName": "debug", ++ "elements": [ ++ { ++ "type": "SINGLE", ++ "filters": [], ++ "attributes": [], ++ "outputFile": "AndroidManifest.xml" ++ } ++ ], ++ "elementType": "File" ++} +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/node_modules/expo-modules-core/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +new file mode 100644 +index 0000000..1211b1e +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +@@ -0,0 +1,6 @@ ++aarFormatVersion=1.0 ++aarMetadataVersion=1.0 ++minCompileSdk=1 ++minCompileSdkExtension=0 ++minAndroidGradlePluginVersion=1.0.0 ++coreLibraryDesugaringEnabled=false +diff --git a/node_modules/expo-modules-core/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/node_modules/expo-modules-core/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +new file mode 100644 +index 0000000..9e26dfe +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +@@ -0,0 +1 @@ ++{} +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/node_modules/expo-modules-core/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +new file mode 100644 +index 0000000..913cc58 +Binary files /dev/null and b/node_modules/expo-modules-core/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ +diff --git a/node_modules/expo-modules-core/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/node_modules/expo-modules-core/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +new file mode 100644 +index 0000000..e69de29 +diff --git a/node_modules/expo-modules-core/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/expo-modules-core/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +new file mode 100644 +index 0000000..441a118 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +@@ -0,0 +1 @@ ++#Tue Sep 02 12:36:11 CEST 2025 +diff --git a/node_modules/expo-modules-core/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/expo-modules-core/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +new file mode 100644 +index 0000000..aaed38d +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +@@ -0,0 +1,2 @@ ++ ++ +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/node_modules/expo-modules-core/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +new file mode 100644 +index 0000000..034b368 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +@@ -0,0 +1,2 @@ ++ ++ +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/incremental/packageDebugAssets/merger.xml b/node_modules/expo-modules-core/android/build/intermediates/incremental/packageDebugAssets/merger.xml +new file mode 100644 +index 0000000..21e6ead +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/incremental/packageDebugAssets/merger.xml +@@ -0,0 +1,2 @@ ++ ++ +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/node_modules/expo-modules-core/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +new file mode 100644 +index 0000000..78ac5b8 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +@@ -0,0 +1,2 @@ ++R_DEF: Internal format may change without notice ++local +diff --git a/node_modules/expo-modules-core/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/node_modules/expo-modules-core/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +new file mode 100644 +index 0000000..846b8e6 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +@@ -0,0 +1,26 @@ ++1 ++2 ++5 ++6 ++7 ++8 ++8-->/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:4:5-12:19 ++9 /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:5:9-7:89 ++10 android:name="org.unimodules.core.AppLoader#react-native-headless" ++10-->/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:6:13-79 ++11 android:value="expo.modules.adapters.react.apploader.RNHeadlessAppLoader" /> ++11-->/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:7:13-86 ++12 /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:8:9-11:45 ++13 android:name="com.facebook.soloader.enabled" ++13-->/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:9:13-57 ++14 android:value="true" ++14-->/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:10:13-33 ++15 tools:replace="android:value" /> ++15-->/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:11:13-42 ++16 ++17 ++18 +diff --git a/node_modules/expo-modules-core/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/node_modules/expo-modules-core/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +new file mode 100644 +index 0000000..2e9937d +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +@@ -0,0 +1,18 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/node_modules/expo-modules-core/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +new file mode 100644 +index 0000000..0637a08 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +@@ -0,0 +1 @@ ++[] +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/node_modules/expo-modules-core/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +new file mode 100644 +index 0000000..08f4ebe +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +@@ -0,0 +1 @@ ++0 Warning/Error +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt b/node_modules/expo-modules-core/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +new file mode 100644 +index 0000000..eeeb776 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +@@ -0,0 +1 @@ ++expo.modules +diff --git a/node_modules/expo-modules-core/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt b/node_modules/expo-modules-core/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt +new file mode 100644 +index 0000000..a64c2b8 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/kotlin/compileDebugKotlin/cacheable/dirty-sources.txt +@@ -0,0 +1,170 @@ ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/apifeatures/Features.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/AnyTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityaware/OnActivityAvailableListener.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/Either.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/net/URLTypConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/DateTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/JSTypeConverterHelper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/com/facebook/react/uimanager/ReactStylesDiffMapHelper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/apploader/HeadlessAppLoaderNotifier.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/LoggerTimer.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/SetTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ExpoView.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ReactLifecycleDelegate.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewWrapperDelegateHolder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/DynamicExtenstions.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/defaultmodules/NativeModulesProxyModule.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/ReadableArgumentsTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/typedarray/TypedArrayIterator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/interfaces/permissions/PermissionsResponse.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/uuidv5/Exceptions.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinition.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JavaScriptWeakObject.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/tracing/ExpoTrace.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/events/EventListener.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/SuspendFunctionComponent.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/ListTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/allocators/ObjectConstructorFactory.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/PersistentFileLogHandler.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ReactExtensions.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/FunctionBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAware.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/ColorTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/folly/FollyDynamicExtensionConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/EitherTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/EnumTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/net/UriTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ConcatIterator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JavaCallback.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/LogHandlers.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/TypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/PromiseImpl.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/SimpleViewManagerWrapper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/Utils.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/ByteArrayTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/defaultmodules/CoreModule.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ExpoBridgeModule.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityresult/DataPersistor.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/viewevent/ViewEventDelegate.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultContract.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/exception/CommonExceptions.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ConcreteViewProp.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/events/OnActivityResultPayload.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionData.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/LogType.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityresult/ActivityResultsManager.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/Promise.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/CppType.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/utilities/EmulatorUtilities.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/JSTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/KotlinInteropModuleRegistry.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/AnyFunction.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/records/ValidationBinder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/BaseAsyncFunctionComponent.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ReadableTypeExtensions.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JavaScriptFunction.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/interfaces/filesystem/AppDirectoriesModuleInterface.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/devtools/OkHttpHeadersExtension.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ReadableArrayIterator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultLauncher.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/classcomponent/ClassDefinitionData.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/records/Record.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewGroupDefinition.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/typedarray/ConcreteTypedArrays.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/typedarray/TypedArray.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/records/Field.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/events/KModuleEventEmitterWrapper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/io/FileTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionWithPromiseComponent.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JNIFunctionBody.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedRef.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/records/Validators.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/SyncFunctionComponent.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/events/EventName.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/ModulePriorities.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/devtools/ExpoRequestCdpInterceptor.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/modules/DefinitionMarker.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/exception/ExceptionDecorator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/LogHandler.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/io/PathTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewManagerType.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewDefinitionBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObject.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/KPromiseWrapper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/allocators/ObjectConstructor.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/Logger.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/events/EventEmitter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/ExpectedType.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/AndroidExtensions.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/FilteredIterator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/devtools/cdp/CdpNetworkTypes.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/FabricComponentsRegistry.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/GroupViewManagerWrapper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultRegistry.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/CallbacksDefinition.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/AnyType.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/records/RecordTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/AnyViewProp.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/events/EventsDefinition.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ErrorView.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/allocators/UnsafeAllocator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/apploader/RNHeadlessAppLoader.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultCaller.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/errors/ContextDestroyedException.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ArrayExtenstions.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/providers/CurrentActivityProvider.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/devtools/ExpoNetworkInspectOkHttpInterceptors.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/utilities/KotlinUtilities.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/CoreLogger.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewManagerWrapperDelegate.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionComponent.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/records/FieldValidator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/PairTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/uuidv5/Uuidv5.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JavaScriptTypedArray.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/FilteredReadableMap.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultFallbackCallback.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/PersistentFileLogSerialDispatchQueue.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/Enumerable.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/AppContext.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/EnforceType.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/MapTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/PersistentFileLog.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JNIDeallocator.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/records/Required.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/ArrayTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/typedarray/GenericTypedArray.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/PropertyComponent.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/defaultmodules/ErrorManagerModule.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JSIContext.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/modules/Module.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/TypedArrayTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ModulesProvider.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionData.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/views/ViewGroupDefinitionBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/logging/OSLogHandler.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/UnitTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAwareHelper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/objects/PropertyComponentBuilder.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/providers/AppContextProvider.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/JavaScriptFunctionTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/functions/AsyncFunction.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObjectTypeConverter.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/ExpoModulesHelper.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/viewevent/ViewEvent.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/errors/ModuleDestroyedException.kt ++/Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/sharedobjects/ClassRegistry.kt +\ No newline at end of file +diff --git a/node_modules/expo-modules-core/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin b/node_modules/expo-modules-core/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +new file mode 100644 +index 0000000..6d58234 +Binary files /dev/null and b/node_modules/expo-modules-core/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin differ +diff --git a/node_modules/expo-modules-core/android/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/expo-modules-core/android/build/outputs/logs/manifest-merger-debug-report.txt +new file mode 100644 +index 0000000..52087d2 +--- /dev/null ++++ b/node_modules/expo-modules-core/android/build/outputs/logs/manifest-merger-debug-report.txt +@@ -0,0 +1,34 @@ ++-- Merging decision tree log --- ++manifest ++ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:1:1-14:12 ++INJECTED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:1:1-14:12 ++ package ++ INJECTED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml ++ xmlns:tools ++ ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:2:11-57 ++ xmlns:android ++ ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:1:11-69 ++application ++ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:4:5-12:19 ++meta-data#org.unimodules.core.AppLoader#react-native-headless ++ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:5:9-7:89 ++ android:value ++ ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:7:13-86 ++ android:name ++ ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:6:13-79 ++meta-data#com.facebook.soloader.enabled ++ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:8:9-11:45 ++ tools:replace ++ ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:11:13-42 ++ android:value ++ ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:10:13-33 ++ android:name ++ ADDED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml:9:13-57 ++uses-sdk ++INJECTED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml reason: use-sdk injection requested ++INJECTED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml ++INJECTED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml ++ android:targetSdkVersion ++ INJECTED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml ++ android:minSdkVersion ++ INJECTED from /Users/am/Projects/mobile/node_modules/expo-modules-core/android/src/main/AndroidManifest.xml +diff --git a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt +index ae0a811..180b46c 100644 +--- a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt ++++ b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt +@@ -163,7 +163,7 @@ open class PermissionsService(val context: Context) : InternalModule, Permission + override fun isPermissionPresentInManifest(permission: String): Boolean { + try { + context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS)?.run { +- return requestedPermissions.contains(permission) ++ return requestedPermissions?.contains(permission) ?: false + } + return false + } catch (e: PackageManager.NameNotFoundException) { diff --git a/patches/patch-package+6.5.1.patch b/patches/patch-package+6.5.1.patch new file mode 100644 index 00000000..69adb7ba --- /dev/null +++ b/patches/patch-package+6.5.1.patch @@ -0,0 +1,28 @@ +diff --git a/node_modules/patch-package/dist/makePatch.js b/node_modules/patch-package/dist/makePatch.js +index a76e39c..0104982 100644 +--- a/node_modules/patch-package/dist/makePatch.js ++++ b/node_modules/patch-package/dist/makePatch.js +@@ -64,12 +64,12 @@ function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths + fs_extra_2.copySync(rcPath, path_1.join(tmpRepo.name, rcFile), { dereference: true }); + } + }); +- if (packageManager === "yarn") { ++ if (packageManager === "npm") { + console.info(chalk_1.default.grey("•"), `Installing ${packageDetails.name}@${packageVersion} with yarn`); + try { + // try first without ignoring scripts in case they are required + // this works in 99.99% of cases +- spawnSafe_1.spawnSafeSync(`yarn`, ["install", "--ignore-engines"], { ++ spawnSafe_1.spawnSafeSync(`npm`, ["install", "--ignore-engines"], { + cwd: tmpRepoNpmRoot, + logStdErrOnError: false, + }); +@@ -77,7 +77,7 @@ function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths + catch (e) { + // try again while ignoring scripts in case the script depends on + // an implicit context which we havn't reproduced +- spawnSafe_1.spawnSafeSync(`yarn`, ["install", "--ignore-engines", "--ignore-scripts"], { ++ spawnSafe_1.spawnSafeSync(`npm`, ["install", "--ignore-engines", "--ignore-scripts"], { + cwd: tmpRepoNpmRoot, + }); + } diff --git a/patches/realm+12.14.2.patch b/patches/realm+12.14.2.patch new file mode 100644 index 00000000..9b393c60 --- /dev/null +++ b/patches/realm+12.14.2.patch @@ -0,0 +1,12 @@ +diff --git a/node_modules/realm/binding/android/CMakeLists.txt b/node_modules/realm/binding/android/CMakeLists.txt +index 87af51f..0c953be 100644 +--- a/node_modules/realm/binding/android/CMakeLists.txt ++++ b/node_modules/realm/binding/android/CMakeLists.txt +@@ -28,6 +28,7 @@ set_target_properties(realm-js-android-binding PROPERTIES + + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF) + set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -Oz") ++set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") + + target_link_options(realm-js-android-binding PUBLIC -fvisibility=hidden) + diff --git a/src/components/SeedDisplay/useSeedPhrase.ts b/src/components/SeedDisplay/useSeedPhrase.ts index c5c92d4f..a4028613 100644 --- a/src/components/SeedDisplay/useSeedPhrase.ts +++ b/src/components/SeedDisplay/useSeedPhrase.ts @@ -11,7 +11,8 @@ const useSeed = () => { const { getMnemonic } = useSecuredKeychain(); const fetchSeed = async () => { - const res = await getMnemonic(); + const response = await getMnemonic(); + const res = typeof response === 'boolean' ? false : response.secret; if (res) { setSeed(res); } diff --git a/src/onChain/wallets/solana.ts b/src/onChain/wallets/solana.ts index d4f887a7..05acc9ee 100644 --- a/src/onChain/wallets/solana.ts +++ b/src/onChain/wallets/solana.ts @@ -1,6 +1,6 @@ import * as splToken from '@solana/spl-token'; import * as web3 from '@solana/web3.js'; -import { ComputeBudgetProgram } from '@solana/web3.js'; +import { ComputeBudgetProgram, Connection, clusterApiUrl } from '@solana/web3.js'; import BigNumber from 'bignumber.js'; import bs58 from 'bs58'; import * as ed25519 from 'ed25519-hd-key'; @@ -57,6 +57,7 @@ type SolanaTransactionPlan = { address: web3.PublicKey; mint: web3.PublicKey; owner: web3.PublicKey; + programId: web3.PublicKey; }[]; instructions: web3.TransactionInstruction[]; @@ -99,8 +100,16 @@ export class SolanaHarmonyTransport extends HarmonyTransport { return { address: ata.address.toString(), - - instruction: serializeInstruction(splToken.createAssociatedTokenAccountInstruction(new web3.PublicKey(payer), ata.address, ata.owner, ata.mint)), + instruction: serializeInstruction( + splToken.createAssociatedTokenAccountIdempotentInstruction( + new web3.PublicKey(payer), + ata.address, + ata.owner, + ata.mint, + ata.programId, + splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + ), + ), }; }), instructions, @@ -215,8 +224,17 @@ export class SolanaNetwork implements Network { const { colors } = useTheme(); const chartColors: ChartColorSet = useMemo(() => { if (!hasData || isPending) { - return { highLow: 'transparent', gradient: [colors.purple_40] }; + return { highLow: 'transparent', gradient: [colors.purple_40, colors.purple_40] }; } return valueChange >= 0 ? ASCENDING_COLOR_SET : DESCENDING_COLOR_SET; diff --git a/src/screens/Send/SendScreen.tsx b/src/screens/Send/SendScreen.tsx index 79efe686..11a860e6 100644 --- a/src/screens/Send/SendScreen.tsx +++ b/src/screens/Send/SendScreen.tsx @@ -12,6 +12,7 @@ import { FloatingBottomContainer } from '@/components/FloatingBottomContainer'; import { GradientScreenView } from '@/components/Gradients'; import { KeyboardAvoider } from '@/components/Keyboard'; import { NftBlock } from '@/components/NftBlock'; +import { showToast } from '@/components/Toast'; import { useGetWalletStorage } from '@/hooks/useGetWalletStorage'; import { PrepareError } from '@/onChain/wallets/bitcoin'; import { getImplForWallet } from '@/onChain/wallets/registry'; @@ -264,11 +265,12 @@ const Send = ({ navigation, route: { params } }: SendNavigationProps<'Send'>) => if (qrCode) { try { const value = decodeQrCodeAddress(qrCode); - if (typeof value === 'string') { - onChangeAddress(value); - } else if (typeof value === 'object') { + if (value) { onChangeAddress(value.address); - if (value.options.amount) { + if (value.isEip681) { + showToast({ type: 'info', text: loc.send.eip681Warning }); + } + if (value.options?.amount) { amountInputRef.current?.setAssetAmount(`${value.options.amount}`); } } diff --git a/src/screens/Send/utils/decodeQrCodeAddress.ts b/src/screens/Send/utils/decodeQrCodeAddress.ts index 0446e03e..b0e5f973 100644 --- a/src/screens/Send/utils/decodeQrCodeAddress.ts +++ b/src/screens/Send/utils/decodeQrCodeAddress.ts @@ -1,15 +1,60 @@ import { decode } from 'bip21'; -type BIP21Data = ReturnType; const PREFIX_REGEX = /^[^:]*:/; const SUFFIX_REGEX = /[@?].*/; -export const decodeQrCodeAddress = (data?: string): string | BIP21Data | undefined => { - if (data) { - try { - return decode(data); - } catch (e) { - return data.replace(PREFIX_REGEX, '').replace(SUFFIX_REGEX, ''); +export interface DecodedQrCodeAddress { + address: string; + isEip681: boolean; + options?: { + amount?: number; + }; +} + +const EIP_681_REGEX = /^ethereum:0x[a-fA-F0-9]{40}(@\d+)?\/[a-zA-Z_][a-zA-Z0-9_]*\?/; + +const parseEip681Address = (data: string): string | undefined => { + try { + const url = new URL(data); + + return url.searchParams.get('address') || undefined; + } catch (e) { + const addressMatch = data.match(/[?&]address=([^&]*)/); + return addressMatch ? decodeURIComponent(addressMatch[1]) : undefined; + } +}; + +const isEip681Format = (data: string): boolean => { + return EIP_681_REGEX.test(data); +}; + +export const decodeQrCodeAddress = (data?: string): DecodedQrCodeAddress | undefined => { + if (!data) { + return undefined; + } + + if (isEip681Format(data)) { + const address = parseEip681Address(data); + if (address) { + return { + address, + isEip681: true, + }; } } + + try { + const bip21Data = decode(data); + return { + address: bip21Data.address, + isEip681: false, + options: bip21Data.options, + }; + } catch (e) { + const cleanedAddress = data.replace(PREFIX_REGEX, '').replace(SUFFIX_REGEX, ''); + return { + address: cleanedAddress, + isEip681: false, + }; + } }; diff --git a/src/screens/Settings/AdvancedSettingsScreen.tsx b/src/screens/Settings/AdvancedSettingsScreen.tsx index 50f22299..76293d8e 100644 --- a/src/screens/Settings/AdvancedSettingsScreen.tsx +++ b/src/screens/Settings/AdvancedSettingsScreen.tsx @@ -1,23 +1,55 @@ +import { useRef } from 'react'; import { StyleSheet, View } from 'react-native'; import { GradientScreenView } from '@/components/Gradients'; import { Label } from '@/components/Label'; +import { hideToast, showToast } from '@/components/Toast'; import { useHeaderTitle } from '@/hooks/useHeaderTitle'; import { useSettingsMutations } from '@/realm/settings'; import { useClearAppCache } from '@/realm/settings/useClearAppCache'; import { useIsTestnetEnabled } from '@/realm/settings/useIsTestnetEnabled'; import { Routes } from '@/Routes'; +import { useIsAppLockUsed } from '@/screens/Settings/appLock/hooks'; import { SettingsItem, SettingsSwitch } from '@/screens/Settings/components'; import { SettingsBox } from '@/screens/Settings/components/SettingsBox'; import type { SettingsNavigationProps } from '@/screens/Settings/SettingsRouter'; +import { getAppLockSecret, saveAppLockProtectedValue } from '@/secureStore'; +import { KeychainKey, setInKeychain } from '@/secureStore/keychain'; +import { useSecuredKeychain } from '@/secureStore/SecuredKeychainProvider'; +import { arrayBufferToHexString, encryptValue } from '@/secureStore/utils'; +import { loadMnemonicSlow } from '@/utils/loadMnemonicSlow'; import { navigationStyle } from '@/utils/navigationStyle'; +import { handleError } from '/helpers/errorHandler'; import loc from '/loc'; +const UPDATE_STORAGE_TOAST_ID = 'updatingStorage'; + +export const showProcessing = async () => + showToast({ + type: 'info', + text: loc.settings.updateStorageNotification, + id: UPDATE_STORAGE_TOAST_ID, + testID: UPDATE_STORAGE_TOAST_ID, + dismissMode: 'event', + iconLottieSource: require('@/assets/lottie/refreshSpinner.json'), + }); + +export const showSuccess = async () => + showToast({ + type: 'success', + text: loc.settings.updateStorageNotificationSuccess, + duration: 3000, + }); + export const AdvancedSettingsScreen = ({ navigation }: SettingsNavigationProps<'AdvancedSettings'>) => { const isTestNetEnabled = useIsTestnetEnabled(); const { setIsTestnetEnabled } = useSettingsMutations(); const { clearAppCache } = useClearAppCache(); + const { getMnemonic } = useSecuredKeychain(); + const { isAppLockUsed } = useIsAppLockUsed(); + + const isUpdatingStorage = useRef(false); useHeaderTitle(loc.settings.advanced); @@ -29,6 +61,38 @@ export const AdvancedSettingsScreen = ({ navigation }: SettingsNavigationProps<' navigation.navigate(Routes.DeleteAllDataWarningScreen); }; + const updateStorage = async () => { + if (isUpdatingStorage.current) { + return; + } + await showProcessing(); + isUpdatingStorage.current = true; + const response = await getMnemonic(undefined, 'updateStorage'); + if (typeof response === 'boolean') { + handleError('Can not read mnemonic', 'ERROR_CONTEXT_PLACEHOLDER', { text: loc.settings.updateStorageNotificationError }); + isUpdatingStorage.current = false; + return; + } + const { secret: mnemonic, password } = response; + + if (mnemonic) { + const seedBuffer = await loadMnemonicSlow(mnemonic); + let seedBufferString = arrayBufferToHexString(seedBuffer); + if (password) { + seedBufferString = await encryptValue(seedBufferString, password, 'hex'); + } + if (isAppLockUsed) { + const appLockSecret = await getAppLockSecret(); + await saveAppLockProtectedValue(KeychainKey.seedBufferKey, seedBufferString, appLockSecret, 'hex'); + } else { + await setInKeychain(KeychainKey.seedBufferKey, seedBufferString, false); + } + } + hideToast({ id: UPDATE_STORAGE_TOAST_ID }); + await showSuccess(); + isUpdatingStorage.current = false; + }; + return ( @@ -39,6 +103,7 @@ export const AdvancedSettingsScreen = ({ navigation }: SettingsNavigationProps<' + diff --git a/src/screens/Settings/passwordProtection/PasswordProtectionSheet.tsx b/src/screens/Settings/passwordProtection/PasswordProtectionSheet.tsx index 132a5a30..6511f137 100644 --- a/src/screens/Settings/passwordProtection/PasswordProtectionSheet.tsx +++ b/src/screens/Settings/passwordProtection/PasswordProtectionSheet.tsx @@ -19,7 +19,7 @@ type Props = { lockout: ReturnType; }; -export type Rationale = 'createWallet' | 'sign' | 'viewPhrase' | 'getXPub'; +export type Rationale = 'createWallet' | 'sign' | 'viewPhrase' | 'getXPub' | 'updateStorage'; export const PasswordProtectionSheet = forwardRef(({ checkPassword, onDismiss, lockout }, ref) => { const modalRef = useRef(null); @@ -36,6 +36,8 @@ export const PasswordProtectionSheet = forwardRef { useEffect(() => { const getSecret = async () => { - const mnemonic = await getMnemonic(); + const response = await getMnemonic(); + const mnemonic = typeof response === 'boolean' ? false : response.secret; + if (mnemonic) { setSecret(mnemonic); } diff --git a/src/screens/Transactions/components/TokenMarketData/HistoricalAssetPriceChart.tsx b/src/screens/Transactions/components/TokenMarketData/HistoricalAssetPriceChart.tsx index f8c2e13a..8d737599 100644 --- a/src/screens/Transactions/components/TokenMarketData/HistoricalAssetPriceChart.tsx +++ b/src/screens/Transactions/components/TokenMarketData/HistoricalAssetPriceChart.tsx @@ -96,7 +96,7 @@ export const HistoricalAssetPriceChart = ({ assetId, tokenId, size, price }: Pro const { colors } = useTheme(); - const chartColor = !dataInitialised ? [colors.purple_40] : priceChange !== undefined && priceChange >= 0 ? GREEN_GRADIENT : RED_GRADIENT; + const chartColor = !dataInitialised ? [colors.purple_40, colors.purple_40] : priceChange !== undefined && priceChange >= 0 ? GREEN_GRADIENT : RED_GRADIENT; const onChangePeriod = (value: PriceHistoryPeriod) => { setPeriod(value); diff --git a/src/screens/UniversalSend/UniversalSendScreen.tsx b/src/screens/UniversalSend/UniversalSendScreen.tsx index e970ba07..04bbbf08 100644 --- a/src/screens/UniversalSend/UniversalSendScreen.tsx +++ b/src/screens/UniversalSend/UniversalSendScreen.tsx @@ -1,6 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { BottomSheet } from '@/components/BottomSheet'; +import { showToast } from '@/components/Toast'; import { useBottomSheetScreenProps } from '@/hooks/useBottomSheetScreenProps'; import { useGetWalletStorage } from '@/hooks/useGetWalletStorage'; import type { Network } from '@/onChain/wallets/base'; @@ -20,6 +21,8 @@ import { navigationStyle } from '@/utils/navigationStyle'; import { SendAsset, SendTo } from './components'; +import loc from '/loc'; + type ScreenMode = 'sendTo' | 'sendAsset'; export type UniversalSendRouteParams = { @@ -70,10 +73,11 @@ const UniversalSend = ({ navigation, route: { params } }: NavigationProps<'Unive if (params?.qrCode) { try { const value = decodeQrCodeAddress(params.qrCode); - if (typeof value === 'string') { - setAddressFromQrcode(value); - } else if (typeof value === 'object') { + if (value) { setAddressFromQrcode(value.address); + if (value.isEip681) { + showToast({ type: 'info', text: loc.send.eip681Warning }); + } } } catch { setAddressFromQrcode(params.qrCode); diff --git a/src/screens/WalletCloudBackup/WalletCloudBackupScreen.tsx b/src/screens/WalletCloudBackup/WalletCloudBackupScreen.tsx index 784f0013..e5da18e7 100644 --- a/src/screens/WalletCloudBackup/WalletCloudBackupScreen.tsx +++ b/src/screens/WalletCloudBackup/WalletCloudBackupScreen.tsx @@ -62,7 +62,7 @@ export const WalletCloudBackupScreen = ({ navigation, route }: NavigationProps<' const writePasskeyData = async ({ credentialID, backupDate, backupName }: PendingBackup) => { try { - const mnemonic = await getMnemonic(true); + const { secret: mnemonic } = await getMnemonic(true); await CloudBackupManager.writeData(credentialID, mnemonic); } catch (e) { if (e instanceof Error) { diff --git a/src/secureStore/SecuredKeychainProvider.tsx b/src/secureStore/SecuredKeychainProvider.tsx index a6d9a2b7..546f81bd 100644 --- a/src/secureStore/SecuredKeychainProvider.tsx +++ b/src/secureStore/SecuredKeychainProvider.tsx @@ -2,18 +2,25 @@ import type { PropsWithChildren } from 'react'; import { createContext, useCallback, useContext, useMemo, useRef } from 'react'; -import { Keyboard } from 'react-native'; +import { Keyboard, Platform } from 'react-native'; import { useLockout } from '@/screens/Settings/passwordProtection/hooks/useLockout'; import { PasswordProtectionSheet } from '@/screens/Settings/passwordProtection/PasswordProtectionSheet'; import type { PasswordProtectionModalRef, Rationale } from '@/screens/Settings/passwordProtection/PasswordProtectionSheet'; +import { loadMnemonicSlow } from '@/utils/loadMnemonicSlow'; + import { getAppLockSecret, retrieveMnemonic, retrieveSeed } from './domains'; import { KeychainKey, getFromKeychain } from './keychain'; import { hexStringToBuffer } from './utils'; +interface SecretWithPassword { + secret: string; + password: string | undefined; +} + export interface SecuredKeychainContext { - getMnemonic: (throwOnError?: T) => Promise; + getMnemonic: (throwOnError?: T, rationale?: Rationale) => Promise; getSeed: (rationale: Rationale, throwOnError?: T) => Promise; } const SecuredKeychainContext = createContext({ @@ -23,7 +30,7 @@ const SecuredKeychainContext = createContext({ export const SecuredKeychainProvider = ({ children }: PropsWithChildren) => { const sheetRef = useRef(null); - const resolveResult = useRef<(value: string | PromiseLike) => void>(); + const resolveResult = useRef<(value: SecretWithPassword | PromiseLike) => void>(); const retrieve = useRef(); const appLockSecret = useRef(); @@ -35,7 +42,7 @@ export const SecuredKeychainProvider = ({ children }: PropsWithChildren) => { appLockSecret.current = undefined; }; - const getSecuredValue = useCallback(async (rationale: Rationale): Promise => { + const getSecuredValue = useCallback(async (rationale: Rationale): Promise => { const retrieveSecret = retrieve.current; console.log('[getSecuredValue] called, rationale: ', rationale); @@ -55,7 +62,7 @@ export const SecuredKeychainProvider = ({ children }: PropsWithChildren) => { if (!isPasswordProtected) { try { const secret = await retrieveSecret(appLockSecret.current || undefined); - return secret; + return { secret, password: undefined }; } finally { reset(); } @@ -74,7 +81,10 @@ export const SecuredKeychainProvider = ({ children }: PropsWithChildren) => { const value = await retrieve.current(appLockSecret.current || undefined, password); Keyboard.dismiss(); lockout.onSuccessfulAttempt(); - resolveResult.current?.(value); + resolveResult.current?.({ + secret: value, + password, + }); sheetRef.current?.dismiss(); reset(); } catch { @@ -92,16 +102,16 @@ export const SecuredKeychainProvider = ({ children }: PropsWithChildren) => { }; const getMnemonic = useCallback( - async (throwOnError?: T) => { + async (throwOnError?: T, rationale?: Rationale) => { try { console.log('[getMnemonic] called'); setRetrieveFunction(retrieveMnemonic); - return getSecuredValue('viewPhrase'); + return getSecuredValue(rationale ?? 'viewPhrase'); } catch (e) { if (throwOnError) { throw e; } else { - return false as T extends true ? string : false; + return false as T extends true ? SecretWithPassword : false; } } }, @@ -112,8 +122,15 @@ export const SecuredKeychainProvider = ({ children }: PropsWithChildren) => { async (rationale: Rationale, throwOnError?: T) => { try { console.log('[getSeed] called'); + if (Platform.OS === 'android' && Platform.Version === 36) { + setRetrieveFunction(retrieveMnemonic); + const { secret } = await getSecuredValue(rationale); + const seedBuffer = await loadMnemonicSlow(secret); + return seedBuffer; + } setRetrieveFunction(retrieveSeed); - return hexStringToBuffer(await getSecuredValue(rationale)); + const { secret } = await getSecuredValue(rationale); + return hexStringToBuffer(secret); } catch (e) { if (throwOnError) { throw e; diff --git a/yarn.lock b/yarn.lock index a262e993..f9699b87 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8036,15 +8036,15 @@ __metadata: languageName: node linkType: hard -"@shopify/react-native-skia@npm:1.5.3": - version: 1.5.3 - resolution: "@shopify/react-native-skia@npm:1.5.3" +"@shopify/react-native-skia@npm:1.12.4": + version: 1.12.4 + resolution: "@shopify/react-native-skia@npm:1.12.4" dependencies: - canvaskit-wasm: 0.39.1 + canvaskit-wasm: 0.40.0 react-reconciler: 0.27.0 peerDependencies: - react: ">=18.0" - react-native: ">=0.64" + react: ">=18.0 <19.0.0" + react-native: ">=0.64 <0.78.0" react-native-reanimated: ">=2.0.0" peerDependenciesMeta: react-native: @@ -8052,8 +8052,8 @@ __metadata: react-native-reanimated: optional: true bin: - setup-skia-web: ./scripts/setup-canvaskit.js - checksum: 054ef119a6a1ba0340a8d72d29e54a4e041e902a3c7ee708f886a8f73df77e05952cb80419bb393acdeffbb7b1cd83a3f34d3a5ab67bbadf162931d3836869d2 + setup-skia-web: scripts/setup-canvaskit.js + checksum: 479c8b2b5f83c497cc54a103f7365b505306e7a35f6eada93250a3ef2ae62533db13d1f96acacde3094980d34bf97cca3d34166a2308bba7e0565e8d40b43cf3 languageName: node linkType: hard @@ -12785,12 +12785,12 @@ __metadata: languageName: node linkType: hard -"canvaskit-wasm@npm:0.39.1": - version: 0.39.1 - resolution: "canvaskit-wasm@npm:0.39.1" +"canvaskit-wasm@npm:0.40.0": + version: 0.40.0 + resolution: "canvaskit-wasm@npm:0.40.0" dependencies: - "@webgpu/types": "npm:0.1.21" - checksum: 0ae60ae5c430aaa88152f3a20f40fc9a6debb15714a2ce1bdebef93005ec6d5e72e0316b91ab637f50aab220dd8694101abac497209bcf16788d00db78f5a898 + "@webgpu/types": 0.1.21 + checksum: dde817c0ef979a67afad4ac3adf31c03133af2592efec17f715a98508fdf801104fbf05af29723fb39b4d8b2798ce5306bb3cb5c062209d9d90a750430f3361d languageName: node linkType: hard @@ -24675,9 +24675,9 @@ __metadata: languageName: node linkType: hard -"realm@npm:12.13.2": - version: 12.13.2 - resolution: "realm@npm:12.13.2" +"realm@npm:12.14.2": + version: 12.14.2 + resolution: "realm@npm:12.14.2" dependencies: "@realm/fetch": ^0.1.1 bson: ^4.7.2 @@ -24691,7 +24691,7 @@ __metadata: peerDependenciesMeta: react-native: optional: true - checksum: c9a7b8c1d2b19c6ab93089a2da188f30b0a64dffec9ee992964cbe482661e06de28cae0ea7a0cf1a9d140ef87e7ae1a4024d3ea40626bfc928a7e1675c9d2f5f + checksum: 80f582862811d75452b2e2e624ed29e7aa5388e60f48eff4eeacd50a1bd6fd3ac1cc7d6979212ba73a08ff1f765f900f0c7b594c2c296a9f4eaf9b62276b5b48 languageName: node linkType: hard @@ -26703,7 +26703,7 @@ __metadata: "@realm/react": 0.11.0 "@reown/walletkit": 1.0.0 "@shopify/flash-list": 1.7.1 - "@shopify/react-native-skia": 1.5.3 + "@shopify/react-native-skia": 1.12.4 "@solana/spl-token": 0.3.8 "@solana/web3.js": 1.91.7 "@storybook/addon-ondevice-actions": 7.6.20 @@ -26802,7 +26802,7 @@ __metadata: react-native-tcp-socket: 6.0.6 react-native-url-polyfill: 1.3.0 react-test-renderer: 18.3.1 - realm: 12.13.2 + realm: 12.14.2 rn-nodeify: 10.3.0 serialize-error: 11.0.1 storybook: 7.6.20