diff --git a/CHANGELOG.md b/CHANGELOG.md
index ffe32e7e491..df67ae1d3b3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,27 @@
## Unreleased
+## 4.15.0
+
+- added: Add Maya Protocol
+- added: Battery Saver warning message for Android
+- added: Buy conversion tracking for Moonpay
+- added: Buy conversion tracking for Paybis
+- added: Support for return.edge.app deeplinks
+- added: Error tracking for failure to report conversions to referral server
+- changed: Remove whitespaces from custom token contract address input
+- changed: Use unique ENV configs for thorchain and thorchainda swap plugins
+- fixed: Correctly tag `tokenApproval` `actionType` in `getTxActionDisplayInfo`
+- fixed: Fixed obscured "done" button display bug on Sepa info display scene for small-screen devices
+- fixed: URI encoding in Paybis return URIs
+- fixed: AddressTile2 touchable area states
+- fixed: Cases where it was possible to create duplicate custom tokens
+- fixed: Clear previous swap errors when new amounts are entered or swap assets are changed in `SwapCreateScene`
+- fixed: Handle race condition when navigating to a token's transaction list which requires token activation (XRP, Algorand, etc)
+- fixed: Message about overriding a built-in token contract, which is not possible to do
+- fixed: Round Kado-provided amounts during sell
+- fixed: "Contacts Access" setting could be out of sync with the OS-level contacts access setting
+
## 4.14.2
- fixed: Downgrade edge-exchange-plugins to v2.8.1 to remove Thorchain bugs introduced by Maya protocol additions
@@ -12,7 +33,7 @@
- changed: More informative buy amount limit errors for light accounts
- fixed: Default buy amounts for light accounts can potentially be over limit for non-USD currencies
-## 4.14.0
+## 4.14.0 (2024-09-30)
- added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene`
- added: Add 'Cris Cyborg,' 'Free Talk Live,' and 'Crypto Canal' options to survey modal
@@ -28,12 +49,12 @@
- changed: Updated ACH supported US states
- changed: Use new platform-specific `assetStatsCards2` info server data
- fixed: Missing ellipses for long usernames displayed in the `SideMenu`
-- fixed: "Apple Pay" renamed to "Pay with Apple Pay" to align with branding guidelines
-- fixed: "Most Recent Wallets" do not show those chosen through `fiatPlugin`
-- fixed: Crash on HomeScene when logging while in airplane mode
- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene`
+- fixed: Allow `InfoCardCarousel` to receive undefined `countryCodes`
+- fixed: Crash on HomeScene when logging while in airplane mode
- fixed: Inconsistent corners in `SideMenu`
-- fixed: Round Kado-provided amounts during sell
+- fixed: "Most Recent Wallets" do not show those chosen through `fiatPlugin`
+- fixed: "Apple Pay" renamed to "Pay with Apple Pay" to align with branding guidelines
## 4.13.0 (2024-09-18)
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 9fb3d1d3f6b..93656b4e7c6 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -58,6 +58,7 @@
+
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 464336be895..442c2336205 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -17,13 +17,13 @@ PODS:
- DoubleConversion (1.1.6)
- edge-core-js (2.18.0):
- React-Core
- - edge-currency-accountbased (4.24.6):
+ - edge-currency-accountbased (4.26.0):
- React-Core
- - edge-currency-plugins (3.3.2):
+ - edge-currency-plugins (3.4.0):
- React-Core
- - edge-exchange-plugins (2.8.1):
+ - edge-exchange-plugins (2.12.0):
- React-Core
- - edge-login-ui-rn (3.22.3):
+ - edge-login-ui-rn (3.22.4):
- React-Core
- EXApplication (5.1.1):
- ExpoModulesCore
@@ -430,7 +430,7 @@ PODS:
- react-native-webview (13.8.4):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- - react-native-zcash (0.8.1):
+ - react-native-zcash (0.9.1):
- gRPC-Swift (~> 1.8)
- MnemonicSwift (~> 2.2)
- React-Core
@@ -572,11 +572,12 @@ PODS:
- React-RCTImage
- RNSecureRandom (1.0.1):
- React
- - RNSentry (5.22.3):
+ - RNSentry (5.33.1):
- hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
- React-Core
- React-hermes
- - Sentry/HybridSDK (= 8.26.0)
+ - Sentry/HybridSDK (= 8.36.0)
- RNShare (10.2.0):
- React-Core
- RNSound (0.11.0):
@@ -597,7 +598,7 @@ PODS:
- SDWebImageWebPCoder (0.8.5):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.10)
- - Sentry/HybridSDK (8.26.0)
+ - Sentry/HybridSDK (8.36.0)
- SQLite.swift/standalone (0.15.3):
- sqlite3
- "sqlite3 (3.46.0+1)":
@@ -1078,12 +1079,12 @@ SPEC CHECKSUMS:
CNIOLinux: 62e3505f50de558c393dc2f273dde71dcce518da
CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b
disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd
- DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953
+ DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63
- edge-currency-accountbased: 86f333e5789a79adb7b47519104d72db21e1eb72
- edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3
- edge-exchange-plugins: 407e31812667be6679b1d1338ae15783556ae2b8
- edge-login-ui-rn: 42c2652b2bd8b9a98b7208368ecc2827eea23955
+ edge-currency-accountbased: 092d54b79970e894724baa85fbc1788a392b3710
+ edge-currency-plugins: 266bf440ce5c26a6838f8217b0d183d6c0a12bae
+ edge-exchange-plugins: 5037e196e652d1dca42afacd86b2395bd0d7f298
+ edge-login-ui-rn: 59a7ab5b9d5bbebd045fa77b09a1e26647845c85
EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903
EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9
EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d
@@ -1100,7 +1101,7 @@ SPEC CHECKSUMS:
FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869
FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
- glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2
+ glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
gRPC-Swift: 74adcaaa62ac5e0a018938840328cb1fdfb09e7b
@@ -1140,7 +1141,7 @@ SPEC CHECKSUMS:
react-native-safari-view: 955d7160d159241b8e9395d12d10ea0ef863dcdd
react-native-safe-area-context: dcab599c527c2d7de2d76507a523d20a0b83823d
react-native-webview: fa228e55c53372c2b361d2fa5e415844fa83eabf
- react-native-zcash: 2959ff77ba393d08bcd65aa582fef8445c99453c
+ react-native-zcash: c6f228ef34d408d14f38fbd2cf008b9d09b80a78
React-perflogger: 0cc42978a483a47f3696171dac2e7033936fc82d
React-RCTActionSheet: ea922b476d24f6d40b8e02ac3228412bd3637468
React-RCTAnimation: 7be2c148398eaa5beac950b2b5ec7102389ec3ad
@@ -1174,7 +1175,7 @@ SPEC CHECKSUMS:
RNReanimated: 271f958e94385e59e0660b872ce866407e36bb45
RNScreens: 93ae3be2f119d955620f9bbb39ad372adb53b7a9
RNSecureRandom: 07efbdf2cd99efe13497433668e54acd7df49fef
- RNSentry: 7e184247ee04989474d12cce0b7ef7bc4a71632f
+ RNSentry: 0744d3c79504bc4778190d047d1b60daf4a378cd
RNShare: 554a91f5cfbe4adac4cfe3654826ee8b299fe365
RNSound: da030221e6ac7e8290c6b43f2b5f2133a8e225b0
RNStoreReview: 923b1c888c13469925bf0256dc2c046eab557ce5
@@ -1182,7 +1183,7 @@ SPEC CHECKSUMS:
RNVectorIcons: bfb663f3f7b37340cd90120151b720641523dc84
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
- Sentry: 74a073c71c998117edb08f56f443c83570a31bed
+ Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57
SQLite.swift: 8d054987f02728cc912b0eb5a9659650573a65a2
sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630
SwiftNIO: 829958aab300642625091f82fc2f49cb7cf4ef24
diff --git a/ios/edge/edge.entitlements b/ios/edge/edge.entitlements
index f8c6053cb6d..3ee27306f01 100644
--- a/ios/edge/edge.entitlements
+++ b/ios/edge/edge.entitlements
@@ -7,6 +7,7 @@
com.apple.developer.associated-domains
applinks:dl.edge.app
+ applinks:return.edge.app
applinks:deep.edge.app
diff --git a/package.json b/package.json
index fe56e44927f..9dc8f5e1452 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "edge-react-gui",
- "version": "4.14.2",
+ "version": "4.15.0",
"private": true,
"description": "Edge Wallet React GUI",
"homepage": "https://edge.app",
@@ -79,7 +79,7 @@
"@react-navigation/elements": "^1.3.14",
"@react-navigation/native": "^6.1.3",
"@react-navigation/stack": "^6.3.12",
- "@sentry/react-native": "^5.22.3",
+ "@sentry/react-native": "^5.33.1",
"@types/jsrsasign": "^10.5.13",
"@walletconnect/react-native-compat": "^2.11.0",
"@walletconnect/web3wallet": "^1.10.1",
@@ -98,12 +98,12 @@
"detect-bundler": "^1.1.0",
"disklet": "^0.5.2",
"edge-core-js": "^2.18.0",
- "edge-currency-accountbased": "^4.24.6",
+ "edge-currency-accountbased": "^4.26.0",
"edge-currency-monero": "^1.3.1",
- "edge-currency-plugins": "^3.3.2",
- "edge-exchange-plugins": "^2.8.1",
- "edge-info-server": "^2.7.0",
- "edge-login-ui-rn": "^3.22.3",
+ "edge-currency-plugins": "^3.4.0",
+ "edge-exchange-plugins": "^2.12.0",
+ "edge-info-server": "^3.0.1",
+ "edge-login-ui-rn": "^3.22.4",
"ethers": "^5.7.2",
"expo": "^48.0.0",
"jsrsasign": "^11.1.0",
@@ -141,7 +141,8 @@
"react-native-mymonero-core": "^0.3.1",
"react-native-patina": "^0.1.6",
"react-native-permissions": "^4.1.5",
- "react-native-piratechain": "^0.5.1",
+ "react-native-piratechain": "^0.5.3",
+ "react-native-power-saving-mode": "^0.1.1",
"react-native-reanimated": "^3.14.0",
"react-native-safari-view": "^2.1.0",
"react-native-safe-area-context": "^4.10.1",
@@ -154,7 +155,7 @@
"react-native-svg": "^15.3.0",
"react-native-vector-icons": "^10.1.0",
"react-native-webview": "^13.8.4",
- "react-native-zcash": "^0.8.1",
+ "react-native-zcash": "^0.9.1",
"react-redux": "^8.1.1",
"redux": "^4.2.1",
"redux-thunk": "^2.3.0",
diff --git a/patches/react-native-power-saving-mode+0.1.1.patch b/patches/react-native-power-saving-mode+0.1.1.patch
new file mode 100644
index 00000000000..d9eee9361d9
--- /dev/null
+++ b/patches/react-native-power-saving-mode+0.1.1.patch
@@ -0,0 +1,3735 @@
+diff --git a/node_modules/react-native-power-saving-mode/android/build.gradle b/node_modules/react-native-power-saving-mode/android/build.gradle
+index cbb99af..dfdfbdf 100644
+--- a/node_modules/react-native-power-saving-mode/android/build.gradle
++++ b/node_modules/react-native-power-saving-mode/android/build.gradle
+@@ -1,23 +1,22 @@
+-
+ buildscript {
+ repositories {
++ google()
+ jcenter()
+ }
+-
+ dependencies {
+- classpath "com.android.tools.build:gradle:1.3.1"
++ classpath 'com.android.tools.build:gradle:4.2.2'
+ }
+ }
+
+-apply plugin: "com.android.library"
++apply plugin: 'com.android.library'
+
+ android {
+- compileSdkVersion 23
+- buildToolsVersion "23.0.1"
++ compileSdkVersion 31
++ buildToolsVersion '31.0.0'
+
+ defaultConfig {
+ minSdkVersion 16
+- targetSdkVersion 22
++ targetSdkVersion 31
+ versionCode 1
+ versionName "0.1.0"
+ }
+@@ -27,10 +26,11 @@ android {
+ }
+
+ repositories {
++ google()
++ jcenter()
+ mavenCentral()
+ }
+
+ dependencies {
+- compile "com.facebook.react:react-native:+"
++ implementation 'com.facebook.react:react-native:+'
+ }
+-
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/.transforms/03616ef66df03dc7059430a9527f0f15/results.bin b/node_modules/react-native-power-saving-mode/android/build/.transforms/03616ef66df03dc7059430a9527f0f15/results.bin
+new file mode 100644
+index 0000000..28bb879
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/.transforms/03616ef66df03dc7059430a9527f0f15/results.bin
+@@ -0,0 +1 @@
++o/classes.jar
+diff --git a/node_modules/react-native-power-saving-mode/android/build/.transforms/03616ef66df03dc7059430a9527f0f15/transformed/classes.jar b/node_modules/react-native-power-saving-mode/android/build/.transforms/03616ef66df03dc7059430a9527f0f15/transformed/classes.jar
+new file mode 100644
+index 0000000..85404ed
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/.transforms/03616ef66df03dc7059430a9527f0f15/transformed/classes.jar differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/.transforms/e755c38410478335c247a66a1a297e34/results.bin b/node_modules/react-native-power-saving-mode/android/build/.transforms/e755c38410478335c247a66a1a297e34/results.bin
+new file mode 100644
+index 0000000..0d259dd
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/.transforms/e755c38410478335c247a66a1a297e34/results.bin
+@@ -0,0 +1 @@
++o/classes
+diff --git a/node_modules/react-native-power-saving-mode/android/build/.transforms/e755c38410478335c247a66a1a297e34/transformed/classes/classes.dex b/node_modules/react-native-power-saving-mode/android/build/.transforms/e755c38410478335c247a66a1a297e34/transformed/classes/classes.dex
+new file mode 100644
+index 0000000..c56b9cf
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/.transforms/e755c38410478335c247a66a1a297e34/transformed/classes/classes.dex differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/generated/source/buildConfig/debug/io/powerSavingMode/BuildConfig.java b/node_modules/react-native-power-saving-mode/android/build/generated/source/buildConfig/debug/io/powerSavingMode/BuildConfig.java
+new file mode 100644
+index 0000000..2106a7b
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/generated/source/buildConfig/debug/io/powerSavingMode/BuildConfig.java
+@@ -0,0 +1,10 @@
++/**
++ * Automatically generated file. DO NOT MODIFY
++ */
++package io.powerSavingMode;
++
++public final class BuildConfig {
++ public static final boolean DEBUG = Boolean.parseBoolean("true");
++ public static final String LIBRARY_PACKAGE_NAME = "io.powerSavingMode";
++ public static final String BUILD_TYPE = "debug";
++}
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml b/node_modules/react-native-power-saving-mode/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml
+new file mode 100644
+index 0000000..e127624
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml
+@@ -0,0 +1,7 @@
++
++
++
++
++
++
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json b/node_modules/react-native-power-saving-mode/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json
+new file mode 100644
+index 0000000..ea26998
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json
+@@ -0,0 +1,18 @@
++{
++ "version": 3,
++ "artifactType": {
++ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
++ "kind": "Directory"
++ },
++ "applicationId": "io.powerSavingMode",
++ "variantName": "debug",
++ "elements": [
++ {
++ "type": "SINGLE",
++ "filters": [],
++ "attributes": [],
++ "outputFile": "AndroidManifest.xml"
++ }
++ ],
++ "elementType": "File"
++}
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/aar_metadata/debug/aar-metadata.properties b/node_modules/react-native-power-saving-mode/android/build/intermediates/aar_metadata/debug/aar-metadata.properties
+new file mode 100644
+index 0000000..776557e
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/aar_metadata/debug/aar-metadata.properties
+@@ -0,0 +1,5 @@
++aarFormatVersion=1.0
++aarMetadataVersion=1.0
++minCompileSdk=1
++minCompileSdkExtension=0
++minAndroidGradlePluginVersion=1.0.0
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json b/node_modules/react-native-power-saving-mode/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json
+new file mode 100644
+index 0000000..9e26dfe
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json
+@@ -0,0 +1 @@
++{}
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_library_classes_jar/debug/classes.jar b/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_library_classes_jar/debug/classes.jar
+new file mode 100644
+index 0000000..c0ef78e
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_library_classes_jar/debug/classes.jar differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_r_class_jar/debug/R.jar b/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_r_class_jar/debug/R.jar
+new file mode 100644
+index 0000000..9f2fd82
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_r_class_jar/debug/R.jar differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_symbol_list/debug/R.txt b/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_symbol_list/debug/R.txt
+new file mode 100644
+index 0000000..7c9d30e
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/compile_symbol_list/debug/R.txt
+@@ -0,0 +1,1953 @@
++int anim abc_fade_in 0x0
++int anim abc_fade_out 0x0
++int anim abc_grow_fade_in_from_bottom 0x0
++int anim abc_popup_enter 0x0
++int anim abc_popup_exit 0x0
++int anim abc_shrink_fade_out_from_bottom 0x0
++int anim abc_slide_in_bottom 0x0
++int anim abc_slide_in_top 0x0
++int anim abc_slide_out_bottom 0x0
++int anim abc_slide_out_top 0x0
++int anim abc_tooltip_enter 0x0
++int anim abc_tooltip_exit 0x0
++int anim btn_checkbox_to_checked_box_inner_merged_animation 0x0
++int anim btn_checkbox_to_checked_box_outer_merged_animation 0x0
++int anim btn_checkbox_to_checked_icon_null_animation 0x0
++int anim btn_checkbox_to_unchecked_box_inner_merged_animation 0x0
++int anim btn_checkbox_to_unchecked_check_path_merged_animation 0x0
++int anim btn_checkbox_to_unchecked_icon_null_animation 0x0
++int anim btn_radio_to_off_mtrl_dot_group_animation 0x0
++int anim btn_radio_to_off_mtrl_ring_outer_animation 0x0
++int anim btn_radio_to_off_mtrl_ring_outer_path_animation 0x0
++int anim btn_radio_to_on_mtrl_dot_group_animation 0x0
++int anim btn_radio_to_on_mtrl_ring_outer_animation 0x0
++int anim btn_radio_to_on_mtrl_ring_outer_path_animation 0x0
++int anim catalyst_fade_in 0x0
++int anim catalyst_fade_out 0x0
++int anim catalyst_push_up_in 0x0
++int anim catalyst_push_up_out 0x0
++int anim catalyst_slide_down 0x0
++int anim catalyst_slide_up 0x0
++int anim fragment_fast_out_extra_slow_in 0x0
++int animator fragment_close_enter 0x0
++int animator fragment_close_exit 0x0
++int animator fragment_fade_enter 0x0
++int animator fragment_fade_exit 0x0
++int animator fragment_open_enter 0x0
++int animator fragment_open_exit 0x0
++int attr actionBarDivider 0x0
++int attr actionBarItemBackground 0x0
++int attr actionBarPopupTheme 0x0
++int attr actionBarSize 0x0
++int attr actionBarSplitStyle 0x0
++int attr actionBarStyle 0x0
++int attr actionBarTabBarStyle 0x0
++int attr actionBarTabStyle 0x0
++int attr actionBarTabTextStyle 0x0
++int attr actionBarTheme 0x0
++int attr actionBarWidgetTheme 0x0
++int attr actionButtonStyle 0x0
++int attr actionDropDownStyle 0x0
++int attr actionLayout 0x0
++int attr actionMenuTextAppearance 0x0
++int attr actionMenuTextColor 0x0
++int attr actionModeBackground 0x0
++int attr actionModeCloseButtonStyle 0x0
++int attr actionModeCloseContentDescription 0x0
++int attr actionModeCloseDrawable 0x0
++int attr actionModeCopyDrawable 0x0
++int attr actionModeCutDrawable 0x0
++int attr actionModeFindDrawable 0x0
++int attr actionModePasteDrawable 0x0
++int attr actionModePopupWindowStyle 0x0
++int attr actionModeSelectAllDrawable 0x0
++int attr actionModeShareDrawable 0x0
++int attr actionModeSplitBackground 0x0
++int attr actionModeStyle 0x0
++int attr actionModeTheme 0x0
++int attr actionModeWebSearchDrawable 0x0
++int attr actionOverflowButtonStyle 0x0
++int attr actionOverflowMenuStyle 0x0
++int attr actionProviderClass 0x0
++int attr actionViewClass 0x0
++int attr activityChooserViewStyle 0x0
++int attr actualImageResource 0x0
++int attr actualImageScaleType 0x0
++int attr actualImageUri 0x0
++int attr alertDialogButtonGroupStyle 0x0
++int attr alertDialogCenterButtons 0x0
++int attr alertDialogStyle 0x0
++int attr alertDialogTheme 0x0
++int attr allowStacking 0x0
++int attr alpha 0x0
++int attr alphabeticModifiers 0x0
++int attr arrowHeadLength 0x0
++int attr arrowShaftLength 0x0
++int attr autoCompleteTextViewStyle 0x0
++int attr autoSizeMaxTextSize 0x0
++int attr autoSizeMinTextSize 0x0
++int attr autoSizePresetSizes 0x0
++int attr autoSizeStepGranularity 0x0
++int attr autoSizeTextType 0x0
++int attr autofillInlineSuggestionChip 0x0
++int attr autofillInlineSuggestionEndIconStyle 0x0
++int attr autofillInlineSuggestionStartIconStyle 0x0
++int attr autofillInlineSuggestionSubtitle 0x0
++int attr autofillInlineSuggestionTitle 0x0
++int attr background 0x0
++int attr backgroundImage 0x0
++int attr backgroundSplit 0x0
++int attr backgroundStacked 0x0
++int attr backgroundTint 0x0
++int attr backgroundTintMode 0x0
++int attr barLength 0x0
++int attr borderlessButtonStyle 0x0
++int attr buttonBarButtonStyle 0x0
++int attr buttonBarNegativeButtonStyle 0x0
++int attr buttonBarNeutralButtonStyle 0x0
++int attr buttonBarPositiveButtonStyle 0x0
++int attr buttonBarStyle 0x0
++int attr buttonCompat 0x0
++int attr buttonGravity 0x0
++int attr buttonIconDimen 0x0
++int attr buttonPanelSideLayout 0x0
++int attr buttonStyle 0x0
++int attr buttonStyleSmall 0x0
++int attr buttonTint 0x0
++int attr buttonTintMode 0x0
++int attr checkMarkCompat 0x0
++int attr checkMarkTint 0x0
++int attr checkMarkTintMode 0x0
++int attr checkboxStyle 0x0
++int attr checkedTextViewStyle 0x0
++int attr closeIcon 0x0
++int attr closeItemLayout 0x0
++int attr collapseContentDescription 0x0
++int attr collapseIcon 0x0
++int attr color 0x0
++int attr colorAccent 0x0
++int attr colorBackgroundFloating 0x0
++int attr colorButtonNormal 0x0
++int attr colorControlActivated 0x0
++int attr colorControlHighlight 0x0
++int attr colorControlNormal 0x0
++int attr colorError 0x0
++int attr colorPrimary 0x0
++int attr colorPrimaryDark 0x0
++int attr colorSwitchThumbNormal 0x0
++int attr commitIcon 0x0
++int attr contentDescription 0x0
++int attr contentInsetEnd 0x0
++int attr contentInsetEndWithActions 0x0
++int attr contentInsetLeft 0x0
++int attr contentInsetRight 0x0
++int attr contentInsetStart 0x0
++int attr contentInsetStartWithNavigation 0x0
++int attr controlBackground 0x0
++int attr customNavigationLayout 0x0
++int attr defaultQueryHint 0x0
++int attr dialogCornerRadius 0x0
++int attr dialogPreferredPadding 0x0
++int attr dialogTheme 0x0
++int attr displayOptions 0x0
++int attr divider 0x0
++int attr dividerHorizontal 0x0
++int attr dividerPadding 0x0
++int attr dividerVertical 0x0
++int attr drawableBottomCompat 0x0
++int attr drawableEndCompat 0x0
++int attr drawableLeftCompat 0x0
++int attr drawableRightCompat 0x0
++int attr drawableSize 0x0
++int attr drawableStartCompat 0x0
++int attr drawableTint 0x0
++int attr drawableTintMode 0x0
++int attr drawableTopCompat 0x0
++int attr drawerArrowStyle 0x0
++int attr dropDownListViewStyle 0x0
++int attr dropdownListPreferredItemHeight 0x0
++int attr editTextBackground 0x0
++int attr editTextColor 0x0
++int attr editTextStyle 0x0
++int attr elevation 0x0
++int attr emojiCompatEnabled 0x0
++int attr expandActivityOverflowButtonDrawable 0x0
++int attr fadeDuration 0x0
++int attr failureImage 0x0
++int attr failureImageScaleType 0x0
++int attr firstBaselineToTopHeight 0x0
++int attr font 0x0
++int attr fontFamily 0x0
++int attr fontProviderAuthority 0x0
++int attr fontProviderCerts 0x0
++int attr fontProviderFetchStrategy 0x0
++int attr fontProviderFetchTimeout 0x0
++int attr fontProviderPackage 0x0
++int attr fontProviderQuery 0x0
++int attr fontProviderSystemFontFamily 0x0
++int attr fontStyle 0x0
++int attr fontVariationSettings 0x0
++int attr fontWeight 0x0
++int attr gapBetweenBars 0x0
++int attr goIcon 0x0
++int attr height 0x0
++int attr hideOnContentScroll 0x0
++int attr homeAsUpIndicator 0x0
++int attr homeLayout 0x0
++int attr icon 0x0
++int attr iconTint 0x0
++int attr iconTintMode 0x0
++int attr iconifiedByDefault 0x0
++int attr imageButtonStyle 0x0
++int attr indeterminateProgressStyle 0x0
++int attr initialActivityCount 0x0
++int attr isAutofillInlineSuggestionTheme 0x0
++int attr isLightTheme 0x0
++int attr itemPadding 0x0
++int attr lStar 0x0
++int attr lastBaselineToBottomHeight 0x0
++int attr layout 0x0
++int attr lineHeight 0x0
++int attr listChoiceBackgroundIndicator 0x0
++int attr listChoiceIndicatorMultipleAnimated 0x0
++int attr listChoiceIndicatorSingleAnimated 0x0
++int attr listDividerAlertDialog 0x0
++int attr listItemLayout 0x0
++int attr listLayout 0x0
++int attr listMenuViewStyle 0x0
++int attr listPopupWindowStyle 0x0
++int attr listPreferredItemHeight 0x0
++int attr listPreferredItemHeightLarge 0x0
++int attr listPreferredItemHeightSmall 0x0
++int attr listPreferredItemPaddingEnd 0x0
++int attr listPreferredItemPaddingLeft 0x0
++int attr listPreferredItemPaddingRight 0x0
++int attr listPreferredItemPaddingStart 0x0
++int attr logo 0x0
++int attr logoDescription 0x0
++int attr maxButtonHeight 0x0
++int attr measureWithLargestChild 0x0
++int attr menu 0x0
++int attr multiChoiceItemLayout 0x0
++int attr navigationContentDescription 0x0
++int attr navigationIcon 0x0
++int attr navigationMode 0x0
++int attr nestedScrollViewStyle 0x0
++int attr numericModifiers 0x0
++int attr overlapAnchor 0x0
++int attr overlayImage 0x0
++int attr paddingBottomNoButtons 0x0
++int attr paddingEnd 0x0
++int attr paddingStart 0x0
++int attr paddingTopNoTitle 0x0
++int attr panelBackground 0x0
++int attr panelMenuListTheme 0x0
++int attr panelMenuListWidth 0x0
++int attr placeholderImage 0x0
++int attr placeholderImageScaleType 0x0
++int attr popupMenuStyle 0x0
++int attr popupTheme 0x0
++int attr popupWindowStyle 0x0
++int attr preserveIconSpacing 0x0
++int attr pressedStateOverlayImage 0x0
++int attr progressBarAutoRotateInterval 0x0
++int attr progressBarImage 0x0
++int attr progressBarImageScaleType 0x0
++int attr progressBarPadding 0x0
++int attr progressBarStyle 0x0
++int attr queryBackground 0x0
++int attr queryHint 0x0
++int attr queryPatterns 0x0
++int attr radioButtonStyle 0x0
++int attr ratingBarStyle 0x0
++int attr ratingBarStyleIndicator 0x0
++int attr ratingBarStyleSmall 0x0
++int attr retryImage 0x0
++int attr retryImageScaleType 0x0
++int attr roundAsCircle 0x0
++int attr roundBottomEnd 0x0
++int attr roundBottomLeft 0x0
++int attr roundBottomRight 0x0
++int attr roundBottomStart 0x0
++int attr roundTopEnd 0x0
++int attr roundTopLeft 0x0
++int attr roundTopRight 0x0
++int attr roundTopStart 0x0
++int attr roundWithOverlayColor 0x0
++int attr roundedCornerRadius 0x0
++int attr roundingBorderColor 0x0
++int attr roundingBorderPadding 0x0
++int attr roundingBorderWidth 0x0
++int attr searchHintIcon 0x0
++int attr searchIcon 0x0
++int attr searchViewStyle 0x0
++int attr seekBarStyle 0x0
++int attr selectableItemBackground 0x0
++int attr selectableItemBackgroundBorderless 0x0
++int attr shortcutMatchRequired 0x0
++int attr showAsAction 0x0
++int attr showDividers 0x0
++int attr showText 0x0
++int attr showTitle 0x0
++int attr singleChoiceItemLayout 0x0
++int attr spinBars 0x0
++int attr spinnerDropDownItemStyle 0x0
++int attr spinnerStyle 0x0
++int attr splitTrack 0x0
++int attr srcCompat 0x0
++int attr state_above_anchor 0x0
++int attr subMenuArrow 0x0
++int attr submitBackground 0x0
++int attr subtitle 0x0
++int attr subtitleTextAppearance 0x0
++int attr subtitleTextColor 0x0
++int attr subtitleTextStyle 0x0
++int attr suggestionRowLayout 0x0
++int attr switchMinWidth 0x0
++int attr switchPadding 0x0
++int attr switchStyle 0x0
++int attr switchTextAppearance 0x0
++int attr textAllCaps 0x0
++int attr textAppearanceLargePopupMenu 0x0
++int attr textAppearanceListItem 0x0
++int attr textAppearanceListItemSecondary 0x0
++int attr textAppearanceListItemSmall 0x0
++int attr textAppearancePopupMenuHeader 0x0
++int attr textAppearanceSearchResultSubtitle 0x0
++int attr textAppearanceSearchResultTitle 0x0
++int attr textAppearanceSmallPopupMenu 0x0
++int attr textColorAlertDialogListItem 0x0
++int attr textColorSearchUrl 0x0
++int attr textLocale 0x0
++int attr theme 0x0
++int attr thickness 0x0
++int attr thumbTextPadding 0x0
++int attr thumbTint 0x0
++int attr thumbTintMode 0x0
++int attr tickMark 0x0
++int attr tickMarkTint 0x0
++int attr tickMarkTintMode 0x0
++int attr tint 0x0
++int attr tintMode 0x0
++int attr title 0x0
++int attr titleMargin 0x0
++int attr titleMarginBottom 0x0
++int attr titleMarginEnd 0x0
++int attr titleMarginStart 0x0
++int attr titleMarginTop 0x0
++int attr titleMargins 0x0
++int attr titleTextAppearance 0x0
++int attr titleTextColor 0x0
++int attr titleTextStyle 0x0
++int attr toolbarNavigationButtonStyle 0x0
++int attr toolbarStyle 0x0
++int attr tooltipForegroundColor 0x0
++int attr tooltipFrameBackground 0x0
++int attr tooltipText 0x0
++int attr track 0x0
++int attr trackTint 0x0
++int attr trackTintMode 0x0
++int attr ttcIndex 0x0
++int attr viewAspectRatio 0x0
++int attr viewInflaterClass 0x0
++int attr voiceIcon 0x0
++int attr windowActionBar 0x0
++int attr windowActionBarOverlay 0x0
++int attr windowActionModeOverlay 0x0
++int attr windowFixedHeightMajor 0x0
++int attr windowFixedHeightMinor 0x0
++int attr windowFixedWidthMajor 0x0
++int attr windowFixedWidthMinor 0x0
++int attr windowMinWidthMajor 0x0
++int attr windowMinWidthMinor 0x0
++int attr windowNoTitle 0x0
++int bool abc_action_bar_embed_tabs 0x0
++int bool abc_config_actionMenuItemAllCaps 0x0
++int color abc_background_cache_hint_selector_material_dark 0x0
++int color abc_background_cache_hint_selector_material_light 0x0
++int color abc_btn_colored_borderless_text_material 0x0
++int color abc_btn_colored_text_material 0x0
++int color abc_color_highlight_material 0x0
++int color abc_decor_view_status_guard 0x0
++int color abc_decor_view_status_guard_light 0x0
++int color abc_hint_foreground_material_dark 0x0
++int color abc_hint_foreground_material_light 0x0
++int color abc_primary_text_disable_only_material_dark 0x0
++int color abc_primary_text_disable_only_material_light 0x0
++int color abc_primary_text_material_dark 0x0
++int color abc_primary_text_material_light 0x0
++int color abc_search_url_text 0x0
++int color abc_search_url_text_normal 0x0
++int color abc_search_url_text_pressed 0x0
++int color abc_search_url_text_selected 0x0
++int color abc_secondary_text_material_dark 0x0
++int color abc_secondary_text_material_light 0x0
++int color abc_tint_btn_checkable 0x0
++int color abc_tint_default 0x0
++int color abc_tint_edittext 0x0
++int color abc_tint_seek_thumb 0x0
++int color abc_tint_spinner 0x0
++int color abc_tint_switch_track 0x0
++int color accent_material_dark 0x0
++int color accent_material_light 0x0
++int color androidx_core_ripple_material_light 0x0
++int color androidx_core_secondary_text_default_material_light 0x0
++int color background_floating_material_dark 0x0
++int color background_floating_material_light 0x0
++int color background_material_dark 0x0
++int color background_material_light 0x0
++int color bright_foreground_disabled_material_dark 0x0
++int color bright_foreground_disabled_material_light 0x0
++int color bright_foreground_inverse_material_dark 0x0
++int color bright_foreground_inverse_material_light 0x0
++int color bright_foreground_material_dark 0x0
++int color bright_foreground_material_light 0x0
++int color button_material_dark 0x0
++int color button_material_light 0x0
++int color catalyst_logbox_background 0x0
++int color catalyst_redbox_background 0x0
++int color dim_foreground_disabled_material_dark 0x0
++int color dim_foreground_disabled_material_light 0x0
++int color dim_foreground_material_dark 0x0
++int color dim_foreground_material_light 0x0
++int color error_color_material_dark 0x0
++int color error_color_material_light 0x0
++int color foreground_material_dark 0x0
++int color foreground_material_light 0x0
++int color highlighted_text_material_dark 0x0
++int color highlighted_text_material_light 0x0
++int color material_blue_grey_800 0x0
++int color material_blue_grey_900 0x0
++int color material_blue_grey_950 0x0
++int color material_deep_teal_200 0x0
++int color material_deep_teal_500 0x0
++int color material_grey_100 0x0
++int color material_grey_300 0x0
++int color material_grey_50 0x0
++int color material_grey_600 0x0
++int color material_grey_800 0x0
++int color material_grey_850 0x0
++int color material_grey_900 0x0
++int color notification_action_color_filter 0x0
++int color notification_icon_bg_color 0x0
++int color primary_dark_material_dark 0x0
++int color primary_dark_material_light 0x0
++int color primary_material_dark 0x0
++int color primary_material_light 0x0
++int color primary_text_default_material_dark 0x0
++int color primary_text_default_material_light 0x0
++int color primary_text_disabled_material_dark 0x0
++int color primary_text_disabled_material_light 0x0
++int color ripple_material_dark 0x0
++int color ripple_material_light 0x0
++int color secondary_text_default_material_dark 0x0
++int color secondary_text_default_material_light 0x0
++int color secondary_text_disabled_material_dark 0x0
++int color secondary_text_disabled_material_light 0x0
++int color switch_thumb_disabled_material_dark 0x0
++int color switch_thumb_disabled_material_light 0x0
++int color switch_thumb_material_dark 0x0
++int color switch_thumb_material_light 0x0
++int color switch_thumb_normal_material_dark 0x0
++int color switch_thumb_normal_material_light 0x0
++int color tooltip_background_dark 0x0
++int color tooltip_background_light 0x0
++int dimen abc_action_bar_content_inset_material 0x0
++int dimen abc_action_bar_content_inset_with_nav 0x0
++int dimen abc_action_bar_default_height_material 0x0
++int dimen abc_action_bar_default_padding_end_material 0x0
++int dimen abc_action_bar_default_padding_start_material 0x0
++int dimen abc_action_bar_elevation_material 0x0
++int dimen abc_action_bar_icon_vertical_padding_material 0x0
++int dimen abc_action_bar_overflow_padding_end_material 0x0
++int dimen abc_action_bar_overflow_padding_start_material 0x0
++int dimen abc_action_bar_stacked_max_height 0x0
++int dimen abc_action_bar_stacked_tab_max_width 0x0
++int dimen abc_action_bar_subtitle_bottom_margin_material 0x0
++int dimen abc_action_bar_subtitle_top_margin_material 0x0
++int dimen abc_action_button_min_height_material 0x0
++int dimen abc_action_button_min_width_material 0x0
++int dimen abc_action_button_min_width_overflow_material 0x0
++int dimen abc_alert_dialog_button_bar_height 0x0
++int dimen abc_alert_dialog_button_dimen 0x0
++int dimen abc_button_inset_horizontal_material 0x0
++int dimen abc_button_inset_vertical_material 0x0
++int dimen abc_button_padding_horizontal_material 0x0
++int dimen abc_button_padding_vertical_material 0x0
++int dimen abc_cascading_menus_min_smallest_width 0x0
++int dimen abc_config_prefDialogWidth 0x0
++int dimen abc_control_corner_material 0x0
++int dimen abc_control_inset_material 0x0
++int dimen abc_control_padding_material 0x0
++int dimen abc_dialog_corner_radius_material 0x0
++int dimen abc_dialog_fixed_height_major 0x0
++int dimen abc_dialog_fixed_height_minor 0x0
++int dimen abc_dialog_fixed_width_major 0x0
++int dimen abc_dialog_fixed_width_minor 0x0
++int dimen abc_dialog_list_padding_bottom_no_buttons 0x0
++int dimen abc_dialog_list_padding_top_no_title 0x0
++int dimen abc_dialog_min_width_major 0x0
++int dimen abc_dialog_min_width_minor 0x0
++int dimen abc_dialog_padding_material 0x0
++int dimen abc_dialog_padding_top_material 0x0
++int dimen abc_dialog_title_divider_material 0x0
++int dimen abc_disabled_alpha_material_dark 0x0
++int dimen abc_disabled_alpha_material_light 0x0
++int dimen abc_dropdownitem_icon_width 0x0
++int dimen abc_dropdownitem_text_padding_left 0x0
++int dimen abc_dropdownitem_text_padding_right 0x0
++int dimen abc_edit_text_inset_bottom_material 0x0
++int dimen abc_edit_text_inset_horizontal_material 0x0
++int dimen abc_edit_text_inset_top_material 0x0
++int dimen abc_floating_window_z 0x0
++int dimen abc_list_item_height_large_material 0x0
++int dimen abc_list_item_height_material 0x0
++int dimen abc_list_item_height_small_material 0x0
++int dimen abc_list_item_padding_horizontal_material 0x0
++int dimen abc_panel_menu_list_width 0x0
++int dimen abc_progress_bar_height_material 0x0
++int dimen abc_search_view_preferred_height 0x0
++int dimen abc_search_view_preferred_width 0x0
++int dimen abc_seekbar_track_background_height_material 0x0
++int dimen abc_seekbar_track_progress_height_material 0x0
++int dimen abc_select_dialog_padding_start_material 0x0
++int dimen abc_star_big 0x0
++int dimen abc_star_medium 0x0
++int dimen abc_star_small 0x0
++int dimen abc_switch_padding 0x0
++int dimen abc_text_size_body_1_material 0x0
++int dimen abc_text_size_body_2_material 0x0
++int dimen abc_text_size_button_material 0x0
++int dimen abc_text_size_caption_material 0x0
++int dimen abc_text_size_display_1_material 0x0
++int dimen abc_text_size_display_2_material 0x0
++int dimen abc_text_size_display_3_material 0x0
++int dimen abc_text_size_display_4_material 0x0
++int dimen abc_text_size_headline_material 0x0
++int dimen abc_text_size_large_material 0x0
++int dimen abc_text_size_medium_material 0x0
++int dimen abc_text_size_menu_header_material 0x0
++int dimen abc_text_size_menu_material 0x0
++int dimen abc_text_size_small_material 0x0
++int dimen abc_text_size_subhead_material 0x0
++int dimen abc_text_size_subtitle_material_toolbar 0x0
++int dimen abc_text_size_title_material 0x0
++int dimen abc_text_size_title_material_toolbar 0x0
++int dimen autofill_inline_suggestion_icon_size 0x0
++int dimen compat_button_inset_horizontal_material 0x0
++int dimen compat_button_inset_vertical_material 0x0
++int dimen compat_button_padding_horizontal_material 0x0
++int dimen compat_button_padding_vertical_material 0x0
++int dimen compat_control_corner_material 0x0
++int dimen compat_notification_large_icon_max_height 0x0
++int dimen compat_notification_large_icon_max_width 0x0
++int dimen disabled_alpha_material_dark 0x0
++int dimen disabled_alpha_material_light 0x0
++int dimen highlight_alpha_material_colored 0x0
++int dimen highlight_alpha_material_dark 0x0
++int dimen highlight_alpha_material_light 0x0
++int dimen hint_alpha_material_dark 0x0
++int dimen hint_alpha_material_light 0x0
++int dimen hint_pressed_alpha_material_dark 0x0
++int dimen hint_pressed_alpha_material_light 0x0
++int dimen notification_action_icon_size 0x0
++int dimen notification_action_text_size 0x0
++int dimen notification_big_circle_margin 0x0
++int dimen notification_content_margin_start 0x0
++int dimen notification_large_icon_height 0x0
++int dimen notification_large_icon_width 0x0
++int dimen notification_main_column_padding_top 0x0
++int dimen notification_media_narrow_margin 0x0
++int dimen notification_right_icon_size 0x0
++int dimen notification_right_side_padding_top 0x0
++int dimen notification_small_icon_background_padding 0x0
++int dimen notification_small_icon_size_as_large 0x0
++int dimen notification_subtext_size 0x0
++int dimen notification_top_pad 0x0
++int dimen notification_top_pad_large_text 0x0
++int dimen tooltip_corner_radius 0x0
++int dimen tooltip_horizontal_padding 0x0
++int dimen tooltip_margin 0x0
++int dimen tooltip_precise_anchor_extra_offset 0x0
++int dimen tooltip_precise_anchor_threshold 0x0
++int dimen tooltip_vertical_padding 0x0
++int dimen tooltip_y_offset_non_touch 0x0
++int dimen tooltip_y_offset_touch 0x0
++int drawable abc_ab_share_pack_mtrl_alpha 0x0
++int drawable abc_action_bar_item_background_material 0x0
++int drawable abc_btn_borderless_material 0x0
++int drawable abc_btn_check_material 0x0
++int drawable abc_btn_check_material_anim 0x0
++int drawable abc_btn_check_to_on_mtrl_000 0x0
++int drawable abc_btn_check_to_on_mtrl_015 0x0
++int drawable abc_btn_colored_material 0x0
++int drawable abc_btn_default_mtrl_shape 0x0
++int drawable abc_btn_radio_material 0x0
++int drawable abc_btn_radio_material_anim 0x0
++int drawable abc_btn_radio_to_on_mtrl_000 0x0
++int drawable abc_btn_radio_to_on_mtrl_015 0x0
++int drawable abc_btn_switch_to_on_mtrl_00001 0x0
++int drawable abc_btn_switch_to_on_mtrl_00012 0x0
++int drawable abc_cab_background_internal_bg 0x0
++int drawable abc_cab_background_top_material 0x0
++int drawable abc_cab_background_top_mtrl_alpha 0x0
++int drawable abc_control_background_material 0x0
++int drawable abc_dialog_material_background 0x0
++int drawable abc_edit_text_material 0x0
++int drawable abc_ic_ab_back_material 0x0
++int drawable abc_ic_arrow_drop_right_black_24dp 0x0
++int drawable abc_ic_clear_material 0x0
++int drawable abc_ic_commit_search_api_mtrl_alpha 0x0
++int drawable abc_ic_go_search_api_material 0x0
++int drawable abc_ic_menu_copy_mtrl_am_alpha 0x0
++int drawable abc_ic_menu_cut_mtrl_alpha 0x0
++int drawable abc_ic_menu_overflow_material 0x0
++int drawable abc_ic_menu_paste_mtrl_am_alpha 0x0
++int drawable abc_ic_menu_selectall_mtrl_alpha 0x0
++int drawable abc_ic_menu_share_mtrl_alpha 0x0
++int drawable abc_ic_search_api_material 0x0
++int drawable abc_ic_voice_search_api_material 0x0
++int drawable abc_item_background_holo_dark 0x0
++int drawable abc_item_background_holo_light 0x0
++int drawable abc_list_divider_material 0x0
++int drawable abc_list_divider_mtrl_alpha 0x0
++int drawable abc_list_focused_holo 0x0
++int drawable abc_list_longpressed_holo 0x0
++int drawable abc_list_pressed_holo_dark 0x0
++int drawable abc_list_pressed_holo_light 0x0
++int drawable abc_list_selector_background_transition_holo_dark 0x0
++int drawable abc_list_selector_background_transition_holo_light 0x0
++int drawable abc_list_selector_disabled_holo_dark 0x0
++int drawable abc_list_selector_disabled_holo_light 0x0
++int drawable abc_list_selector_holo_dark 0x0
++int drawable abc_list_selector_holo_light 0x0
++int drawable abc_menu_hardkey_panel_mtrl_mult 0x0
++int drawable abc_popup_background_mtrl_mult 0x0
++int drawable abc_ratingbar_indicator_material 0x0
++int drawable abc_ratingbar_material 0x0
++int drawable abc_ratingbar_small_material 0x0
++int drawable abc_scrubber_control_off_mtrl_alpha 0x0
++int drawable abc_scrubber_control_to_pressed_mtrl_000 0x0
++int drawable abc_scrubber_control_to_pressed_mtrl_005 0x0
++int drawable abc_scrubber_primary_mtrl_alpha 0x0
++int drawable abc_scrubber_track_mtrl_alpha 0x0
++int drawable abc_seekbar_thumb_material 0x0
++int drawable abc_seekbar_tick_mark_material 0x0
++int drawable abc_seekbar_track_material 0x0
++int drawable abc_spinner_mtrl_am_alpha 0x0
++int drawable abc_spinner_textfield_background_material 0x0
++int drawable abc_star_black_48dp 0x0
++int drawable abc_star_half_black_48dp 0x0
++int drawable abc_switch_thumb_material 0x0
++int drawable abc_switch_track_mtrl_alpha 0x0
++int drawable abc_tab_indicator_material 0x0
++int drawable abc_tab_indicator_mtrl_alpha 0x0
++int drawable abc_text_cursor_material 0x0
++int drawable abc_text_select_handle_left_mtrl 0x0
++int drawable abc_text_select_handle_middle_mtrl 0x0
++int drawable abc_text_select_handle_right_mtrl 0x0
++int drawable abc_textfield_activated_mtrl_alpha 0x0
++int drawable abc_textfield_default_mtrl_alpha 0x0
++int drawable abc_textfield_search_activated_mtrl_alpha 0x0
++int drawable abc_textfield_search_default_mtrl_alpha 0x0
++int drawable abc_textfield_search_material 0x0
++int drawable abc_vector_test 0x0
++int drawable autofill_inline_suggestion_chip_background 0x0
++int drawable btn_checkbox_checked_mtrl 0x0
++int drawable btn_checkbox_checked_to_unchecked_mtrl_animation 0x0
++int drawable btn_checkbox_unchecked_mtrl 0x0
++int drawable btn_checkbox_unchecked_to_checked_mtrl_animation 0x0
++int drawable btn_radio_off_mtrl 0x0
++int drawable btn_radio_off_to_on_mtrl_animation 0x0
++int drawable btn_radio_on_mtrl 0x0
++int drawable btn_radio_on_to_off_mtrl_animation 0x0
++int drawable notification_action_background 0x0
++int drawable notification_bg 0x0
++int drawable notification_bg_low 0x0
++int drawable notification_bg_low_normal 0x0
++int drawable notification_bg_low_pressed 0x0
++int drawable notification_bg_normal 0x0
++int drawable notification_bg_normal_pressed 0x0
++int drawable notification_icon_background 0x0
++int drawable notification_template_icon_bg 0x0
++int drawable notification_template_icon_low_bg 0x0
++int drawable notification_tile_bg 0x0
++int drawable notify_panel_notification_icon_bg 0x0
++int drawable redbox_top_border_background 0x0
++int drawable test_level_drawable 0x0
++int drawable tooltip_frame_dark 0x0
++int drawable tooltip_frame_light 0x0
++int id accessibility_action_clickable_span 0x0
++int id accessibility_actions 0x0
++int id accessibility_collection 0x0
++int id accessibility_collection_item 0x0
++int id accessibility_custom_action_0 0x0
++int id accessibility_custom_action_1 0x0
++int id accessibility_custom_action_10 0x0
++int id accessibility_custom_action_11 0x0
++int id accessibility_custom_action_12 0x0
++int id accessibility_custom_action_13 0x0
++int id accessibility_custom_action_14 0x0
++int id accessibility_custom_action_15 0x0
++int id accessibility_custom_action_16 0x0
++int id accessibility_custom_action_17 0x0
++int id accessibility_custom_action_18 0x0
++int id accessibility_custom_action_19 0x0
++int id accessibility_custom_action_2 0x0
++int id accessibility_custom_action_20 0x0
++int id accessibility_custom_action_21 0x0
++int id accessibility_custom_action_22 0x0
++int id accessibility_custom_action_23 0x0
++int id accessibility_custom_action_24 0x0
++int id accessibility_custom_action_25 0x0
++int id accessibility_custom_action_26 0x0
++int id accessibility_custom_action_27 0x0
++int id accessibility_custom_action_28 0x0
++int id accessibility_custom_action_29 0x0
++int id accessibility_custom_action_3 0x0
++int id accessibility_custom_action_30 0x0
++int id accessibility_custom_action_31 0x0
++int id accessibility_custom_action_4 0x0
++int id accessibility_custom_action_5 0x0
++int id accessibility_custom_action_6 0x0
++int id accessibility_custom_action_7 0x0
++int id accessibility_custom_action_8 0x0
++int id accessibility_custom_action_9 0x0
++int id accessibility_hint 0x0
++int id accessibility_label 0x0
++int id accessibility_links 0x0
++int id accessibility_role 0x0
++int id accessibility_state 0x0
++int id accessibility_value 0x0
++int id action_bar 0x0
++int id action_bar_activity_content 0x0
++int id action_bar_container 0x0
++int id action_bar_root 0x0
++int id action_bar_spinner 0x0
++int id action_bar_subtitle 0x0
++int id action_bar_title 0x0
++int id action_container 0x0
++int id action_context_bar 0x0
++int id action_divider 0x0
++int id action_image 0x0
++int id action_menu_divider 0x0
++int id action_menu_presenter 0x0
++int id action_mode_bar 0x0
++int id action_mode_bar_stub 0x0
++int id action_mode_close_button 0x0
++int id action_text 0x0
++int id actions 0x0
++int id activity_chooser_view_content 0x0
++int id add 0x0
++int id alertTitle 0x0
++int id async 0x0
++int id autofill_inline_suggestion_end_icon 0x0
++int id autofill_inline_suggestion_start_icon 0x0
++int id autofill_inline_suggestion_subtitle 0x0
++int id autofill_inline_suggestion_title 0x0
++int id blocking 0x0
++int id buttonPanel 0x0
++int id catalyst_redbox_title 0x0
++int id center 0x0
++int id centerCrop 0x0
++int id centerInside 0x0
++int id checkbox 0x0
++int id checked 0x0
++int id chronometer 0x0
++int id content 0x0
++int id contentPanel 0x0
++int id custom 0x0
++int id customPanel 0x0
++int id decor_content_parent 0x0
++int id default_activity_button 0x0
++int id dialog_button 0x0
++int id edit_query 0x0
++int id expand_activities_button 0x0
++int id expanded_menu 0x0
++int id fitBottomStart 0x0
++int id fitCenter 0x0
++int id fitEnd 0x0
++int id fitStart 0x0
++int id fitXY 0x0
++int id focusCrop 0x0
++int id forever 0x0
++int id fps_text 0x0
++int id fragment_container_view_tag 0x0
++int id group_divider 0x0
++int id home 0x0
++int id icon 0x0
++int id icon_group 0x0
++int id image 0x0
++int id info 0x0
++int id italic 0x0
++int id item1 0x0
++int id item2 0x0
++int id item3 0x0
++int id item4 0x0
++int id labelled_by 0x0
++int id line1 0x0
++int id line3 0x0
++int id listMode 0x0
++int id list_item 0x0
++int id message 0x0
++int id multiply 0x0
++int id none 0x0
++int id normal 0x0
++int id notification_background 0x0
++int id notification_main_column 0x0
++int id notification_main_column_container 0x0
++int id off 0x0
++int id on 0x0
++int id parentPanel 0x0
++int id pointer_events 0x0
++int id progress_circular 0x0
++int id progress_horizontal 0x0
++int id radio 0x0
++int id react_test_id 0x0
++int id right_icon 0x0
++int id right_side 0x0
++int id rn_frame_file 0x0
++int id rn_frame_method 0x0
++int id rn_redbox_dismiss_button 0x0
++int id rn_redbox_line_separator 0x0
++int id rn_redbox_loading_indicator 0x0
++int id rn_redbox_reload_button 0x0
++int id rn_redbox_report_button 0x0
++int id rn_redbox_report_label 0x0
++int id rn_redbox_stack 0x0
++int id screen 0x0
++int id scrollIndicatorDown 0x0
++int id scrollIndicatorUp 0x0
++int id scrollView 0x0
++int id search_badge 0x0
++int id search_bar 0x0
++int id search_button 0x0
++int id search_close_btn 0x0
++int id search_edit_frame 0x0
++int id search_go_btn 0x0
++int id search_mag_icon 0x0
++int id search_plate 0x0
++int id search_src_text 0x0
++int id search_voice_btn 0x0
++int id select_dialog_listview 0x0
++int id shortcut 0x0
++int id spacer 0x0
++int id special_effects_controller_view_tag 0x0
++int id split_action_bar 0x0
++int id src_atop 0x0
++int id src_in 0x0
++int id src_over 0x0
++int id submenuarrow 0x0
++int id submit_area 0x0
++int id tabMode 0x0
++int id tag_accessibility_actions 0x0
++int id tag_accessibility_clickable_spans 0x0
++int id tag_accessibility_heading 0x0
++int id tag_accessibility_pane_title 0x0
++int id tag_on_apply_window_listener 0x0
++int id tag_on_receive_content_listener 0x0
++int id tag_on_receive_content_mime_types 0x0
++int id tag_screen_reader_focusable 0x0
++int id tag_state_description 0x0
++int id tag_transition_group 0x0
++int id tag_unhandled_key_event_manager 0x0
++int id tag_unhandled_key_listeners 0x0
++int id tag_window_insets_animation_callback 0x0
++int id text 0x0
++int id text2 0x0
++int id textSpacerNoButtons 0x0
++int id textSpacerNoTitle 0x0
++int id time 0x0
++int id title 0x0
++int id titleDividerNoCustom 0x0
++int id title_template 0x0
++int id topPanel 0x0
++int id unchecked 0x0
++int id uniform 0x0
++int id up 0x0
++int id view_tag_instance_handle 0x0
++int id view_tag_native_id 0x0
++int id view_tree_lifecycle_owner 0x0
++int id view_tree_saved_state_registry_owner 0x0
++int id view_tree_view_model_store_owner 0x0
++int id visible_removing_fragment_view_tag 0x0
++int id wrap_content 0x0
++int integer abc_config_activityDefaultDur 0x0
++int integer abc_config_activityShortDur 0x0
++int integer cancel_button_image_alpha 0x0
++int integer config_tooltipAnimTime 0x0
++int integer react_native_dev_server_port 0x0
++int integer react_native_inspector_proxy_port 0x0
++int integer status_bar_notification_info_maxnum 0x0
++int interpolator btn_checkbox_checked_mtrl_animation_interpolator_0 0x0
++int interpolator btn_checkbox_checked_mtrl_animation_interpolator_1 0x0
++int interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_0 0x0
++int interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_1 0x0
++int interpolator btn_radio_to_off_mtrl_animation_interpolator_0 0x0
++int interpolator btn_radio_to_on_mtrl_animation_interpolator_0 0x0
++int interpolator fast_out_slow_in 0x0
++int layout abc_action_bar_title_item 0x0
++int layout abc_action_bar_up_container 0x0
++int layout abc_action_menu_item_layout 0x0
++int layout abc_action_menu_layout 0x0
++int layout abc_action_mode_bar 0x0
++int layout abc_action_mode_close_item_material 0x0
++int layout abc_activity_chooser_view 0x0
++int layout abc_activity_chooser_view_list_item 0x0
++int layout abc_alert_dialog_button_bar_material 0x0
++int layout abc_alert_dialog_material 0x0
++int layout abc_alert_dialog_title_material 0x0
++int layout abc_cascading_menu_item_layout 0x0
++int layout abc_dialog_title_material 0x0
++int layout abc_expanded_menu_layout 0x0
++int layout abc_list_menu_item_checkbox 0x0
++int layout abc_list_menu_item_icon 0x0
++int layout abc_list_menu_item_layout 0x0
++int layout abc_list_menu_item_radio 0x0
++int layout abc_popup_menu_header_item_layout 0x0
++int layout abc_popup_menu_item_layout 0x0
++int layout abc_screen_content_include 0x0
++int layout abc_screen_simple 0x0
++int layout abc_screen_simple_overlay_action_mode 0x0
++int layout abc_screen_toolbar 0x0
++int layout abc_search_dropdown_item_icons_2line 0x0
++int layout abc_search_view 0x0
++int layout abc_select_dialog_material 0x0
++int layout abc_tooltip 0x0
++int layout autofill_inline_suggestion 0x0
++int layout custom_dialog 0x0
++int layout dev_loading_view 0x0
++int layout fps_view 0x0
++int layout notification_action 0x0
++int layout notification_action_tombstone 0x0
++int layout notification_template_custom_big 0x0
++int layout notification_template_icon_group 0x0
++int layout notification_template_part_chronometer 0x0
++int layout notification_template_part_time 0x0
++int layout redbox_item_frame 0x0
++int layout redbox_item_title 0x0
++int layout redbox_view 0x0
++int layout select_dialog_item_material 0x0
++int layout select_dialog_multichoice_material 0x0
++int layout select_dialog_singlechoice_material 0x0
++int layout support_simple_spinner_dropdown_item 0x0
++int menu example_menu 0x0
++int menu example_menu2 0x0
++int string abc_action_bar_home_description 0x0
++int string abc_action_bar_up_description 0x0
++int string abc_action_menu_overflow_description 0x0
++int string abc_action_mode_done 0x0
++int string abc_activity_chooser_view_see_all 0x0
++int string abc_activitychooserview_choose_application 0x0
++int string abc_capital_off 0x0
++int string abc_capital_on 0x0
++int string abc_menu_alt_shortcut_label 0x0
++int string abc_menu_ctrl_shortcut_label 0x0
++int string abc_menu_delete_shortcut_label 0x0
++int string abc_menu_enter_shortcut_label 0x0
++int string abc_menu_function_shortcut_label 0x0
++int string abc_menu_meta_shortcut_label 0x0
++int string abc_menu_shift_shortcut_label 0x0
++int string abc_menu_space_shortcut_label 0x0
++int string abc_menu_sym_shortcut_label 0x0
++int string abc_prepend_shortcut_label 0x0
++int string abc_search_hint 0x0
++int string abc_searchview_description_clear 0x0
++int string abc_searchview_description_query 0x0
++int string abc_searchview_description_search 0x0
++int string abc_searchview_description_submit 0x0
++int string abc_searchview_description_voice 0x0
++int string abc_shareactionprovider_share_with 0x0
++int string abc_shareactionprovider_share_with_application 0x0
++int string abc_toolbar_collapse_description 0x0
++int string alert_description 0x0
++int string catalyst_change_bundle_location 0x0
++int string catalyst_copy_button 0x0
++int string catalyst_debug 0x0
++int string catalyst_debug_chrome 0x0
++int string catalyst_debug_chrome_stop 0x0
++int string catalyst_debug_connecting 0x0
++int string catalyst_debug_error 0x0
++int string catalyst_debug_open 0x0
++int string catalyst_debug_stop 0x0
++int string catalyst_devtools_open 0x0
++int string catalyst_dismiss_button 0x0
++int string catalyst_heap_capture 0x0
++int string catalyst_hot_reloading 0x0
++int string catalyst_hot_reloading_auto_disable 0x0
++int string catalyst_hot_reloading_auto_enable 0x0
++int string catalyst_hot_reloading_stop 0x0
++int string catalyst_inspector 0x0
++int string catalyst_inspector_stop 0x0
++int string catalyst_loading_from_url 0x0
++int string catalyst_open_flipper_error 0x0
++int string catalyst_perf_monitor 0x0
++int string catalyst_perf_monitor_stop 0x0
++int string catalyst_reload 0x0
++int string catalyst_reload_button 0x0
++int string catalyst_reload_error 0x0
++int string catalyst_report_button 0x0
++int string catalyst_sample_profiler_disable 0x0
++int string catalyst_sample_profiler_enable 0x0
++int string catalyst_settings 0x0
++int string catalyst_settings_title 0x0
++int string combobox_description 0x0
++int string header_description 0x0
++int string image_description 0x0
++int string imagebutton_description 0x0
++int string link_description 0x0
++int string menu_description 0x0
++int string menubar_description 0x0
++int string menuitem_description 0x0
++int string progressbar_description 0x0
++int string radiogroup_description 0x0
++int string rn_tab_description 0x0
++int string scrollbar_description 0x0
++int string search_menu_title 0x0
++int string spinbutton_description 0x0
++int string state_busy_description 0x0
++int string state_collapsed_description 0x0
++int string state_expanded_description 0x0
++int string state_mixed_description 0x0
++int string state_off_description 0x0
++int string state_on_description 0x0
++int string state_unselected_description 0x0
++int string status_bar_notification_info_overflow 0x0
++int string summary_description 0x0
++int string tablist_description 0x0
++int string timer_description 0x0
++int string toolbar_description 0x0
++int style AlertDialog_AppCompat 0x0
++int style AlertDialog_AppCompat_Light 0x0
++int style Animation_AppCompat_Dialog 0x0
++int style Animation_AppCompat_DropDownUp 0x0
++int style Animation_AppCompat_Tooltip 0x0
++int style Animation_Catalyst_LogBox 0x0
++int style Animation_Catalyst_RedBox 0x0
++int style Base_AlertDialog_AppCompat 0x0
++int style Base_AlertDialog_AppCompat_Light 0x0
++int style Base_Animation_AppCompat_Dialog 0x0
++int style Base_Animation_AppCompat_DropDownUp 0x0
++int style Base_Animation_AppCompat_Tooltip 0x0
++int style Base_DialogWindowTitleBackground_AppCompat 0x0
++int style Base_DialogWindowTitle_AppCompat 0x0
++int style Base_TextAppearance_AppCompat 0x0
++int style Base_TextAppearance_AppCompat_Body1 0x0
++int style Base_TextAppearance_AppCompat_Body2 0x0
++int style Base_TextAppearance_AppCompat_Button 0x0
++int style Base_TextAppearance_AppCompat_Caption 0x0
++int style Base_TextAppearance_AppCompat_Display1 0x0
++int style Base_TextAppearance_AppCompat_Display2 0x0
++int style Base_TextAppearance_AppCompat_Display3 0x0
++int style Base_TextAppearance_AppCompat_Display4 0x0
++int style Base_TextAppearance_AppCompat_Headline 0x0
++int style Base_TextAppearance_AppCompat_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Large 0x0
++int style Base_TextAppearance_AppCompat_Large_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x0
++int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x0
++int style Base_TextAppearance_AppCompat_Medium 0x0
++int style Base_TextAppearance_AppCompat_Medium_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Menu 0x0
++int style Base_TextAppearance_AppCompat_SearchResult 0x0
++int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x0
++int style Base_TextAppearance_AppCompat_SearchResult_Title 0x0
++int style Base_TextAppearance_AppCompat_Small 0x0
++int style Base_TextAppearance_AppCompat_Small_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Subhead 0x0
++int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Title 0x0
++int style Base_TextAppearance_AppCompat_Title_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Tooltip 0x0
++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x0
++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x0
++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x0
++int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x0
++int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x0
++int style Base_TextAppearance_AppCompat_Widget_Button 0x0
++int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x0
++int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x0
++int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x0
++int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x0
++int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x0
++int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x0
++int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x0
++int style Base_TextAppearance_AppCompat_Widget_Switch 0x0
++int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x0
++int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x0
++int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x0
++int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x0
++int style Base_ThemeOverlay_AppCompat 0x0
++int style Base_ThemeOverlay_AppCompat_ActionBar 0x0
++int style Base_ThemeOverlay_AppCompat_Dark 0x0
++int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x0
++int style Base_ThemeOverlay_AppCompat_Dialog 0x0
++int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x0
++int style Base_ThemeOverlay_AppCompat_Light 0x0
++int style Base_Theme_AppCompat 0x0
++int style Base_Theme_AppCompat_CompactMenu 0x0
++int style Base_Theme_AppCompat_Dialog 0x0
++int style Base_Theme_AppCompat_DialogWhenLarge 0x0
++int style Base_Theme_AppCompat_Dialog_Alert 0x0
++int style Base_Theme_AppCompat_Dialog_FixedSize 0x0
++int style Base_Theme_AppCompat_Dialog_MinWidth 0x0
++int style Base_Theme_AppCompat_Light 0x0
++int style Base_Theme_AppCompat_Light_DarkActionBar 0x0
++int style Base_Theme_AppCompat_Light_Dialog 0x0
++int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x0
++int style Base_Theme_AppCompat_Light_Dialog_Alert 0x0
++int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x0
++int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x0
++int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x0
++int style Base_V21_Theme_AppCompat 0x0
++int style Base_V21_Theme_AppCompat_Dialog 0x0
++int style Base_V21_Theme_AppCompat_Light 0x0
++int style Base_V21_Theme_AppCompat_Light_Dialog 0x0
++int style Base_V22_Theme_AppCompat 0x0
++int style Base_V22_Theme_AppCompat_Light 0x0
++int style Base_V23_Theme_AppCompat 0x0
++int style Base_V23_Theme_AppCompat_Light 0x0
++int style Base_V26_Theme_AppCompat 0x0
++int style Base_V26_Theme_AppCompat_Light 0x0
++int style Base_V26_Widget_AppCompat_Toolbar 0x0
++int style Base_V28_Theme_AppCompat 0x0
++int style Base_V28_Theme_AppCompat_Light 0x0
++int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x0
++int style Base_V7_Theme_AppCompat 0x0
++int style Base_V7_Theme_AppCompat_Dialog 0x0
++int style Base_V7_Theme_AppCompat_Light 0x0
++int style Base_V7_Theme_AppCompat_Light_Dialog 0x0
++int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x0
++int style Base_V7_Widget_AppCompat_EditText 0x0
++int style Base_V7_Widget_AppCompat_Toolbar 0x0
++int style Base_Widget_AppCompat_ActionBar 0x0
++int style Base_Widget_AppCompat_ActionBar_Solid 0x0
++int style Base_Widget_AppCompat_ActionBar_TabBar 0x0
++int style Base_Widget_AppCompat_ActionBar_TabText 0x0
++int style Base_Widget_AppCompat_ActionBar_TabView 0x0
++int style Base_Widget_AppCompat_ActionButton 0x0
++int style Base_Widget_AppCompat_ActionButton_CloseMode 0x0
++int style Base_Widget_AppCompat_ActionButton_Overflow 0x0
++int style Base_Widget_AppCompat_ActionMode 0x0
++int style Base_Widget_AppCompat_ActivityChooserView 0x0
++int style Base_Widget_AppCompat_AutoCompleteTextView 0x0
++int style Base_Widget_AppCompat_Button 0x0
++int style Base_Widget_AppCompat_ButtonBar 0x0
++int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x0
++int style Base_Widget_AppCompat_Button_Borderless 0x0
++int style Base_Widget_AppCompat_Button_Borderless_Colored 0x0
++int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x0
++int style Base_Widget_AppCompat_Button_Colored 0x0
++int style Base_Widget_AppCompat_Button_Small 0x0
++int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x0
++int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x0
++int style Base_Widget_AppCompat_CompoundButton_Switch 0x0
++int style Base_Widget_AppCompat_DrawerArrowToggle 0x0
++int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x0
++int style Base_Widget_AppCompat_DropDownItem_Spinner 0x0
++int style Base_Widget_AppCompat_EditText 0x0
++int style Base_Widget_AppCompat_ImageButton 0x0
++int style Base_Widget_AppCompat_Light_ActionBar 0x0
++int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x0
++int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x0
++int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x0
++int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x0
++int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x0
++int style Base_Widget_AppCompat_Light_PopupMenu 0x0
++int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x0
++int style Base_Widget_AppCompat_ListMenuView 0x0
++int style Base_Widget_AppCompat_ListPopupWindow 0x0
++int style Base_Widget_AppCompat_ListView 0x0
++int style Base_Widget_AppCompat_ListView_DropDown 0x0
++int style Base_Widget_AppCompat_ListView_Menu 0x0
++int style Base_Widget_AppCompat_PopupMenu 0x0
++int style Base_Widget_AppCompat_PopupMenu_Overflow 0x0
++int style Base_Widget_AppCompat_PopupWindow 0x0
++int style Base_Widget_AppCompat_ProgressBar 0x0
++int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x0
++int style Base_Widget_AppCompat_RatingBar 0x0
++int style Base_Widget_AppCompat_RatingBar_Indicator 0x0
++int style Base_Widget_AppCompat_RatingBar_Small 0x0
++int style Base_Widget_AppCompat_SearchView 0x0
++int style Base_Widget_AppCompat_SearchView_ActionBar 0x0
++int style Base_Widget_AppCompat_SeekBar 0x0
++int style Base_Widget_AppCompat_SeekBar_Discrete 0x0
++int style Base_Widget_AppCompat_Spinner 0x0
++int style Base_Widget_AppCompat_Spinner_Underlined 0x0
++int style Base_Widget_AppCompat_TextView 0x0
++int style Base_Widget_AppCompat_TextView_SpinnerItem 0x0
++int style Base_Widget_AppCompat_Toolbar 0x0
++int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x0
++int style CalendarDatePickerDialog 0x0
++int style CalendarDatePickerStyle 0x0
++int style DialogAnimationFade 0x0
++int style DialogAnimationSlide 0x0
++int style Platform_AppCompat 0x0
++int style Platform_AppCompat_Light 0x0
++int style Platform_ThemeOverlay_AppCompat 0x0
++int style Platform_ThemeOverlay_AppCompat_Dark 0x0
++int style Platform_ThemeOverlay_AppCompat_Light 0x0
++int style Platform_V21_AppCompat 0x0
++int style Platform_V21_AppCompat_Light 0x0
++int style Platform_V25_AppCompat 0x0
++int style Platform_V25_AppCompat_Light 0x0
++int style Platform_Widget_AppCompat_Spinner 0x0
++int style RtlOverlay_DialogWindowTitle_AppCompat 0x0
++int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x0
++int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x0
++int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x0
++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x0
++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x0
++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x0
++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x0
++int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x0
++int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x0
++int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x0
++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x0
++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x0
++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x0
++int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x0
++int style RtlUnderlay_Widget_AppCompat_ActionButton 0x0
++int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x0
++int style SpinnerDatePickerDialog 0x0
++int style SpinnerDatePickerStyle 0x0
++int style TextAppearance_AppCompat 0x0
++int style TextAppearance_AppCompat_Body1 0x0
++int style TextAppearance_AppCompat_Body2 0x0
++int style TextAppearance_AppCompat_Button 0x0
++int style TextAppearance_AppCompat_Caption 0x0
++int style TextAppearance_AppCompat_Display1 0x0
++int style TextAppearance_AppCompat_Display2 0x0
++int style TextAppearance_AppCompat_Display3 0x0
++int style TextAppearance_AppCompat_Display4 0x0
++int style TextAppearance_AppCompat_Headline 0x0
++int style TextAppearance_AppCompat_Inverse 0x0
++int style TextAppearance_AppCompat_Large 0x0
++int style TextAppearance_AppCompat_Large_Inverse 0x0
++int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x0
++int style TextAppearance_AppCompat_Light_SearchResult_Title 0x0
++int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x0
++int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x0
++int style TextAppearance_AppCompat_Medium 0x0
++int style TextAppearance_AppCompat_Medium_Inverse 0x0
++int style TextAppearance_AppCompat_Menu 0x0
++int style TextAppearance_AppCompat_SearchResult_Subtitle 0x0
++int style TextAppearance_AppCompat_SearchResult_Title 0x0
++int style TextAppearance_AppCompat_Small 0x0
++int style TextAppearance_AppCompat_Small_Inverse 0x0
++int style TextAppearance_AppCompat_Subhead 0x0
++int style TextAppearance_AppCompat_Subhead_Inverse 0x0
++int style TextAppearance_AppCompat_Title 0x0
++int style TextAppearance_AppCompat_Title_Inverse 0x0
++int style TextAppearance_AppCompat_Tooltip 0x0
++int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x0
++int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x0
++int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x0
++int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x0
++int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x0
++int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x0
++int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x0
++int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x0
++int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x0
++int style TextAppearance_AppCompat_Widget_Button 0x0
++int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x0
++int style TextAppearance_AppCompat_Widget_Button_Colored 0x0
++int style TextAppearance_AppCompat_Widget_Button_Inverse 0x0
++int style TextAppearance_AppCompat_Widget_DropDownItem 0x0
++int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x0
++int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x0
++int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x0
++int style TextAppearance_AppCompat_Widget_Switch 0x0
++int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x0
++int style TextAppearance_Compat_Notification 0x0
++int style TextAppearance_Compat_Notification_Info 0x0
++int style TextAppearance_Compat_Notification_Line2 0x0
++int style TextAppearance_Compat_Notification_Time 0x0
++int style TextAppearance_Compat_Notification_Title 0x0
++int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x0
++int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x0
++int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x0
++int style Theme 0x0
++int style ThemeOverlay_AppCompat 0x0
++int style ThemeOverlay_AppCompat_ActionBar 0x0
++int style ThemeOverlay_AppCompat_Dark 0x0
++int style ThemeOverlay_AppCompat_Dark_ActionBar 0x0
++int style ThemeOverlay_AppCompat_DayNight 0x0
++int style ThemeOverlay_AppCompat_DayNight_ActionBar 0x0
++int style ThemeOverlay_AppCompat_Dialog 0x0
++int style ThemeOverlay_AppCompat_Dialog_Alert 0x0
++int style ThemeOverlay_AppCompat_Light 0x0
++int style Theme_AppCompat 0x0
++int style Theme_AppCompat_CompactMenu 0x0
++int style Theme_AppCompat_DayNight 0x0
++int style Theme_AppCompat_DayNight_DarkActionBar 0x0
++int style Theme_AppCompat_DayNight_Dialog 0x0
++int style Theme_AppCompat_DayNight_DialogWhenLarge 0x0
++int style Theme_AppCompat_DayNight_Dialog_Alert 0x0
++int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x0
++int style Theme_AppCompat_DayNight_NoActionBar 0x0
++int style Theme_AppCompat_Dialog 0x0
++int style Theme_AppCompat_DialogWhenLarge 0x0
++int style Theme_AppCompat_Dialog_Alert 0x0
++int style Theme_AppCompat_Dialog_MinWidth 0x0
++int style Theme_AppCompat_Empty 0x0
++int style Theme_AppCompat_Light 0x0
++int style Theme_AppCompat_Light_DarkActionBar 0x0
++int style Theme_AppCompat_Light_Dialog 0x0
++int style Theme_AppCompat_Light_DialogWhenLarge 0x0
++int style Theme_AppCompat_Light_Dialog_Alert 0x0
++int style Theme_AppCompat_Light_Dialog_MinWidth 0x0
++int style Theme_AppCompat_Light_NoActionBar 0x0
++int style Theme_AppCompat_NoActionBar 0x0
++int style Theme_AutofillInlineSuggestion 0x0
++int style Theme_Catalyst 0x0
++int style Theme_Catalyst_LogBox 0x0
++int style Theme_Catalyst_RedBox 0x0
++int style Theme_FullScreenDialog 0x0
++int style Theme_FullScreenDialogAnimatedFade 0x0
++int style Theme_FullScreenDialogAnimatedSlide 0x0
++int style Theme_ReactNative_AppCompat_Light 0x0
++int style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen 0x0
++int style Widget_AppCompat_ActionBar 0x0
++int style Widget_AppCompat_ActionBar_Solid 0x0
++int style Widget_AppCompat_ActionBar_TabBar 0x0
++int style Widget_AppCompat_ActionBar_TabText 0x0
++int style Widget_AppCompat_ActionBar_TabView 0x0
++int style Widget_AppCompat_ActionButton 0x0
++int style Widget_AppCompat_ActionButton_CloseMode 0x0
++int style Widget_AppCompat_ActionButton_Overflow 0x0
++int style Widget_AppCompat_ActionMode 0x0
++int style Widget_AppCompat_ActivityChooserView 0x0
++int style Widget_AppCompat_AutoCompleteTextView 0x0
++int style Widget_AppCompat_Button 0x0
++int style Widget_AppCompat_ButtonBar 0x0
++int style Widget_AppCompat_ButtonBar_AlertDialog 0x0
++int style Widget_AppCompat_Button_Borderless 0x0
++int style Widget_AppCompat_Button_Borderless_Colored 0x0
++int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x0
++int style Widget_AppCompat_Button_Colored 0x0
++int style Widget_AppCompat_Button_Small 0x0
++int style Widget_AppCompat_CompoundButton_CheckBox 0x0
++int style Widget_AppCompat_CompoundButton_RadioButton 0x0
++int style Widget_AppCompat_CompoundButton_Switch 0x0
++int style Widget_AppCompat_DrawerArrowToggle 0x0
++int style Widget_AppCompat_DropDownItem_Spinner 0x0
++int style Widget_AppCompat_EditText 0x0
++int style Widget_AppCompat_ImageButton 0x0
++int style Widget_AppCompat_Light_ActionBar 0x0
++int style Widget_AppCompat_Light_ActionBar_Solid 0x0
++int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x0
++int style Widget_AppCompat_Light_ActionBar_TabBar 0x0
++int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x0
++int style Widget_AppCompat_Light_ActionBar_TabText 0x0
++int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x0
++int style Widget_AppCompat_Light_ActionBar_TabView 0x0
++int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x0
++int style Widget_AppCompat_Light_ActionButton 0x0
++int style Widget_AppCompat_Light_ActionButton_CloseMode 0x0
++int style Widget_AppCompat_Light_ActionButton_Overflow 0x0
++int style Widget_AppCompat_Light_ActionMode_Inverse 0x0
++int style Widget_AppCompat_Light_ActivityChooserView 0x0
++int style Widget_AppCompat_Light_AutoCompleteTextView 0x0
++int style Widget_AppCompat_Light_DropDownItem_Spinner 0x0
++int style Widget_AppCompat_Light_ListPopupWindow 0x0
++int style Widget_AppCompat_Light_ListView_DropDown 0x0
++int style Widget_AppCompat_Light_PopupMenu 0x0
++int style Widget_AppCompat_Light_PopupMenu_Overflow 0x0
++int style Widget_AppCompat_Light_SearchView 0x0
++int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x0
++int style Widget_AppCompat_ListMenuView 0x0
++int style Widget_AppCompat_ListPopupWindow 0x0
++int style Widget_AppCompat_ListView 0x0
++int style Widget_AppCompat_ListView_DropDown 0x0
++int style Widget_AppCompat_ListView_Menu 0x0
++int style Widget_AppCompat_PopupMenu 0x0
++int style Widget_AppCompat_PopupMenu_Overflow 0x0
++int style Widget_AppCompat_PopupWindow 0x0
++int style Widget_AppCompat_ProgressBar 0x0
++int style Widget_AppCompat_ProgressBar_Horizontal 0x0
++int style Widget_AppCompat_RatingBar 0x0
++int style Widget_AppCompat_RatingBar_Indicator 0x0
++int style Widget_AppCompat_RatingBar_Small 0x0
++int style Widget_AppCompat_SearchView 0x0
++int style Widget_AppCompat_SearchView_ActionBar 0x0
++int style Widget_AppCompat_SeekBar 0x0
++int style Widget_AppCompat_SeekBar_Discrete 0x0
++int style Widget_AppCompat_Spinner 0x0
++int style Widget_AppCompat_Spinner_DropDown 0x0
++int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x0
++int style Widget_AppCompat_Spinner_Underlined 0x0
++int style Widget_AppCompat_TextView 0x0
++int style Widget_AppCompat_TextView_SpinnerItem 0x0
++int style Widget_AppCompat_Toolbar 0x0
++int style Widget_AppCompat_Toolbar_Button_Navigation 0x0
++int style Widget_Autofill 0x0
++int style Widget_Autofill_InlineSuggestionChip 0x0
++int style Widget_Autofill_InlineSuggestionEndIconStyle 0x0
++int style Widget_Autofill_InlineSuggestionStartIconStyle 0x0
++int style Widget_Autofill_InlineSuggestionSubtitle 0x0
++int style Widget_Autofill_InlineSuggestionTitle 0x0
++int style Widget_Compat_NotificationActionContainer 0x0
++int style Widget_Compat_NotificationActionText 0x0
++int style redboxButton 0x0
++int[] styleable ActionBar { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable ActionBar_background 0
++int styleable ActionBar_backgroundSplit 1
++int styleable ActionBar_backgroundStacked 2
++int styleable ActionBar_contentInsetEnd 3
++int styleable ActionBar_contentInsetEndWithActions 4
++int styleable ActionBar_contentInsetLeft 5
++int styleable ActionBar_contentInsetRight 6
++int styleable ActionBar_contentInsetStart 7
++int styleable ActionBar_contentInsetStartWithNavigation 8
++int styleable ActionBar_customNavigationLayout 9
++int styleable ActionBar_displayOptions 10
++int styleable ActionBar_divider 11
++int styleable ActionBar_elevation 12
++int styleable ActionBar_height 13
++int styleable ActionBar_hideOnContentScroll 14
++int styleable ActionBar_homeAsUpIndicator 15
++int styleable ActionBar_homeLayout 16
++int styleable ActionBar_icon 17
++int styleable ActionBar_indeterminateProgressStyle 18
++int styleable ActionBar_itemPadding 19
++int styleable ActionBar_logo 20
++int styleable ActionBar_navigationMode 21
++int styleable ActionBar_popupTheme 22
++int styleable ActionBar_progressBarPadding 23
++int styleable ActionBar_progressBarStyle 24
++int styleable ActionBar_subtitle 25
++int styleable ActionBar_subtitleTextStyle 26
++int styleable ActionBar_title 27
++int styleable ActionBar_titleTextStyle 28
++int[] styleable ActionBarLayout { 0x10100b3 }
++int styleable ActionBarLayout_android_layout_gravity 0
++int[] styleable ActionMenuItemView { 0x101013f }
++int styleable ActionMenuItemView_android_minWidth 0
++int[] styleable ActionMenuView { }
++int[] styleable ActionMode { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable ActionMode_background 0
++int styleable ActionMode_backgroundSplit 1
++int styleable ActionMode_closeItemLayout 2
++int styleable ActionMode_height 3
++int styleable ActionMode_subtitleTextStyle 4
++int styleable ActionMode_titleTextStyle 5
++int[] styleable ActivityChooserView { 0x0, 0x0 }
++int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0
++int styleable ActivityChooserView_initialActivityCount 1
++int[] styleable AlertDialog { 0x10100f2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable AlertDialog_android_layout 0
++int styleable AlertDialog_buttonIconDimen 1
++int styleable AlertDialog_buttonPanelSideLayout 2
++int styleable AlertDialog_listItemLayout 3
++int styleable AlertDialog_listLayout 4
++int styleable AlertDialog_multiChoiceItemLayout 5
++int styleable AlertDialog_showTitle 6
++int styleable AlertDialog_singleChoiceItemLayout 7
++int[] styleable AnimatedStateListDrawableCompat { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 }
++int styleable AnimatedStateListDrawableCompat_android_constantSize 0
++int styleable AnimatedStateListDrawableCompat_android_dither 1
++int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 2
++int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 3
++int styleable AnimatedStateListDrawableCompat_android_variablePadding 4
++int styleable AnimatedStateListDrawableCompat_android_visible 5
++int[] styleable AnimatedStateListDrawableItem { 0x1010199, 0x10100d0 }
++int styleable AnimatedStateListDrawableItem_android_drawable 0
++int styleable AnimatedStateListDrawableItem_android_id 1
++int[] styleable AnimatedStateListDrawableTransition { 0x1010199, 0x101044a, 0x101044b, 0x1010449 }
++int styleable AnimatedStateListDrawableTransition_android_drawable 0
++int styleable AnimatedStateListDrawableTransition_android_fromId 1
++int styleable AnimatedStateListDrawableTransition_android_reversible 2
++int styleable AnimatedStateListDrawableTransition_android_toId 3
++int[] styleable AppCompatEmojiHelper { }
++int[] styleable AppCompatImageView { 0x1010119, 0x0, 0x0, 0x0 }
++int styleable AppCompatImageView_android_src 0
++int styleable AppCompatImageView_srcCompat 1
++int styleable AppCompatImageView_tint 2
++int styleable AppCompatImageView_tintMode 3
++int[] styleable AppCompatSeekBar { 0x1010142, 0x0, 0x0, 0x0 }
++int styleable AppCompatSeekBar_android_thumb 0
++int styleable AppCompatSeekBar_tickMark 1
++int styleable AppCompatSeekBar_tickMarkTint 2
++int styleable AppCompatSeekBar_tickMarkTintMode 3
++int[] styleable AppCompatTextHelper { 0x101016e, 0x1010393, 0x101016f, 0x1010170, 0x1010392, 0x101016d, 0x1010034 }
++int styleable AppCompatTextHelper_android_drawableBottom 0
++int styleable AppCompatTextHelper_android_drawableEnd 1
++int styleable AppCompatTextHelper_android_drawableLeft 2
++int styleable AppCompatTextHelper_android_drawableRight 3
++int styleable AppCompatTextHelper_android_drawableStart 4
++int styleable AppCompatTextHelper_android_drawableTop 5
++int styleable AppCompatTextHelper_android_textAppearance 6
++int[] styleable AppCompatTextView { 0x1010034, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable AppCompatTextView_android_textAppearance 0
++int styleable AppCompatTextView_autoSizeMaxTextSize 1
++int styleable AppCompatTextView_autoSizeMinTextSize 2
++int styleable AppCompatTextView_autoSizePresetSizes 3
++int styleable AppCompatTextView_autoSizeStepGranularity 4
++int styleable AppCompatTextView_autoSizeTextType 5
++int styleable AppCompatTextView_drawableBottomCompat 6
++int styleable AppCompatTextView_drawableEndCompat 7
++int styleable AppCompatTextView_drawableLeftCompat 8
++int styleable AppCompatTextView_drawableRightCompat 9
++int styleable AppCompatTextView_drawableStartCompat 10
++int styleable AppCompatTextView_drawableTint 11
++int styleable AppCompatTextView_drawableTintMode 12
++int styleable AppCompatTextView_drawableTopCompat 13
++int styleable AppCompatTextView_emojiCompatEnabled 14
++int styleable AppCompatTextView_firstBaselineToTopHeight 15
++int styleable AppCompatTextView_fontFamily 16
++int styleable AppCompatTextView_fontVariationSettings 17
++int styleable AppCompatTextView_lastBaselineToBottomHeight 18
++int styleable AppCompatTextView_lineHeight 19
++int styleable AppCompatTextView_textAllCaps 20
++int styleable AppCompatTextView_textLocale 21
++int[] styleable AppCompatTheme { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10100ae, 0x1010057, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable AppCompatTheme_actionBarDivider 0
++int styleable AppCompatTheme_actionBarItemBackground 1
++int styleable AppCompatTheme_actionBarPopupTheme 2
++int styleable AppCompatTheme_actionBarSize 3
++int styleable AppCompatTheme_actionBarSplitStyle 4
++int styleable AppCompatTheme_actionBarStyle 5
++int styleable AppCompatTheme_actionBarTabBarStyle 6
++int styleable AppCompatTheme_actionBarTabStyle 7
++int styleable AppCompatTheme_actionBarTabTextStyle 8
++int styleable AppCompatTheme_actionBarTheme 9
++int styleable AppCompatTheme_actionBarWidgetTheme 10
++int styleable AppCompatTheme_actionButtonStyle 11
++int styleable AppCompatTheme_actionDropDownStyle 12
++int styleable AppCompatTheme_actionMenuTextAppearance 13
++int styleable AppCompatTheme_actionMenuTextColor 14
++int styleable AppCompatTheme_actionModeBackground 15
++int styleable AppCompatTheme_actionModeCloseButtonStyle 16
++int styleable AppCompatTheme_actionModeCloseContentDescription 17
++int styleable AppCompatTheme_actionModeCloseDrawable 18
++int styleable AppCompatTheme_actionModeCopyDrawable 19
++int styleable AppCompatTheme_actionModeCutDrawable 20
++int styleable AppCompatTheme_actionModeFindDrawable 21
++int styleable AppCompatTheme_actionModePasteDrawable 22
++int styleable AppCompatTheme_actionModePopupWindowStyle 23
++int styleable AppCompatTheme_actionModeSelectAllDrawable 24
++int styleable AppCompatTheme_actionModeShareDrawable 25
++int styleable AppCompatTheme_actionModeSplitBackground 26
++int styleable AppCompatTheme_actionModeStyle 27
++int styleable AppCompatTheme_actionModeTheme 28
++int styleable AppCompatTheme_actionModeWebSearchDrawable 29
++int styleable AppCompatTheme_actionOverflowButtonStyle 30
++int styleable AppCompatTheme_actionOverflowMenuStyle 31
++int styleable AppCompatTheme_activityChooserViewStyle 32
++int styleable AppCompatTheme_alertDialogButtonGroupStyle 33
++int styleable AppCompatTheme_alertDialogCenterButtons 34
++int styleable AppCompatTheme_alertDialogStyle 35
++int styleable AppCompatTheme_alertDialogTheme 36
++int styleable AppCompatTheme_android_windowAnimationStyle 37
++int styleable AppCompatTheme_android_windowIsFloating 38
++int styleable AppCompatTheme_autoCompleteTextViewStyle 39
++int styleable AppCompatTheme_borderlessButtonStyle 40
++int styleable AppCompatTheme_buttonBarButtonStyle 41
++int styleable AppCompatTheme_buttonBarNegativeButtonStyle 42
++int styleable AppCompatTheme_buttonBarNeutralButtonStyle 43
++int styleable AppCompatTheme_buttonBarPositiveButtonStyle 44
++int styleable AppCompatTheme_buttonBarStyle 45
++int styleable AppCompatTheme_buttonStyle 46
++int styleable AppCompatTheme_buttonStyleSmall 47
++int styleable AppCompatTheme_checkboxStyle 48
++int styleable AppCompatTheme_checkedTextViewStyle 49
++int styleable AppCompatTheme_colorAccent 50
++int styleable AppCompatTheme_colorBackgroundFloating 51
++int styleable AppCompatTheme_colorButtonNormal 52
++int styleable AppCompatTheme_colorControlActivated 53
++int styleable AppCompatTheme_colorControlHighlight 54
++int styleable AppCompatTheme_colorControlNormal 55
++int styleable AppCompatTheme_colorError 56
++int styleable AppCompatTheme_colorPrimary 57
++int styleable AppCompatTheme_colorPrimaryDark 58
++int styleable AppCompatTheme_colorSwitchThumbNormal 59
++int styleable AppCompatTheme_controlBackground 60
++int styleable AppCompatTheme_dialogCornerRadius 61
++int styleable AppCompatTheme_dialogPreferredPadding 62
++int styleable AppCompatTheme_dialogTheme 63
++int styleable AppCompatTheme_dividerHorizontal 64
++int styleable AppCompatTheme_dividerVertical 65
++int styleable AppCompatTheme_dropDownListViewStyle 66
++int styleable AppCompatTheme_dropdownListPreferredItemHeight 67
++int styleable AppCompatTheme_editTextBackground 68
++int styleable AppCompatTheme_editTextColor 69
++int styleable AppCompatTheme_editTextStyle 70
++int styleable AppCompatTheme_homeAsUpIndicator 71
++int styleable AppCompatTheme_imageButtonStyle 72
++int styleable AppCompatTheme_listChoiceBackgroundIndicator 73
++int styleable AppCompatTheme_listChoiceIndicatorMultipleAnimated 74
++int styleable AppCompatTheme_listChoiceIndicatorSingleAnimated 75
++int styleable AppCompatTheme_listDividerAlertDialog 76
++int styleable AppCompatTheme_listMenuViewStyle 77
++int styleable AppCompatTheme_listPopupWindowStyle 78
++int styleable AppCompatTheme_listPreferredItemHeight 79
++int styleable AppCompatTheme_listPreferredItemHeightLarge 80
++int styleable AppCompatTheme_listPreferredItemHeightSmall 81
++int styleable AppCompatTheme_listPreferredItemPaddingEnd 82
++int styleable AppCompatTheme_listPreferredItemPaddingLeft 83
++int styleable AppCompatTheme_listPreferredItemPaddingRight 84
++int styleable AppCompatTheme_listPreferredItemPaddingStart 85
++int styleable AppCompatTheme_panelBackground 86
++int styleable AppCompatTheme_panelMenuListTheme 87
++int styleable AppCompatTheme_panelMenuListWidth 88
++int styleable AppCompatTheme_popupMenuStyle 89
++int styleable AppCompatTheme_popupWindowStyle 90
++int styleable AppCompatTheme_radioButtonStyle 91
++int styleable AppCompatTheme_ratingBarStyle 92
++int styleable AppCompatTheme_ratingBarStyleIndicator 93
++int styleable AppCompatTheme_ratingBarStyleSmall 94
++int styleable AppCompatTheme_searchViewStyle 95
++int styleable AppCompatTheme_seekBarStyle 96
++int styleable AppCompatTheme_selectableItemBackground 97
++int styleable AppCompatTheme_selectableItemBackgroundBorderless 98
++int styleable AppCompatTheme_spinnerDropDownItemStyle 99
++int styleable AppCompatTheme_spinnerStyle 100
++int styleable AppCompatTheme_switchStyle 101
++int styleable AppCompatTheme_textAppearanceLargePopupMenu 102
++int styleable AppCompatTheme_textAppearanceListItem 103
++int styleable AppCompatTheme_textAppearanceListItemSecondary 104
++int styleable AppCompatTheme_textAppearanceListItemSmall 105
++int styleable AppCompatTheme_textAppearancePopupMenuHeader 106
++int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 107
++int styleable AppCompatTheme_textAppearanceSearchResultTitle 108
++int styleable AppCompatTheme_textAppearanceSmallPopupMenu 109
++int styleable AppCompatTheme_textColorAlertDialogListItem 110
++int styleable AppCompatTheme_textColorSearchUrl 111
++int styleable AppCompatTheme_toolbarNavigationButtonStyle 112
++int styleable AppCompatTheme_toolbarStyle 113
++int styleable AppCompatTheme_tooltipForegroundColor 114
++int styleable AppCompatTheme_tooltipFrameBackground 115
++int styleable AppCompatTheme_viewInflaterClass 116
++int styleable AppCompatTheme_windowActionBar 117
++int styleable AppCompatTheme_windowActionBarOverlay 118
++int styleable AppCompatTheme_windowActionModeOverlay 119
++int styleable AppCompatTheme_windowFixedHeightMajor 120
++int styleable AppCompatTheme_windowFixedHeightMinor 121
++int styleable AppCompatTheme_windowFixedWidthMajor 122
++int styleable AppCompatTheme_windowFixedWidthMinor 123
++int styleable AppCompatTheme_windowMinWidthMajor 124
++int styleable AppCompatTheme_windowMinWidthMinor 125
++int styleable AppCompatTheme_windowNoTitle 126
++int[] styleable Autofill_InlineSuggestion { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable Autofill_InlineSuggestion_autofillInlineSuggestionChip 0
++int styleable Autofill_InlineSuggestion_autofillInlineSuggestionEndIconStyle 1
++int styleable Autofill_InlineSuggestion_autofillInlineSuggestionStartIconStyle 2
++int styleable Autofill_InlineSuggestion_autofillInlineSuggestionSubtitle 3
++int styleable Autofill_InlineSuggestion_autofillInlineSuggestionTitle 4
++int styleable Autofill_InlineSuggestion_isAutofillInlineSuggestionTheme 5
++int[] styleable ButtonBarLayout { 0x0 }
++int styleable ButtonBarLayout_allowStacking 0
++int[] styleable Capability { 0x0, 0x0 }
++int styleable Capability_queryPatterns 0
++int styleable Capability_shortcutMatchRequired 1
++int[] styleable CheckedTextView { 0x1010108, 0x0, 0x0, 0x0 }
++int styleable CheckedTextView_android_checkMark 0
++int styleable CheckedTextView_checkMarkCompat 1
++int styleable CheckedTextView_checkMarkTint 2
++int styleable CheckedTextView_checkMarkTintMode 3
++int[] styleable ColorStateListItem { 0x0, 0x101031f, 0x10101a5, 0x1010647, 0x0 }
++int styleable ColorStateListItem_alpha 0
++int styleable ColorStateListItem_android_alpha 1
++int styleable ColorStateListItem_android_color 2
++int styleable ColorStateListItem_android_lStar 3
++int styleable ColorStateListItem_lStar 4
++int[] styleable CompoundButton { 0x1010107, 0x0, 0x0, 0x0 }
++int styleable CompoundButton_android_button 0
++int styleable CompoundButton_buttonCompat 1
++int styleable CompoundButton_buttonTint 2
++int styleable CompoundButton_buttonTintMode 3
++int[] styleable DrawerArrowToggle { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable DrawerArrowToggle_arrowHeadLength 0
++int styleable DrawerArrowToggle_arrowShaftLength 1
++int styleable DrawerArrowToggle_barLength 2
++int styleable DrawerArrowToggle_color 3
++int styleable DrawerArrowToggle_drawableSize 4
++int styleable DrawerArrowToggle_gapBetweenBars 5
++int styleable DrawerArrowToggle_spinBars 6
++int styleable DrawerArrowToggle_thickness 7
++int[] styleable FontFamily { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable FontFamily_fontProviderAuthority 0
++int styleable FontFamily_fontProviderCerts 1
++int styleable FontFamily_fontProviderFetchStrategy 2
++int styleable FontFamily_fontProviderFetchTimeout 3
++int styleable FontFamily_fontProviderPackage 4
++int styleable FontFamily_fontProviderQuery 5
++int styleable FontFamily_fontProviderSystemFontFamily 6
++int[] styleable FontFamilyFont { 0x1010532, 0x101053f, 0x1010570, 0x1010533, 0x101056f, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable FontFamilyFont_android_font 0
++int styleable FontFamilyFont_android_fontStyle 1
++int styleable FontFamilyFont_android_fontVariationSettings 2
++int styleable FontFamilyFont_android_fontWeight 3
++int styleable FontFamilyFont_android_ttcIndex 4
++int styleable FontFamilyFont_font 5
++int styleable FontFamilyFont_fontStyle 6
++int styleable FontFamilyFont_fontVariationSettings 7
++int styleable FontFamilyFont_fontWeight 8
++int styleable FontFamilyFont_ttcIndex 9
++int[] styleable Fragment { 0x10100d0, 0x1010003, 0x10100d1 }
++int styleable Fragment_android_id 0
++int styleable Fragment_android_name 1
++int styleable Fragment_android_tag 2
++int[] styleable FragmentContainerView { 0x1010003, 0x10100d1 }
++int styleable FragmentContainerView_android_name 0
++int styleable FragmentContainerView_android_tag 1
++int[] styleable GenericDraweeHierarchy { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable GenericDraweeHierarchy_actualImageScaleType 0
++int styleable GenericDraweeHierarchy_backgroundImage 1
++int styleable GenericDraweeHierarchy_fadeDuration 2
++int styleable GenericDraweeHierarchy_failureImage 3
++int styleable GenericDraweeHierarchy_failureImageScaleType 4
++int styleable GenericDraweeHierarchy_overlayImage 5
++int styleable GenericDraweeHierarchy_placeholderImage 6
++int styleable GenericDraweeHierarchy_placeholderImageScaleType 7
++int styleable GenericDraweeHierarchy_pressedStateOverlayImage 8
++int styleable GenericDraweeHierarchy_progressBarAutoRotateInterval 9
++int styleable GenericDraweeHierarchy_progressBarImage 10
++int styleable GenericDraweeHierarchy_progressBarImageScaleType 11
++int styleable GenericDraweeHierarchy_retryImage 12
++int styleable GenericDraweeHierarchy_retryImageScaleType 13
++int styleable GenericDraweeHierarchy_roundAsCircle 14
++int styleable GenericDraweeHierarchy_roundBottomEnd 15
++int styleable GenericDraweeHierarchy_roundBottomLeft 16
++int styleable GenericDraweeHierarchy_roundBottomRight 17
++int styleable GenericDraweeHierarchy_roundBottomStart 18
++int styleable GenericDraweeHierarchy_roundTopEnd 19
++int styleable GenericDraweeHierarchy_roundTopLeft 20
++int styleable GenericDraweeHierarchy_roundTopRight 21
++int styleable GenericDraweeHierarchy_roundTopStart 22
++int styleable GenericDraweeHierarchy_roundWithOverlayColor 23
++int styleable GenericDraweeHierarchy_roundedCornerRadius 24
++int styleable GenericDraweeHierarchy_roundingBorderColor 25
++int styleable GenericDraweeHierarchy_roundingBorderPadding 26
++int styleable GenericDraweeHierarchy_roundingBorderWidth 27
++int styleable GenericDraweeHierarchy_viewAspectRatio 28
++int[] styleable GradientColor { 0x101020b, 0x10101a2, 0x10101a3, 0x101019e, 0x1010512, 0x1010513, 0x10101a4, 0x101019d, 0x1010510, 0x1010511, 0x1010201, 0x10101a1 }
++int styleable GradientColor_android_centerColor 0
++int styleable GradientColor_android_centerX 1
++int styleable GradientColor_android_centerY 2
++int styleable GradientColor_android_endColor 3
++int styleable GradientColor_android_endX 4
++int styleable GradientColor_android_endY 5
++int styleable GradientColor_android_gradientRadius 6
++int styleable GradientColor_android_startColor 7
++int styleable GradientColor_android_startX 8
++int styleable GradientColor_android_startY 9
++int styleable GradientColor_android_tileMode 10
++int styleable GradientColor_android_type 11
++int[] styleable GradientColorItem { 0x10101a5, 0x1010514 }
++int styleable GradientColorItem_android_color 0
++int styleable GradientColorItem_android_offset 1
++int[] styleable LinearLayoutCompat { 0x1010126, 0x1010127, 0x10100af, 0x10100c4, 0x1010128, 0x0, 0x0, 0x0, 0x0 }
++int styleable LinearLayoutCompat_android_baselineAligned 0
++int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 1
++int styleable LinearLayoutCompat_android_gravity 2
++int styleable LinearLayoutCompat_android_orientation 3
++int styleable LinearLayoutCompat_android_weightSum 4
++int styleable LinearLayoutCompat_divider 5
++int styleable LinearLayoutCompat_dividerPadding 6
++int styleable LinearLayoutCompat_measureWithLargestChild 7
++int styleable LinearLayoutCompat_showDividers 8
++int[] styleable LinearLayoutCompat_Layout { 0x10100b3, 0x10100f5, 0x1010181, 0x10100f4 }
++int styleable LinearLayoutCompat_Layout_android_layout_gravity 0
++int styleable LinearLayoutCompat_Layout_android_layout_height 1
++int styleable LinearLayoutCompat_Layout_android_layout_weight 2
++int styleable LinearLayoutCompat_Layout_android_layout_width 3
++int[] styleable ListPopupWindow { 0x10102ac, 0x10102ad }
++int styleable ListPopupWindow_android_dropDownHorizontalOffset 0
++int styleable ListPopupWindow_android_dropDownVerticalOffset 1
++int[] styleable MenuGroup { 0x10101e0, 0x101000e, 0x10100d0, 0x10101de, 0x10101df, 0x1010194 }
++int styleable MenuGroup_android_checkableBehavior 0
++int styleable MenuGroup_android_enabled 1
++int styleable MenuGroup_android_id 2
++int styleable MenuGroup_android_menuCategory 3
++int styleable MenuGroup_android_orderInCategory 4
++int styleable MenuGroup_android_visible 5
++int[] styleable MenuItem { 0x0, 0x0, 0x0, 0x0, 0x10101e3, 0x10101e5, 0x1010106, 0x101000e, 0x1010002, 0x10100d0, 0x10101de, 0x10101e4, 0x101026f, 0x10101df, 0x10101e1, 0x10101e2, 0x1010194, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable MenuItem_actionLayout 0
++int styleable MenuItem_actionProviderClass 1
++int styleable MenuItem_actionViewClass 2
++int styleable MenuItem_alphabeticModifiers 3
++int styleable MenuItem_android_alphabeticShortcut 4
++int styleable MenuItem_android_checkable 5
++int styleable MenuItem_android_checked 6
++int styleable MenuItem_android_enabled 7
++int styleable MenuItem_android_icon 8
++int styleable MenuItem_android_id 9
++int styleable MenuItem_android_menuCategory 10
++int styleable MenuItem_android_numericShortcut 11
++int styleable MenuItem_android_onClick 12
++int styleable MenuItem_android_orderInCategory 13
++int styleable MenuItem_android_title 14
++int styleable MenuItem_android_titleCondensed 15
++int styleable MenuItem_android_visible 16
++int styleable MenuItem_contentDescription 17
++int styleable MenuItem_iconTint 18
++int styleable MenuItem_iconTintMode 19
++int styleable MenuItem_numericModifiers 20
++int styleable MenuItem_showAsAction 21
++int styleable MenuItem_tooltipText 22
++int[] styleable MenuView { 0x101012f, 0x101012d, 0x1010130, 0x1010131, 0x101012c, 0x101012e, 0x10100ae, 0x0, 0x0 }
++int styleable MenuView_android_headerBackground 0
++int styleable MenuView_android_horizontalDivider 1
++int styleable MenuView_android_itemBackground 2
++int styleable MenuView_android_itemIconDisabledAlpha 3
++int styleable MenuView_android_itemTextAppearance 4
++int styleable MenuView_android_verticalDivider 5
++int styleable MenuView_android_windowAnimationStyle 6
++int styleable MenuView_preserveIconSpacing 7
++int styleable MenuView_subMenuArrow 8
++int[] styleable PopupWindow { 0x10102c9, 0x1010176, 0x0 }
++int styleable PopupWindow_android_popupAnimationStyle 0
++int styleable PopupWindow_android_popupBackground 1
++int styleable PopupWindow_overlapAnchor 2
++int[] styleable PopupWindowBackgroundState { 0x0 }
++int styleable PopupWindowBackgroundState_state_above_anchor 0
++int[] styleable RecycleListView { 0x0, 0x0 }
++int styleable RecycleListView_paddingBottomNoButtons 0
++int styleable RecycleListView_paddingTopNoTitle 1
++int[] styleable SearchView { 0x10100da, 0x1010264, 0x1010220, 0x101011f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable SearchView_android_focusable 0
++int styleable SearchView_android_imeOptions 1
++int styleable SearchView_android_inputType 2
++int styleable SearchView_android_maxWidth 3
++int styleable SearchView_closeIcon 4
++int styleable SearchView_commitIcon 5
++int styleable SearchView_defaultQueryHint 6
++int styleable SearchView_goIcon 7
++int styleable SearchView_iconifiedByDefault 8
++int styleable SearchView_layout 9
++int styleable SearchView_queryBackground 10
++int styleable SearchView_queryHint 11
++int styleable SearchView_searchHintIcon 12
++int styleable SearchView_searchIcon 13
++int styleable SearchView_submitBackground 14
++int styleable SearchView_suggestionRowLayout 15
++int styleable SearchView_voiceIcon 16
++int[] styleable SimpleDraweeView { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable SimpleDraweeView_actualImageResource 0
++int styleable SimpleDraweeView_actualImageScaleType 1
++int styleable SimpleDraweeView_actualImageUri 2
++int styleable SimpleDraweeView_backgroundImage 3
++int styleable SimpleDraweeView_fadeDuration 4
++int styleable SimpleDraweeView_failureImage 5
++int styleable SimpleDraweeView_failureImageScaleType 6
++int styleable SimpleDraweeView_overlayImage 7
++int styleable SimpleDraweeView_placeholderImage 8
++int styleable SimpleDraweeView_placeholderImageScaleType 9
++int styleable SimpleDraweeView_pressedStateOverlayImage 10
++int styleable SimpleDraweeView_progressBarAutoRotateInterval 11
++int styleable SimpleDraweeView_progressBarImage 12
++int styleable SimpleDraweeView_progressBarImageScaleType 13
++int styleable SimpleDraweeView_retryImage 14
++int styleable SimpleDraweeView_retryImageScaleType 15
++int styleable SimpleDraweeView_roundAsCircle 16
++int styleable SimpleDraweeView_roundBottomEnd 17
++int styleable SimpleDraweeView_roundBottomLeft 18
++int styleable SimpleDraweeView_roundBottomRight 19
++int styleable SimpleDraweeView_roundBottomStart 20
++int styleable SimpleDraweeView_roundTopEnd 21
++int styleable SimpleDraweeView_roundTopLeft 22
++int styleable SimpleDraweeView_roundTopRight 23
++int styleable SimpleDraweeView_roundTopStart 24
++int styleable SimpleDraweeView_roundWithOverlayColor 25
++int styleable SimpleDraweeView_roundedCornerRadius 26
++int styleable SimpleDraweeView_roundingBorderColor 27
++int styleable SimpleDraweeView_roundingBorderPadding 28
++int styleable SimpleDraweeView_roundingBorderWidth 29
++int styleable SimpleDraweeView_viewAspectRatio 30
++int[] styleable Spinner { 0x1010262, 0x10100b2, 0x1010176, 0x101017b, 0x0 }
++int styleable Spinner_android_dropDownWidth 0
++int styleable Spinner_android_entries 1
++int styleable Spinner_android_popupBackground 2
++int styleable Spinner_android_prompt 3
++int styleable Spinner_popupTheme 4
++int[] styleable StateListDrawable { 0x1010196, 0x101011c, 0x101030c, 0x101030d, 0x1010195, 0x1010194 }
++int styleable StateListDrawable_android_constantSize 0
++int styleable StateListDrawable_android_dither 1
++int styleable StateListDrawable_android_enterFadeDuration 2
++int styleable StateListDrawable_android_exitFadeDuration 3
++int styleable StateListDrawable_android_variablePadding 4
++int styleable StateListDrawable_android_visible 5
++int[] styleable StateListDrawableItem { 0x1010199 }
++int styleable StateListDrawableItem_android_drawable 0
++int[] styleable SwitchCompat { 0x1010125, 0x1010124, 0x1010142, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable SwitchCompat_android_textOff 0
++int styleable SwitchCompat_android_textOn 1
++int styleable SwitchCompat_android_thumb 2
++int styleable SwitchCompat_showText 3
++int styleable SwitchCompat_splitTrack 4
++int styleable SwitchCompat_switchMinWidth 5
++int styleable SwitchCompat_switchPadding 6
++int styleable SwitchCompat_switchTextAppearance 7
++int styleable SwitchCompat_thumbTextPadding 8
++int styleable SwitchCompat_thumbTint 9
++int styleable SwitchCompat_thumbTintMode 10
++int styleable SwitchCompat_track 11
++int styleable SwitchCompat_trackTint 12
++int styleable SwitchCompat_trackTintMode 13
++int[] styleable TextAppearance { 0x10103ac, 0x1010161, 0x1010162, 0x1010163, 0x1010164, 0x1010098, 0x101009a, 0x101009b, 0x1010585, 0x1010095, 0x1010097, 0x1010096, 0x0, 0x0, 0x0, 0x0 }
++int styleable TextAppearance_android_fontFamily 0
++int styleable TextAppearance_android_shadowColor 1
++int styleable TextAppearance_android_shadowDx 2
++int styleable TextAppearance_android_shadowDy 3
++int styleable TextAppearance_android_shadowRadius 4
++int styleable TextAppearance_android_textColor 5
++int styleable TextAppearance_android_textColorHint 6
++int styleable TextAppearance_android_textColorLink 7
++int styleable TextAppearance_android_textFontWeight 8
++int styleable TextAppearance_android_textSize 9
++int styleable TextAppearance_android_textStyle 10
++int styleable TextAppearance_android_typeface 11
++int styleable TextAppearance_fontFamily 12
++int styleable TextAppearance_fontVariationSettings 13
++int styleable TextAppearance_textAllCaps 14
++int styleable TextAppearance_textLocale 15
++int[] styleable Toolbar { 0x10100af, 0x1010140, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
++int styleable Toolbar_android_gravity 0
++int styleable Toolbar_android_minHeight 1
++int styleable Toolbar_buttonGravity 2
++int styleable Toolbar_collapseContentDescription 3
++int styleable Toolbar_collapseIcon 4
++int styleable Toolbar_contentInsetEnd 5
++int styleable Toolbar_contentInsetEndWithActions 6
++int styleable Toolbar_contentInsetLeft 7
++int styleable Toolbar_contentInsetRight 8
++int styleable Toolbar_contentInsetStart 9
++int styleable Toolbar_contentInsetStartWithNavigation 10
++int styleable Toolbar_logo 11
++int styleable Toolbar_logoDescription 12
++int styleable Toolbar_maxButtonHeight 13
++int styleable Toolbar_menu 14
++int styleable Toolbar_navigationContentDescription 15
++int styleable Toolbar_navigationIcon 16
++int styleable Toolbar_popupTheme 17
++int styleable Toolbar_subtitle 18
++int styleable Toolbar_subtitleTextAppearance 19
++int styleable Toolbar_subtitleTextColor 20
++int styleable Toolbar_title 21
++int styleable Toolbar_titleMargin 22
++int styleable Toolbar_titleMarginBottom 23
++int styleable Toolbar_titleMarginEnd 24
++int styleable Toolbar_titleMarginStart 25
++int styleable Toolbar_titleMarginTop 26
++int styleable Toolbar_titleMargins 27
++int styleable Toolbar_titleTextAppearance 28
++int styleable Toolbar_titleTextColor 29
++int[] styleable View { 0x10100da, 0x1010000, 0x0, 0x0, 0x0 }
++int styleable View_android_focusable 0
++int styleable View_android_theme 1
++int styleable View_paddingEnd 2
++int styleable View_paddingStart 3
++int styleable View_theme 4
++int[] styleable ViewBackgroundHelper { 0x10100d4, 0x0, 0x0 }
++int styleable ViewBackgroundHelper_android_background 0
++int styleable ViewBackgroundHelper_backgroundTint 1
++int styleable ViewBackgroundHelper_backgroundTintMode 2
++int[] styleable ViewStubCompat { 0x10100d0, 0x10100f3, 0x10100f2 }
++int styleable ViewStubCompat_android_id 0
++int styleable ViewStubCompat_android_inflatedId 1
++int styleable ViewStubCompat_android_layout 2
++int xml rn_dev_preferences 0x0
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
+new file mode 100644
+index 0000000..f7e4a42
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
+@@ -0,0 +1 @@
++#Wed Sep 18 16:19:49 PDT 2024
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
+new file mode 100644
+index 0000000..b752fca
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
+@@ -0,0 +1,2 @@
++
++
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
+new file mode 100644
+index 0000000..0cc45aa
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
+@@ -0,0 +1,2 @@
++
++
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
+new file mode 100644
+index 0000000..fd2e8f3
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
+@@ -0,0 +1,2 @@
++
++
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/packageDebugAssets/merger.xml b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/packageDebugAssets/merger.xml
+new file mode 100644
+index 0000000..fd76591
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/incremental/packageDebugAssets/merger.xml
+@@ -0,0 +1,2 @@
++
++
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/BuildConfig.class b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/BuildConfig.class
+new file mode 100644
+index 0000000..2effa67
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/BuildConfig.class differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule$1.class b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule$1.class
+new file mode 100644
+index 0000000..63bbfd5
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule$1.class differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule$PowerSavingBroadcastReceiver.class b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule$PowerSavingBroadcastReceiver.class
+new file mode 100644
+index 0000000..af659a0
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule$PowerSavingBroadcastReceiver.class differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule.class b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule.class
+new file mode 100644
+index 0000000..0dd7821
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModeModule.class differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModePackage.class b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModePackage.class
+new file mode 100644
+index 0000000..7d77409
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/javac/debug/classes/io/powerSavingMode/RNPowerSavingModePackage.class differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/local_only_symbol_list/debug/R-def.txt b/node_modules/react-native-power-saving-mode/android/build/intermediates/local_only_symbol_list/debug/R-def.txt
+new file mode 100644
+index 0000000..78ac5b8
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/local_only_symbol_list/debug/R-def.txt
+@@ -0,0 +1,2 @@
++R_DEF: Internal format may change without notice
++local
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt b/node_modules/react-native-power-saving-mode/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt
+new file mode 100644
+index 0000000..57617e5
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt
+@@ -0,0 +1,8 @@
++1
++2
++4
++5
++5-->/home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++6
++7
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml b/node_modules/react-native-power-saving-mode/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml
+new file mode 100644
+index 0000000..e127624
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml
+@@ -0,0 +1,7 @@
++
++
++
++
++
++
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/navigation_json/debug/navigation.json b/node_modules/react-native-power-saving-mode/android/build/intermediates/navigation_json/debug/navigation.json
+new file mode 100644
+index 0000000..0637a08
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/navigation_json/debug/navigation.json
+@@ -0,0 +1 @@
++[]
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/packaged_manifests/debug/output-metadata.json b/node_modules/react-native-power-saving-mode/android/build/intermediates/packaged_manifests/debug/output-metadata.json
+new file mode 100644
+index 0000000..a195b65
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/packaged_manifests/debug/output-metadata.json
+@@ -0,0 +1,18 @@
++{
++ "version": 3,
++ "artifactType": {
++ "type": "PACKAGED_MANIFESTS",
++ "kind": "Directory"
++ },
++ "applicationId": "io.powerSavingMode",
++ "variantName": "debug",
++ "elements": [
++ {
++ "type": "SINGLE",
++ "filters": [],
++ "attributes": [],
++ "outputFile": "../../merged_manifest/debug/AndroidManifest.xml"
++ }
++ ],
++ "elementType": "File"
++}
+\ No newline at end of file
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar b/node_modules/react-native-power-saving-mode/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar
+new file mode 100644
+index 0000000..c61c61c
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar differ
+diff --git a/node_modules/react-native-power-saving-mode/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt b/node_modules/react-native-power-saving-mode/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt
+new file mode 100644
+index 0000000..e6ffb85
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt
+@@ -0,0 +1,1446 @@
++io.powerSavingMode
++anim abc_fade_in
++anim abc_fade_out
++anim abc_grow_fade_in_from_bottom
++anim abc_popup_enter
++anim abc_popup_exit
++anim abc_shrink_fade_out_from_bottom
++anim abc_slide_in_bottom
++anim abc_slide_in_top
++anim abc_slide_out_bottom
++anim abc_slide_out_top
++anim abc_tooltip_enter
++anim abc_tooltip_exit
++anim btn_checkbox_to_checked_box_inner_merged_animation
++anim btn_checkbox_to_checked_box_outer_merged_animation
++anim btn_checkbox_to_checked_icon_null_animation
++anim btn_checkbox_to_unchecked_box_inner_merged_animation
++anim btn_checkbox_to_unchecked_check_path_merged_animation
++anim btn_checkbox_to_unchecked_icon_null_animation
++anim btn_radio_to_off_mtrl_dot_group_animation
++anim btn_radio_to_off_mtrl_ring_outer_animation
++anim btn_radio_to_off_mtrl_ring_outer_path_animation
++anim btn_radio_to_on_mtrl_dot_group_animation
++anim btn_radio_to_on_mtrl_ring_outer_animation
++anim btn_radio_to_on_mtrl_ring_outer_path_animation
++anim catalyst_fade_in
++anim catalyst_fade_out
++anim catalyst_push_up_in
++anim catalyst_push_up_out
++anim catalyst_slide_down
++anim catalyst_slide_up
++anim fragment_fast_out_extra_slow_in
++animator fragment_close_enter
++animator fragment_close_exit
++animator fragment_fade_enter
++animator fragment_fade_exit
++animator fragment_open_enter
++animator fragment_open_exit
++attr actionBarDivider
++attr actionBarItemBackground
++attr actionBarPopupTheme
++attr actionBarSize
++attr actionBarSplitStyle
++attr actionBarStyle
++attr actionBarTabBarStyle
++attr actionBarTabStyle
++attr actionBarTabTextStyle
++attr actionBarTheme
++attr actionBarWidgetTheme
++attr actionButtonStyle
++attr actionDropDownStyle
++attr actionLayout
++attr actionMenuTextAppearance
++attr actionMenuTextColor
++attr actionModeBackground
++attr actionModeCloseButtonStyle
++attr actionModeCloseContentDescription
++attr actionModeCloseDrawable
++attr actionModeCopyDrawable
++attr actionModeCutDrawable
++attr actionModeFindDrawable
++attr actionModePasteDrawable
++attr actionModePopupWindowStyle
++attr actionModeSelectAllDrawable
++attr actionModeShareDrawable
++attr actionModeSplitBackground
++attr actionModeStyle
++attr actionModeTheme
++attr actionModeWebSearchDrawable
++attr actionOverflowButtonStyle
++attr actionOverflowMenuStyle
++attr actionProviderClass
++attr actionViewClass
++attr activityChooserViewStyle
++attr actualImageResource
++attr actualImageScaleType
++attr actualImageUri
++attr alertDialogButtonGroupStyle
++attr alertDialogCenterButtons
++attr alertDialogStyle
++attr alertDialogTheme
++attr allowStacking
++attr alpha
++attr alphabeticModifiers
++attr arrowHeadLength
++attr arrowShaftLength
++attr autoCompleteTextViewStyle
++attr autoSizeMaxTextSize
++attr autoSizeMinTextSize
++attr autoSizePresetSizes
++attr autoSizeStepGranularity
++attr autoSizeTextType
++attr autofillInlineSuggestionChip
++attr autofillInlineSuggestionEndIconStyle
++attr autofillInlineSuggestionStartIconStyle
++attr autofillInlineSuggestionSubtitle
++attr autofillInlineSuggestionTitle
++attr background
++attr backgroundImage
++attr backgroundSplit
++attr backgroundStacked
++attr backgroundTint
++attr backgroundTintMode
++attr barLength
++attr borderlessButtonStyle
++attr buttonBarButtonStyle
++attr buttonBarNegativeButtonStyle
++attr buttonBarNeutralButtonStyle
++attr buttonBarPositiveButtonStyle
++attr buttonBarStyle
++attr buttonCompat
++attr buttonGravity
++attr buttonIconDimen
++attr buttonPanelSideLayout
++attr buttonStyle
++attr buttonStyleSmall
++attr buttonTint
++attr buttonTintMode
++attr checkMarkCompat
++attr checkMarkTint
++attr checkMarkTintMode
++attr checkboxStyle
++attr checkedTextViewStyle
++attr closeIcon
++attr closeItemLayout
++attr collapseContentDescription
++attr collapseIcon
++attr color
++attr colorAccent
++attr colorBackgroundFloating
++attr colorButtonNormal
++attr colorControlActivated
++attr colorControlHighlight
++attr colorControlNormal
++attr colorError
++attr colorPrimary
++attr colorPrimaryDark
++attr colorSwitchThumbNormal
++attr commitIcon
++attr contentDescription
++attr contentInsetEnd
++attr contentInsetEndWithActions
++attr contentInsetLeft
++attr contentInsetRight
++attr contentInsetStart
++attr contentInsetStartWithNavigation
++attr controlBackground
++attr customNavigationLayout
++attr defaultQueryHint
++attr dialogCornerRadius
++attr dialogPreferredPadding
++attr dialogTheme
++attr displayOptions
++attr divider
++attr dividerHorizontal
++attr dividerPadding
++attr dividerVertical
++attr drawableBottomCompat
++attr drawableEndCompat
++attr drawableLeftCompat
++attr drawableRightCompat
++attr drawableSize
++attr drawableStartCompat
++attr drawableTint
++attr drawableTintMode
++attr drawableTopCompat
++attr drawerArrowStyle
++attr dropDownListViewStyle
++attr dropdownListPreferredItemHeight
++attr editTextBackground
++attr editTextColor
++attr editTextStyle
++attr elevation
++attr emojiCompatEnabled
++attr expandActivityOverflowButtonDrawable
++attr fadeDuration
++attr failureImage
++attr failureImageScaleType
++attr firstBaselineToTopHeight
++attr font
++attr fontFamily
++attr fontProviderAuthority
++attr fontProviderCerts
++attr fontProviderFetchStrategy
++attr fontProviderFetchTimeout
++attr fontProviderPackage
++attr fontProviderQuery
++attr fontProviderSystemFontFamily
++attr fontStyle
++attr fontVariationSettings
++attr fontWeight
++attr gapBetweenBars
++attr goIcon
++attr height
++attr hideOnContentScroll
++attr homeAsUpIndicator
++attr homeLayout
++attr icon
++attr iconTint
++attr iconTintMode
++attr iconifiedByDefault
++attr imageButtonStyle
++attr indeterminateProgressStyle
++attr initialActivityCount
++attr isAutofillInlineSuggestionTheme
++attr isLightTheme
++attr itemPadding
++attr lStar
++attr lastBaselineToBottomHeight
++attr layout
++attr lineHeight
++attr listChoiceBackgroundIndicator
++attr listChoiceIndicatorMultipleAnimated
++attr listChoiceIndicatorSingleAnimated
++attr listDividerAlertDialog
++attr listItemLayout
++attr listLayout
++attr listMenuViewStyle
++attr listPopupWindowStyle
++attr listPreferredItemHeight
++attr listPreferredItemHeightLarge
++attr listPreferredItemHeightSmall
++attr listPreferredItemPaddingEnd
++attr listPreferredItemPaddingLeft
++attr listPreferredItemPaddingRight
++attr listPreferredItemPaddingStart
++attr logo
++attr logoDescription
++attr maxButtonHeight
++attr measureWithLargestChild
++attr menu
++attr multiChoiceItemLayout
++attr navigationContentDescription
++attr navigationIcon
++attr navigationMode
++attr nestedScrollViewStyle
++attr numericModifiers
++attr overlapAnchor
++attr overlayImage
++attr paddingBottomNoButtons
++attr paddingEnd
++attr paddingStart
++attr paddingTopNoTitle
++attr panelBackground
++attr panelMenuListTheme
++attr panelMenuListWidth
++attr placeholderImage
++attr placeholderImageScaleType
++attr popupMenuStyle
++attr popupTheme
++attr popupWindowStyle
++attr preserveIconSpacing
++attr pressedStateOverlayImage
++attr progressBarAutoRotateInterval
++attr progressBarImage
++attr progressBarImageScaleType
++attr progressBarPadding
++attr progressBarStyle
++attr queryBackground
++attr queryHint
++attr queryPatterns
++attr radioButtonStyle
++attr ratingBarStyle
++attr ratingBarStyleIndicator
++attr ratingBarStyleSmall
++attr retryImage
++attr retryImageScaleType
++attr roundAsCircle
++attr roundBottomEnd
++attr roundBottomLeft
++attr roundBottomRight
++attr roundBottomStart
++attr roundTopEnd
++attr roundTopLeft
++attr roundTopRight
++attr roundTopStart
++attr roundWithOverlayColor
++attr roundedCornerRadius
++attr roundingBorderColor
++attr roundingBorderPadding
++attr roundingBorderWidth
++attr searchHintIcon
++attr searchIcon
++attr searchViewStyle
++attr seekBarStyle
++attr selectableItemBackground
++attr selectableItemBackgroundBorderless
++attr shortcutMatchRequired
++attr showAsAction
++attr showDividers
++attr showText
++attr showTitle
++attr singleChoiceItemLayout
++attr spinBars
++attr spinnerDropDownItemStyle
++attr spinnerStyle
++attr splitTrack
++attr srcCompat
++attr state_above_anchor
++attr subMenuArrow
++attr submitBackground
++attr subtitle
++attr subtitleTextAppearance
++attr subtitleTextColor
++attr subtitleTextStyle
++attr suggestionRowLayout
++attr switchMinWidth
++attr switchPadding
++attr switchStyle
++attr switchTextAppearance
++attr textAllCaps
++attr textAppearanceLargePopupMenu
++attr textAppearanceListItem
++attr textAppearanceListItemSecondary
++attr textAppearanceListItemSmall
++attr textAppearancePopupMenuHeader
++attr textAppearanceSearchResultSubtitle
++attr textAppearanceSearchResultTitle
++attr textAppearanceSmallPopupMenu
++attr textColorAlertDialogListItem
++attr textColorSearchUrl
++attr textLocale
++attr theme
++attr thickness
++attr thumbTextPadding
++attr thumbTint
++attr thumbTintMode
++attr tickMark
++attr tickMarkTint
++attr tickMarkTintMode
++attr tint
++attr tintMode
++attr title
++attr titleMargin
++attr titleMarginBottom
++attr titleMarginEnd
++attr titleMarginStart
++attr titleMarginTop
++attr titleMargins
++attr titleTextAppearance
++attr titleTextColor
++attr titleTextStyle
++attr toolbarNavigationButtonStyle
++attr toolbarStyle
++attr tooltipForegroundColor
++attr tooltipFrameBackground
++attr tooltipText
++attr track
++attr trackTint
++attr trackTintMode
++attr ttcIndex
++attr viewAspectRatio
++attr viewInflaterClass
++attr voiceIcon
++attr windowActionBar
++attr windowActionBarOverlay
++attr windowActionModeOverlay
++attr windowFixedHeightMajor
++attr windowFixedHeightMinor
++attr windowFixedWidthMajor
++attr windowFixedWidthMinor
++attr windowMinWidthMajor
++attr windowMinWidthMinor
++attr windowNoTitle
++bool abc_action_bar_embed_tabs
++bool abc_config_actionMenuItemAllCaps
++color abc_background_cache_hint_selector_material_dark
++color abc_background_cache_hint_selector_material_light
++color abc_btn_colored_borderless_text_material
++color abc_btn_colored_text_material
++color abc_color_highlight_material
++color abc_decor_view_status_guard
++color abc_decor_view_status_guard_light
++color abc_hint_foreground_material_dark
++color abc_hint_foreground_material_light
++color abc_primary_text_disable_only_material_dark
++color abc_primary_text_disable_only_material_light
++color abc_primary_text_material_dark
++color abc_primary_text_material_light
++color abc_search_url_text
++color abc_search_url_text_normal
++color abc_search_url_text_pressed
++color abc_search_url_text_selected
++color abc_secondary_text_material_dark
++color abc_secondary_text_material_light
++color abc_tint_btn_checkable
++color abc_tint_default
++color abc_tint_edittext
++color abc_tint_seek_thumb
++color abc_tint_spinner
++color abc_tint_switch_track
++color accent_material_dark
++color accent_material_light
++color androidx_core_ripple_material_light
++color androidx_core_secondary_text_default_material_light
++color background_floating_material_dark
++color background_floating_material_light
++color background_material_dark
++color background_material_light
++color bright_foreground_disabled_material_dark
++color bright_foreground_disabled_material_light
++color bright_foreground_inverse_material_dark
++color bright_foreground_inverse_material_light
++color bright_foreground_material_dark
++color bright_foreground_material_light
++color button_material_dark
++color button_material_light
++color catalyst_logbox_background
++color catalyst_redbox_background
++color dim_foreground_disabled_material_dark
++color dim_foreground_disabled_material_light
++color dim_foreground_material_dark
++color dim_foreground_material_light
++color error_color_material_dark
++color error_color_material_light
++color foreground_material_dark
++color foreground_material_light
++color highlighted_text_material_dark
++color highlighted_text_material_light
++color material_blue_grey_800
++color material_blue_grey_900
++color material_blue_grey_950
++color material_deep_teal_200
++color material_deep_teal_500
++color material_grey_100
++color material_grey_300
++color material_grey_50
++color material_grey_600
++color material_grey_800
++color material_grey_850
++color material_grey_900
++color notification_action_color_filter
++color notification_icon_bg_color
++color primary_dark_material_dark
++color primary_dark_material_light
++color primary_material_dark
++color primary_material_light
++color primary_text_default_material_dark
++color primary_text_default_material_light
++color primary_text_disabled_material_dark
++color primary_text_disabled_material_light
++color ripple_material_dark
++color ripple_material_light
++color secondary_text_default_material_dark
++color secondary_text_default_material_light
++color secondary_text_disabled_material_dark
++color secondary_text_disabled_material_light
++color switch_thumb_disabled_material_dark
++color switch_thumb_disabled_material_light
++color switch_thumb_material_dark
++color switch_thumb_material_light
++color switch_thumb_normal_material_dark
++color switch_thumb_normal_material_light
++color tooltip_background_dark
++color tooltip_background_light
++dimen abc_action_bar_content_inset_material
++dimen abc_action_bar_content_inset_with_nav
++dimen abc_action_bar_default_height_material
++dimen abc_action_bar_default_padding_end_material
++dimen abc_action_bar_default_padding_start_material
++dimen abc_action_bar_elevation_material
++dimen abc_action_bar_icon_vertical_padding_material
++dimen abc_action_bar_overflow_padding_end_material
++dimen abc_action_bar_overflow_padding_start_material
++dimen abc_action_bar_stacked_max_height
++dimen abc_action_bar_stacked_tab_max_width
++dimen abc_action_bar_subtitle_bottom_margin_material
++dimen abc_action_bar_subtitle_top_margin_material
++dimen abc_action_button_min_height_material
++dimen abc_action_button_min_width_material
++dimen abc_action_button_min_width_overflow_material
++dimen abc_alert_dialog_button_bar_height
++dimen abc_alert_dialog_button_dimen
++dimen abc_button_inset_horizontal_material
++dimen abc_button_inset_vertical_material
++dimen abc_button_padding_horizontal_material
++dimen abc_button_padding_vertical_material
++dimen abc_cascading_menus_min_smallest_width
++dimen abc_config_prefDialogWidth
++dimen abc_control_corner_material
++dimen abc_control_inset_material
++dimen abc_control_padding_material
++dimen abc_dialog_corner_radius_material
++dimen abc_dialog_fixed_height_major
++dimen abc_dialog_fixed_height_minor
++dimen abc_dialog_fixed_width_major
++dimen abc_dialog_fixed_width_minor
++dimen abc_dialog_list_padding_bottom_no_buttons
++dimen abc_dialog_list_padding_top_no_title
++dimen abc_dialog_min_width_major
++dimen abc_dialog_min_width_minor
++dimen abc_dialog_padding_material
++dimen abc_dialog_padding_top_material
++dimen abc_dialog_title_divider_material
++dimen abc_disabled_alpha_material_dark
++dimen abc_disabled_alpha_material_light
++dimen abc_dropdownitem_icon_width
++dimen abc_dropdownitem_text_padding_left
++dimen abc_dropdownitem_text_padding_right
++dimen abc_edit_text_inset_bottom_material
++dimen abc_edit_text_inset_horizontal_material
++dimen abc_edit_text_inset_top_material
++dimen abc_floating_window_z
++dimen abc_list_item_height_large_material
++dimen abc_list_item_height_material
++dimen abc_list_item_height_small_material
++dimen abc_list_item_padding_horizontal_material
++dimen abc_panel_menu_list_width
++dimen abc_progress_bar_height_material
++dimen abc_search_view_preferred_height
++dimen abc_search_view_preferred_width
++dimen abc_seekbar_track_background_height_material
++dimen abc_seekbar_track_progress_height_material
++dimen abc_select_dialog_padding_start_material
++dimen abc_star_big
++dimen abc_star_medium
++dimen abc_star_small
++dimen abc_switch_padding
++dimen abc_text_size_body_1_material
++dimen abc_text_size_body_2_material
++dimen abc_text_size_button_material
++dimen abc_text_size_caption_material
++dimen abc_text_size_display_1_material
++dimen abc_text_size_display_2_material
++dimen abc_text_size_display_3_material
++dimen abc_text_size_display_4_material
++dimen abc_text_size_headline_material
++dimen abc_text_size_large_material
++dimen abc_text_size_medium_material
++dimen abc_text_size_menu_header_material
++dimen abc_text_size_menu_material
++dimen abc_text_size_small_material
++dimen abc_text_size_subhead_material
++dimen abc_text_size_subtitle_material_toolbar
++dimen abc_text_size_title_material
++dimen abc_text_size_title_material_toolbar
++dimen autofill_inline_suggestion_icon_size
++dimen compat_button_inset_horizontal_material
++dimen compat_button_inset_vertical_material
++dimen compat_button_padding_horizontal_material
++dimen compat_button_padding_vertical_material
++dimen compat_control_corner_material
++dimen compat_notification_large_icon_max_height
++dimen compat_notification_large_icon_max_width
++dimen disabled_alpha_material_dark
++dimen disabled_alpha_material_light
++dimen highlight_alpha_material_colored
++dimen highlight_alpha_material_dark
++dimen highlight_alpha_material_light
++dimen hint_alpha_material_dark
++dimen hint_alpha_material_light
++dimen hint_pressed_alpha_material_dark
++dimen hint_pressed_alpha_material_light
++dimen notification_action_icon_size
++dimen notification_action_text_size
++dimen notification_big_circle_margin
++dimen notification_content_margin_start
++dimen notification_large_icon_height
++dimen notification_large_icon_width
++dimen notification_main_column_padding_top
++dimen notification_media_narrow_margin
++dimen notification_right_icon_size
++dimen notification_right_side_padding_top
++dimen notification_small_icon_background_padding
++dimen notification_small_icon_size_as_large
++dimen notification_subtext_size
++dimen notification_top_pad
++dimen notification_top_pad_large_text
++dimen tooltip_corner_radius
++dimen tooltip_horizontal_padding
++dimen tooltip_margin
++dimen tooltip_precise_anchor_extra_offset
++dimen tooltip_precise_anchor_threshold
++dimen tooltip_vertical_padding
++dimen tooltip_y_offset_non_touch
++dimen tooltip_y_offset_touch
++drawable abc_ab_share_pack_mtrl_alpha
++drawable abc_action_bar_item_background_material
++drawable abc_btn_borderless_material
++drawable abc_btn_check_material
++drawable abc_btn_check_material_anim
++drawable abc_btn_check_to_on_mtrl_000
++drawable abc_btn_check_to_on_mtrl_015
++drawable abc_btn_colored_material
++drawable abc_btn_default_mtrl_shape
++drawable abc_btn_radio_material
++drawable abc_btn_radio_material_anim
++drawable abc_btn_radio_to_on_mtrl_000
++drawable abc_btn_radio_to_on_mtrl_015
++drawable abc_btn_switch_to_on_mtrl_00001
++drawable abc_btn_switch_to_on_mtrl_00012
++drawable abc_cab_background_internal_bg
++drawable abc_cab_background_top_material
++drawable abc_cab_background_top_mtrl_alpha
++drawable abc_control_background_material
++drawable abc_dialog_material_background
++drawable abc_edit_text_material
++drawable abc_ic_ab_back_material
++drawable abc_ic_arrow_drop_right_black_24dp
++drawable abc_ic_clear_material
++drawable abc_ic_commit_search_api_mtrl_alpha
++drawable abc_ic_go_search_api_material
++drawable abc_ic_menu_copy_mtrl_am_alpha
++drawable abc_ic_menu_cut_mtrl_alpha
++drawable abc_ic_menu_overflow_material
++drawable abc_ic_menu_paste_mtrl_am_alpha
++drawable abc_ic_menu_selectall_mtrl_alpha
++drawable abc_ic_menu_share_mtrl_alpha
++drawable abc_ic_search_api_material
++drawable abc_ic_voice_search_api_material
++drawable abc_item_background_holo_dark
++drawable abc_item_background_holo_light
++drawable abc_list_divider_material
++drawable abc_list_divider_mtrl_alpha
++drawable abc_list_focused_holo
++drawable abc_list_longpressed_holo
++drawable abc_list_pressed_holo_dark
++drawable abc_list_pressed_holo_light
++drawable abc_list_selector_background_transition_holo_dark
++drawable abc_list_selector_background_transition_holo_light
++drawable abc_list_selector_disabled_holo_dark
++drawable abc_list_selector_disabled_holo_light
++drawable abc_list_selector_holo_dark
++drawable abc_list_selector_holo_light
++drawable abc_menu_hardkey_panel_mtrl_mult
++drawable abc_popup_background_mtrl_mult
++drawable abc_ratingbar_indicator_material
++drawable abc_ratingbar_material
++drawable abc_ratingbar_small_material
++drawable abc_scrubber_control_off_mtrl_alpha
++drawable abc_scrubber_control_to_pressed_mtrl_000
++drawable abc_scrubber_control_to_pressed_mtrl_005
++drawable abc_scrubber_primary_mtrl_alpha
++drawable abc_scrubber_track_mtrl_alpha
++drawable abc_seekbar_thumb_material
++drawable abc_seekbar_tick_mark_material
++drawable abc_seekbar_track_material
++drawable abc_spinner_mtrl_am_alpha
++drawable abc_spinner_textfield_background_material
++drawable abc_star_black_48dp
++drawable abc_star_half_black_48dp
++drawable abc_switch_thumb_material
++drawable abc_switch_track_mtrl_alpha
++drawable abc_tab_indicator_material
++drawable abc_tab_indicator_mtrl_alpha
++drawable abc_text_cursor_material
++drawable abc_text_select_handle_left_mtrl
++drawable abc_text_select_handle_middle_mtrl
++drawable abc_text_select_handle_right_mtrl
++drawable abc_textfield_activated_mtrl_alpha
++drawable abc_textfield_default_mtrl_alpha
++drawable abc_textfield_search_activated_mtrl_alpha
++drawable abc_textfield_search_default_mtrl_alpha
++drawable abc_textfield_search_material
++drawable abc_vector_test
++drawable autofill_inline_suggestion_chip_background
++drawable btn_checkbox_checked_mtrl
++drawable btn_checkbox_checked_to_unchecked_mtrl_animation
++drawable btn_checkbox_unchecked_mtrl
++drawable btn_checkbox_unchecked_to_checked_mtrl_animation
++drawable btn_radio_off_mtrl
++drawable btn_radio_off_to_on_mtrl_animation
++drawable btn_radio_on_mtrl
++drawable btn_radio_on_to_off_mtrl_animation
++drawable notification_action_background
++drawable notification_bg
++drawable notification_bg_low
++drawable notification_bg_low_normal
++drawable notification_bg_low_pressed
++drawable notification_bg_normal
++drawable notification_bg_normal_pressed
++drawable notification_icon_background
++drawable notification_template_icon_bg
++drawable notification_template_icon_low_bg
++drawable notification_tile_bg
++drawable notify_panel_notification_icon_bg
++drawable redbox_top_border_background
++drawable test_level_drawable
++drawable tooltip_frame_dark
++drawable tooltip_frame_light
++id accessibility_action_clickable_span
++id accessibility_actions
++id accessibility_collection
++id accessibility_collection_item
++id accessibility_custom_action_0
++id accessibility_custom_action_1
++id accessibility_custom_action_10
++id accessibility_custom_action_11
++id accessibility_custom_action_12
++id accessibility_custom_action_13
++id accessibility_custom_action_14
++id accessibility_custom_action_15
++id accessibility_custom_action_16
++id accessibility_custom_action_17
++id accessibility_custom_action_18
++id accessibility_custom_action_19
++id accessibility_custom_action_2
++id accessibility_custom_action_20
++id accessibility_custom_action_21
++id accessibility_custom_action_22
++id accessibility_custom_action_23
++id accessibility_custom_action_24
++id accessibility_custom_action_25
++id accessibility_custom_action_26
++id accessibility_custom_action_27
++id accessibility_custom_action_28
++id accessibility_custom_action_29
++id accessibility_custom_action_3
++id accessibility_custom_action_30
++id accessibility_custom_action_31
++id accessibility_custom_action_4
++id accessibility_custom_action_5
++id accessibility_custom_action_6
++id accessibility_custom_action_7
++id accessibility_custom_action_8
++id accessibility_custom_action_9
++id accessibility_hint
++id accessibility_label
++id accessibility_links
++id accessibility_role
++id accessibility_state
++id accessibility_value
++id action_bar
++id action_bar_activity_content
++id action_bar_container
++id action_bar_root
++id action_bar_spinner
++id action_bar_subtitle
++id action_bar_title
++id action_container
++id action_context_bar
++id action_divider
++id action_image
++id action_menu_divider
++id action_menu_presenter
++id action_mode_bar
++id action_mode_bar_stub
++id action_mode_close_button
++id action_text
++id actions
++id activity_chooser_view_content
++id add
++id alertTitle
++id async
++id autofill_inline_suggestion_end_icon
++id autofill_inline_suggestion_start_icon
++id autofill_inline_suggestion_subtitle
++id autofill_inline_suggestion_title
++id blocking
++id buttonPanel
++id catalyst_redbox_title
++id center
++id centerCrop
++id centerInside
++id checkbox
++id checked
++id chronometer
++id content
++id contentPanel
++id custom
++id customPanel
++id decor_content_parent
++id default_activity_button
++id dialog_button
++id edit_query
++id expand_activities_button
++id expanded_menu
++id fitBottomStart
++id fitCenter
++id fitEnd
++id fitStart
++id fitXY
++id focusCrop
++id forever
++id fps_text
++id fragment_container_view_tag
++id group_divider
++id home
++id icon
++id icon_group
++id image
++id info
++id italic
++id item1
++id item2
++id item3
++id item4
++id labelled_by
++id line1
++id line3
++id listMode
++id list_item
++id message
++id multiply
++id none
++id normal
++id notification_background
++id notification_main_column
++id notification_main_column_container
++id off
++id on
++id parentPanel
++id pointer_events
++id progress_circular
++id progress_horizontal
++id radio
++id react_test_id
++id right_icon
++id right_side
++id rn_frame_file
++id rn_frame_method
++id rn_redbox_dismiss_button
++id rn_redbox_line_separator
++id rn_redbox_loading_indicator
++id rn_redbox_reload_button
++id rn_redbox_report_button
++id rn_redbox_report_label
++id rn_redbox_stack
++id screen
++id scrollIndicatorDown
++id scrollIndicatorUp
++id scrollView
++id search_badge
++id search_bar
++id search_button
++id search_close_btn
++id search_edit_frame
++id search_go_btn
++id search_mag_icon
++id search_plate
++id search_src_text
++id search_voice_btn
++id select_dialog_listview
++id shortcut
++id spacer
++id special_effects_controller_view_tag
++id split_action_bar
++id src_atop
++id src_in
++id src_over
++id submenuarrow
++id submit_area
++id tabMode
++id tag_accessibility_actions
++id tag_accessibility_clickable_spans
++id tag_accessibility_heading
++id tag_accessibility_pane_title
++id tag_on_apply_window_listener
++id tag_on_receive_content_listener
++id tag_on_receive_content_mime_types
++id tag_screen_reader_focusable
++id tag_state_description
++id tag_transition_group
++id tag_unhandled_key_event_manager
++id tag_unhandled_key_listeners
++id tag_window_insets_animation_callback
++id text
++id text2
++id textSpacerNoButtons
++id textSpacerNoTitle
++id time
++id title
++id titleDividerNoCustom
++id title_template
++id topPanel
++id unchecked
++id uniform
++id up
++id view_tag_instance_handle
++id view_tag_native_id
++id view_tree_lifecycle_owner
++id view_tree_saved_state_registry_owner
++id view_tree_view_model_store_owner
++id visible_removing_fragment_view_tag
++id wrap_content
++integer abc_config_activityDefaultDur
++integer abc_config_activityShortDur
++integer cancel_button_image_alpha
++integer config_tooltipAnimTime
++integer react_native_dev_server_port
++integer react_native_inspector_proxy_port
++integer status_bar_notification_info_maxnum
++interpolator btn_checkbox_checked_mtrl_animation_interpolator_0
++interpolator btn_checkbox_checked_mtrl_animation_interpolator_1
++interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_0
++interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_1
++interpolator btn_radio_to_off_mtrl_animation_interpolator_0
++interpolator btn_radio_to_on_mtrl_animation_interpolator_0
++interpolator fast_out_slow_in
++layout abc_action_bar_title_item
++layout abc_action_bar_up_container
++layout abc_action_menu_item_layout
++layout abc_action_menu_layout
++layout abc_action_mode_bar
++layout abc_action_mode_close_item_material
++layout abc_activity_chooser_view
++layout abc_activity_chooser_view_list_item
++layout abc_alert_dialog_button_bar_material
++layout abc_alert_dialog_material
++layout abc_alert_dialog_title_material
++layout abc_cascading_menu_item_layout
++layout abc_dialog_title_material
++layout abc_expanded_menu_layout
++layout abc_list_menu_item_checkbox
++layout abc_list_menu_item_icon
++layout abc_list_menu_item_layout
++layout abc_list_menu_item_radio
++layout abc_popup_menu_header_item_layout
++layout abc_popup_menu_item_layout
++layout abc_screen_content_include
++layout abc_screen_simple
++layout abc_screen_simple_overlay_action_mode
++layout abc_screen_toolbar
++layout abc_search_dropdown_item_icons_2line
++layout abc_search_view
++layout abc_select_dialog_material
++layout abc_tooltip
++layout autofill_inline_suggestion
++layout custom_dialog
++layout dev_loading_view
++layout fps_view
++layout notification_action
++layout notification_action_tombstone
++layout notification_template_custom_big
++layout notification_template_icon_group
++layout notification_template_part_chronometer
++layout notification_template_part_time
++layout redbox_item_frame
++layout redbox_item_title
++layout redbox_view
++layout select_dialog_item_material
++layout select_dialog_multichoice_material
++layout select_dialog_singlechoice_material
++layout support_simple_spinner_dropdown_item
++menu example_menu
++menu example_menu2
++string abc_action_bar_home_description
++string abc_action_bar_up_description
++string abc_action_menu_overflow_description
++string abc_action_mode_done
++string abc_activity_chooser_view_see_all
++string abc_activitychooserview_choose_application
++string abc_capital_off
++string abc_capital_on
++string abc_menu_alt_shortcut_label
++string abc_menu_ctrl_shortcut_label
++string abc_menu_delete_shortcut_label
++string abc_menu_enter_shortcut_label
++string abc_menu_function_shortcut_label
++string abc_menu_meta_shortcut_label
++string abc_menu_shift_shortcut_label
++string abc_menu_space_shortcut_label
++string abc_menu_sym_shortcut_label
++string abc_prepend_shortcut_label
++string abc_search_hint
++string abc_searchview_description_clear
++string abc_searchview_description_query
++string abc_searchview_description_search
++string abc_searchview_description_submit
++string abc_searchview_description_voice
++string abc_shareactionprovider_share_with
++string abc_shareactionprovider_share_with_application
++string abc_toolbar_collapse_description
++string alert_description
++string catalyst_change_bundle_location
++string catalyst_copy_button
++string catalyst_debug
++string catalyst_debug_chrome
++string catalyst_debug_chrome_stop
++string catalyst_debug_connecting
++string catalyst_debug_error
++string catalyst_debug_open
++string catalyst_debug_stop
++string catalyst_devtools_open
++string catalyst_dismiss_button
++string catalyst_heap_capture
++string catalyst_hot_reloading
++string catalyst_hot_reloading_auto_disable
++string catalyst_hot_reloading_auto_enable
++string catalyst_hot_reloading_stop
++string catalyst_inspector
++string catalyst_inspector_stop
++string catalyst_loading_from_url
++string catalyst_open_flipper_error
++string catalyst_perf_monitor
++string catalyst_perf_monitor_stop
++string catalyst_reload
++string catalyst_reload_button
++string catalyst_reload_error
++string catalyst_report_button
++string catalyst_sample_profiler_disable
++string catalyst_sample_profiler_enable
++string catalyst_settings
++string catalyst_settings_title
++string combobox_description
++string header_description
++string image_description
++string imagebutton_description
++string link_description
++string menu_description
++string menubar_description
++string menuitem_description
++string progressbar_description
++string radiogroup_description
++string rn_tab_description
++string scrollbar_description
++string search_menu_title
++string spinbutton_description
++string state_busy_description
++string state_collapsed_description
++string state_expanded_description
++string state_mixed_description
++string state_off_description
++string state_on_description
++string state_unselected_description
++string status_bar_notification_info_overflow
++string summary_description
++string tablist_description
++string timer_description
++string toolbar_description
++style AlertDialog_AppCompat
++style AlertDialog_AppCompat_Light
++style Animation_AppCompat_Dialog
++style Animation_AppCompat_DropDownUp
++style Animation_AppCompat_Tooltip
++style Animation_Catalyst_LogBox
++style Animation_Catalyst_RedBox
++style Base_AlertDialog_AppCompat
++style Base_AlertDialog_AppCompat_Light
++style Base_Animation_AppCompat_Dialog
++style Base_Animation_AppCompat_DropDownUp
++style Base_Animation_AppCompat_Tooltip
++style Base_DialogWindowTitleBackground_AppCompat
++style Base_DialogWindowTitle_AppCompat
++style Base_TextAppearance_AppCompat
++style Base_TextAppearance_AppCompat_Body1
++style Base_TextAppearance_AppCompat_Body2
++style Base_TextAppearance_AppCompat_Button
++style Base_TextAppearance_AppCompat_Caption
++style Base_TextAppearance_AppCompat_Display1
++style Base_TextAppearance_AppCompat_Display2
++style Base_TextAppearance_AppCompat_Display3
++style Base_TextAppearance_AppCompat_Display4
++style Base_TextAppearance_AppCompat_Headline
++style Base_TextAppearance_AppCompat_Inverse
++style Base_TextAppearance_AppCompat_Large
++style Base_TextAppearance_AppCompat_Large_Inverse
++style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
++style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
++style Base_TextAppearance_AppCompat_Medium
++style Base_TextAppearance_AppCompat_Medium_Inverse
++style Base_TextAppearance_AppCompat_Menu
++style Base_TextAppearance_AppCompat_SearchResult
++style Base_TextAppearance_AppCompat_SearchResult_Subtitle
++style Base_TextAppearance_AppCompat_SearchResult_Title
++style Base_TextAppearance_AppCompat_Small
++style Base_TextAppearance_AppCompat_Small_Inverse
++style Base_TextAppearance_AppCompat_Subhead
++style Base_TextAppearance_AppCompat_Subhead_Inverse
++style Base_TextAppearance_AppCompat_Title
++style Base_TextAppearance_AppCompat_Title_Inverse
++style Base_TextAppearance_AppCompat_Tooltip
++style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu
++style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle
++style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
++style Base_TextAppearance_AppCompat_Widget_ActionBar_Title
++style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
++style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle
++style Base_TextAppearance_AppCompat_Widget_ActionMode_Title
++style Base_TextAppearance_AppCompat_Widget_Button
++style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored
++style Base_TextAppearance_AppCompat_Widget_Button_Colored
++style Base_TextAppearance_AppCompat_Widget_Button_Inverse
++style Base_TextAppearance_AppCompat_Widget_DropDownItem
++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header
++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large
++style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small
++style Base_TextAppearance_AppCompat_Widget_Switch
++style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem
++style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item
++style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle
++style Base_TextAppearance_Widget_AppCompat_Toolbar_Title
++style Base_ThemeOverlay_AppCompat
++style Base_ThemeOverlay_AppCompat_ActionBar
++style Base_ThemeOverlay_AppCompat_Dark
++style Base_ThemeOverlay_AppCompat_Dark_ActionBar
++style Base_ThemeOverlay_AppCompat_Dialog
++style Base_ThemeOverlay_AppCompat_Dialog_Alert
++style Base_ThemeOverlay_AppCompat_Light
++style Base_Theme_AppCompat
++style Base_Theme_AppCompat_CompactMenu
++style Base_Theme_AppCompat_Dialog
++style Base_Theme_AppCompat_DialogWhenLarge
++style Base_Theme_AppCompat_Dialog_Alert
++style Base_Theme_AppCompat_Dialog_FixedSize
++style Base_Theme_AppCompat_Dialog_MinWidth
++style Base_Theme_AppCompat_Light
++style Base_Theme_AppCompat_Light_DarkActionBar
++style Base_Theme_AppCompat_Light_Dialog
++style Base_Theme_AppCompat_Light_DialogWhenLarge
++style Base_Theme_AppCompat_Light_Dialog_Alert
++style Base_Theme_AppCompat_Light_Dialog_FixedSize
++style Base_Theme_AppCompat_Light_Dialog_MinWidth
++style Base_V21_ThemeOverlay_AppCompat_Dialog
++style Base_V21_Theme_AppCompat
++style Base_V21_Theme_AppCompat_Dialog
++style Base_V21_Theme_AppCompat_Light
++style Base_V21_Theme_AppCompat_Light_Dialog
++style Base_V22_Theme_AppCompat
++style Base_V22_Theme_AppCompat_Light
++style Base_V23_Theme_AppCompat
++style Base_V23_Theme_AppCompat_Light
++style Base_V26_Theme_AppCompat
++style Base_V26_Theme_AppCompat_Light
++style Base_V26_Widget_AppCompat_Toolbar
++style Base_V28_Theme_AppCompat
++style Base_V28_Theme_AppCompat_Light
++style Base_V7_ThemeOverlay_AppCompat_Dialog
++style Base_V7_Theme_AppCompat
++style Base_V7_Theme_AppCompat_Dialog
++style Base_V7_Theme_AppCompat_Light
++style Base_V7_Theme_AppCompat_Light_Dialog
++style Base_V7_Widget_AppCompat_AutoCompleteTextView
++style Base_V7_Widget_AppCompat_EditText
++style Base_V7_Widget_AppCompat_Toolbar
++style Base_Widget_AppCompat_ActionBar
++style Base_Widget_AppCompat_ActionBar_Solid
++style Base_Widget_AppCompat_ActionBar_TabBar
++style Base_Widget_AppCompat_ActionBar_TabText
++style Base_Widget_AppCompat_ActionBar_TabView
++style Base_Widget_AppCompat_ActionButton
++style Base_Widget_AppCompat_ActionButton_CloseMode
++style Base_Widget_AppCompat_ActionButton_Overflow
++style Base_Widget_AppCompat_ActionMode
++style Base_Widget_AppCompat_ActivityChooserView
++style Base_Widget_AppCompat_AutoCompleteTextView
++style Base_Widget_AppCompat_Button
++style Base_Widget_AppCompat_ButtonBar
++style Base_Widget_AppCompat_ButtonBar_AlertDialog
++style Base_Widget_AppCompat_Button_Borderless
++style Base_Widget_AppCompat_Button_Borderless_Colored
++style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog
++style Base_Widget_AppCompat_Button_Colored
++style Base_Widget_AppCompat_Button_Small
++style Base_Widget_AppCompat_CompoundButton_CheckBox
++style Base_Widget_AppCompat_CompoundButton_RadioButton
++style Base_Widget_AppCompat_CompoundButton_Switch
++style Base_Widget_AppCompat_DrawerArrowToggle
++style Base_Widget_AppCompat_DrawerArrowToggle_Common
++style Base_Widget_AppCompat_DropDownItem_Spinner
++style Base_Widget_AppCompat_EditText
++style Base_Widget_AppCompat_ImageButton
++style Base_Widget_AppCompat_Light_ActionBar
++style Base_Widget_AppCompat_Light_ActionBar_Solid
++style Base_Widget_AppCompat_Light_ActionBar_TabBar
++style Base_Widget_AppCompat_Light_ActionBar_TabText
++style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse
++style Base_Widget_AppCompat_Light_ActionBar_TabView
++style Base_Widget_AppCompat_Light_PopupMenu
++style Base_Widget_AppCompat_Light_PopupMenu_Overflow
++style Base_Widget_AppCompat_ListMenuView
++style Base_Widget_AppCompat_ListPopupWindow
++style Base_Widget_AppCompat_ListView
++style Base_Widget_AppCompat_ListView_DropDown
++style Base_Widget_AppCompat_ListView_Menu
++style Base_Widget_AppCompat_PopupMenu
++style Base_Widget_AppCompat_PopupMenu_Overflow
++style Base_Widget_AppCompat_PopupWindow
++style Base_Widget_AppCompat_ProgressBar
++style Base_Widget_AppCompat_ProgressBar_Horizontal
++style Base_Widget_AppCompat_RatingBar
++style Base_Widget_AppCompat_RatingBar_Indicator
++style Base_Widget_AppCompat_RatingBar_Small
++style Base_Widget_AppCompat_SearchView
++style Base_Widget_AppCompat_SearchView_ActionBar
++style Base_Widget_AppCompat_SeekBar
++style Base_Widget_AppCompat_SeekBar_Discrete
++style Base_Widget_AppCompat_Spinner
++style Base_Widget_AppCompat_Spinner_Underlined
++style Base_Widget_AppCompat_TextView
++style Base_Widget_AppCompat_TextView_SpinnerItem
++style Base_Widget_AppCompat_Toolbar
++style Base_Widget_AppCompat_Toolbar_Button_Navigation
++style CalendarDatePickerDialog
++style CalendarDatePickerStyle
++style DialogAnimationFade
++style DialogAnimationSlide
++style Platform_AppCompat
++style Platform_AppCompat_Light
++style Platform_ThemeOverlay_AppCompat
++style Platform_ThemeOverlay_AppCompat_Dark
++style Platform_ThemeOverlay_AppCompat_Light
++style Platform_V21_AppCompat
++style Platform_V21_AppCompat_Light
++style Platform_V25_AppCompat
++style Platform_V25_AppCompat_Light
++style Platform_Widget_AppCompat_Spinner
++style RtlOverlay_DialogWindowTitle_AppCompat
++style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem
++style RtlOverlay_Widget_AppCompat_DialogTitle_Icon
++style RtlOverlay_Widget_AppCompat_PopupMenuItem
++style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup
++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut
++style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow
++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text
++style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title
++style RtlOverlay_Widget_AppCompat_SearchView_MagIcon
++style RtlOverlay_Widget_AppCompat_Search_DropDown
++style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1
++style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2
++style RtlOverlay_Widget_AppCompat_Search_DropDown_Query
++style RtlOverlay_Widget_AppCompat_Search_DropDown_Text
++style RtlUnderlay_Widget_AppCompat_ActionButton
++style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow
++style SpinnerDatePickerDialog
++style SpinnerDatePickerStyle
++style TextAppearance_AppCompat
++style TextAppearance_AppCompat_Body1
++style TextAppearance_AppCompat_Body2
++style TextAppearance_AppCompat_Button
++style TextAppearance_AppCompat_Caption
++style TextAppearance_AppCompat_Display1
++style TextAppearance_AppCompat_Display2
++style TextAppearance_AppCompat_Display3
++style TextAppearance_AppCompat_Display4
++style TextAppearance_AppCompat_Headline
++style TextAppearance_AppCompat_Inverse
++style TextAppearance_AppCompat_Large
++style TextAppearance_AppCompat_Large_Inverse
++style TextAppearance_AppCompat_Light_SearchResult_Subtitle
++style TextAppearance_AppCompat_Light_SearchResult_Title
++style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
++style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
++style TextAppearance_AppCompat_Medium
++style TextAppearance_AppCompat_Medium_Inverse
++style TextAppearance_AppCompat_Menu
++style TextAppearance_AppCompat_SearchResult_Subtitle
++style TextAppearance_AppCompat_SearchResult_Title
++style TextAppearance_AppCompat_Small
++style TextAppearance_AppCompat_Small_Inverse
++style TextAppearance_AppCompat_Subhead
++style TextAppearance_AppCompat_Subhead_Inverse
++style TextAppearance_AppCompat_Title
++style TextAppearance_AppCompat_Title_Inverse
++style TextAppearance_AppCompat_Tooltip
++style TextAppearance_AppCompat_Widget_ActionBar_Menu
++style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
++style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
++style TextAppearance_AppCompat_Widget_ActionBar_Title
++style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
++style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
++style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
++style TextAppearance_AppCompat_Widget_ActionMode_Title
++style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
++style TextAppearance_AppCompat_Widget_Button
++style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
++style TextAppearance_AppCompat_Widget_Button_Colored
++style TextAppearance_AppCompat_Widget_Button_Inverse
++style TextAppearance_AppCompat_Widget_DropDownItem
++style TextAppearance_AppCompat_Widget_PopupMenu_Header
++style TextAppearance_AppCompat_Widget_PopupMenu_Large
++style TextAppearance_AppCompat_Widget_PopupMenu_Small
++style TextAppearance_AppCompat_Widget_Switch
++style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
++style TextAppearance_Compat_Notification
++style TextAppearance_Compat_Notification_Info
++style TextAppearance_Compat_Notification_Line2
++style TextAppearance_Compat_Notification_Time
++style TextAppearance_Compat_Notification_Title
++style TextAppearance_Widget_AppCompat_ExpandedMenu_Item
++style TextAppearance_Widget_AppCompat_Toolbar_Subtitle
++style TextAppearance_Widget_AppCompat_Toolbar_Title
++style Theme
++style ThemeOverlay_AppCompat
++style ThemeOverlay_AppCompat_ActionBar
++style ThemeOverlay_AppCompat_Dark
++style ThemeOverlay_AppCompat_Dark_ActionBar
++style ThemeOverlay_AppCompat_DayNight
++style ThemeOverlay_AppCompat_DayNight_ActionBar
++style ThemeOverlay_AppCompat_Dialog
++style ThemeOverlay_AppCompat_Dialog_Alert
++style ThemeOverlay_AppCompat_Light
++style Theme_AppCompat
++style Theme_AppCompat_CompactMenu
++style Theme_AppCompat_DayNight
++style Theme_AppCompat_DayNight_DarkActionBar
++style Theme_AppCompat_DayNight_Dialog
++style Theme_AppCompat_DayNight_DialogWhenLarge
++style Theme_AppCompat_DayNight_Dialog_Alert
++style Theme_AppCompat_DayNight_Dialog_MinWidth
++style Theme_AppCompat_DayNight_NoActionBar
++style Theme_AppCompat_Dialog
++style Theme_AppCompat_DialogWhenLarge
++style Theme_AppCompat_Dialog_Alert
++style Theme_AppCompat_Dialog_MinWidth
++style Theme_AppCompat_Empty
++style Theme_AppCompat_Light
++style Theme_AppCompat_Light_DarkActionBar
++style Theme_AppCompat_Light_Dialog
++style Theme_AppCompat_Light_DialogWhenLarge
++style Theme_AppCompat_Light_Dialog_Alert
++style Theme_AppCompat_Light_Dialog_MinWidth
++style Theme_AppCompat_Light_NoActionBar
++style Theme_AppCompat_NoActionBar
++style Theme_AutofillInlineSuggestion
++style Theme_Catalyst
++style Theme_Catalyst_LogBox
++style Theme_Catalyst_RedBox
++style Theme_FullScreenDialog
++style Theme_FullScreenDialogAnimatedFade
++style Theme_FullScreenDialogAnimatedSlide
++style Theme_ReactNative_AppCompat_Light
++style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen
++style Widget_AppCompat_ActionBar
++style Widget_AppCompat_ActionBar_Solid
++style Widget_AppCompat_ActionBar_TabBar
++style Widget_AppCompat_ActionBar_TabText
++style Widget_AppCompat_ActionBar_TabView
++style Widget_AppCompat_ActionButton
++style Widget_AppCompat_ActionButton_CloseMode
++style Widget_AppCompat_ActionButton_Overflow
++style Widget_AppCompat_ActionMode
++style Widget_AppCompat_ActivityChooserView
++style Widget_AppCompat_AutoCompleteTextView
++style Widget_AppCompat_Button
++style Widget_AppCompat_ButtonBar
++style Widget_AppCompat_ButtonBar_AlertDialog
++style Widget_AppCompat_Button_Borderless
++style Widget_AppCompat_Button_Borderless_Colored
++style Widget_AppCompat_Button_ButtonBar_AlertDialog
++style Widget_AppCompat_Button_Colored
++style Widget_AppCompat_Button_Small
++style Widget_AppCompat_CompoundButton_CheckBox
++style Widget_AppCompat_CompoundButton_RadioButton
++style Widget_AppCompat_CompoundButton_Switch
++style Widget_AppCompat_DrawerArrowToggle
++style Widget_AppCompat_DropDownItem_Spinner
++style Widget_AppCompat_EditText
++style Widget_AppCompat_ImageButton
++style Widget_AppCompat_Light_ActionBar
++style Widget_AppCompat_Light_ActionBar_Solid
++style Widget_AppCompat_Light_ActionBar_Solid_Inverse
++style Widget_AppCompat_Light_ActionBar_TabBar
++style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
++style Widget_AppCompat_Light_ActionBar_TabText
++style Widget_AppCompat_Light_ActionBar_TabText_Inverse
++style Widget_AppCompat_Light_ActionBar_TabView
++style Widget_AppCompat_Light_ActionBar_TabView_Inverse
++style Widget_AppCompat_Light_ActionButton
++style Widget_AppCompat_Light_ActionButton_CloseMode
++style Widget_AppCompat_Light_ActionButton_Overflow
++style Widget_AppCompat_Light_ActionMode_Inverse
++style Widget_AppCompat_Light_ActivityChooserView
++style Widget_AppCompat_Light_AutoCompleteTextView
++style Widget_AppCompat_Light_DropDownItem_Spinner
++style Widget_AppCompat_Light_ListPopupWindow
++style Widget_AppCompat_Light_ListView_DropDown
++style Widget_AppCompat_Light_PopupMenu
++style Widget_AppCompat_Light_PopupMenu_Overflow
++style Widget_AppCompat_Light_SearchView
++style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
++style Widget_AppCompat_ListMenuView
++style Widget_AppCompat_ListPopupWindow
++style Widget_AppCompat_ListView
++style Widget_AppCompat_ListView_DropDown
++style Widget_AppCompat_ListView_Menu
++style Widget_AppCompat_PopupMenu
++style Widget_AppCompat_PopupMenu_Overflow
++style Widget_AppCompat_PopupWindow
++style Widget_AppCompat_ProgressBar
++style Widget_AppCompat_ProgressBar_Horizontal
++style Widget_AppCompat_RatingBar
++style Widget_AppCompat_RatingBar_Indicator
++style Widget_AppCompat_RatingBar_Small
++style Widget_AppCompat_SearchView
++style Widget_AppCompat_SearchView_ActionBar
++style Widget_AppCompat_SeekBar
++style Widget_AppCompat_SeekBar_Discrete
++style Widget_AppCompat_Spinner
++style Widget_AppCompat_Spinner_DropDown
++style Widget_AppCompat_Spinner_DropDown_ActionBar
++style Widget_AppCompat_Spinner_Underlined
++style Widget_AppCompat_TextView
++style Widget_AppCompat_TextView_SpinnerItem
++style Widget_AppCompat_Toolbar
++style Widget_AppCompat_Toolbar_Button_Navigation
++style Widget_Autofill
++style Widget_Autofill_InlineSuggestionChip
++style Widget_Autofill_InlineSuggestionEndIconStyle
++style Widget_Autofill_InlineSuggestionStartIconStyle
++style Widget_Autofill_InlineSuggestionSubtitle
++style Widget_Autofill_InlineSuggestionTitle
++style Widget_Compat_NotificationActionContainer
++style Widget_Compat_NotificationActionText
++style redboxButton
++styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle
++styleable ActionBarLayout android_layout_gravity
++styleable ActionMenuItemView android_minWidth
++styleable ActionMenuView
++styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle
++styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount
++styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout
++styleable AnimatedStateListDrawableCompat android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible
++styleable AnimatedStateListDrawableItem android_drawable android_id
++styleable AnimatedStateListDrawableTransition android_drawable android_fromId android_reversible android_toId
++styleable AppCompatEmojiHelper
++styleable AppCompatImageView android_src srcCompat tint tintMode
++styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode
++styleable AppCompatTextHelper android_drawableBottom android_drawableEnd android_drawableLeft android_drawableRight android_drawableStart android_drawableTop android_textAppearance
++styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType drawableBottomCompat drawableEndCompat drawableLeftCompat drawableRightCompat drawableStartCompat drawableTint drawableTintMode drawableTopCompat emojiCompatEnabled firstBaselineToTopHeight fontFamily fontVariationSettings lastBaselineToBottomHeight lineHeight textAllCaps textLocale
++styleable AppCompatTheme actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseContentDescription actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeTheme actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme android_windowAnimationStyle android_windowIsFloating autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listChoiceIndicatorMultipleAnimated listChoiceIndicatorSingleAnimated listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingEnd listPreferredItemPaddingLeft listPreferredItemPaddingRight listPreferredItemPaddingStart panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle
++styleable Autofill_InlineSuggestion autofillInlineSuggestionChip autofillInlineSuggestionEndIconStyle autofillInlineSuggestionStartIconStyle autofillInlineSuggestionSubtitle autofillInlineSuggestionTitle isAutofillInlineSuggestionTheme
++styleable ButtonBarLayout allowStacking
++styleable Capability queryPatterns shortcutMatchRequired
++styleable CheckedTextView android_checkMark checkMarkCompat checkMarkTint checkMarkTintMode
++styleable ColorStateListItem alpha android_alpha android_color android_lStar lStar
++styleable CompoundButton android_button buttonCompat buttonTint buttonTintMode
++styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness
++styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery fontProviderSystemFontFamily
++styleable FontFamilyFont android_font android_fontStyle android_fontVariationSettings android_fontWeight android_ttcIndex font fontStyle fontVariationSettings fontWeight ttcIndex
++styleable Fragment android_id android_name android_tag
++styleable FragmentContainerView android_name android_tag
++styleable GenericDraweeHierarchy actualImageScaleType backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio
++styleable GradientColor android_centerColor android_centerX android_centerY android_endColor android_endX android_endY android_gradientRadius android_startColor android_startX android_startY android_tileMode android_type
++styleable GradientColorItem android_color android_offset
++styleable LinearLayoutCompat android_baselineAligned android_baselineAlignedChildIndex android_gravity android_orientation android_weightSum divider dividerPadding measureWithLargestChild showDividers
++styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_height android_layout_weight android_layout_width
++styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset
++styleable MenuGroup android_checkableBehavior android_enabled android_id android_menuCategory android_orderInCategory android_visible
++styleable MenuItem actionLayout actionProviderClass actionViewClass alphabeticModifiers android_alphabeticShortcut android_checkable android_checked android_enabled android_icon android_id android_menuCategory android_numericShortcut android_onClick android_orderInCategory android_title android_titleCondensed android_visible contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText
++styleable MenuView android_headerBackground android_horizontalDivider android_itemBackground android_itemIconDisabledAlpha android_itemTextAppearance android_verticalDivider android_windowAnimationStyle preserveIconSpacing subMenuArrow
++styleable PopupWindow android_popupAnimationStyle android_popupBackground overlapAnchor
++styleable PopupWindowBackgroundState state_above_anchor
++styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle
++styleable SearchView android_focusable android_imeOptions android_inputType android_maxWidth closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon
++styleable SimpleDraweeView actualImageResource actualImageScaleType actualImageUri backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio
++styleable Spinner android_dropDownWidth android_entries android_popupBackground android_prompt popupTheme
++styleable StateListDrawable android_constantSize android_dither android_enterFadeDuration android_exitFadeDuration android_variablePadding android_visible
++styleable StateListDrawableItem android_drawable
++styleable SwitchCompat android_textOff android_textOn android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode
++styleable TextAppearance android_fontFamily android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_textColor android_textColorHint android_textColorLink android_textFontWeight android_textSize android_textStyle android_typeface fontFamily fontVariationSettings textAllCaps textLocale
++styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight menu navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor
++styleable View android_focusable android_theme paddingEnd paddingStart theme
++styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode
++styleable ViewStubCompat android_id android_inflatedId android_layout
++xml rn_dev_preferences
+diff --git a/node_modules/react-native-power-saving-mode/android/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/react-native-power-saving-mode/android/build/outputs/logs/manifest-merger-debug-report.txt
+new file mode 100644
+index 0000000..f0b5334
+--- /dev/null
++++ b/node_modules/react-native-power-saving-mode/android/build/outputs/logs/manifest-merger-debug-report.txt
+@@ -0,0 +1,25 @@
++-- Merging decision tree log ---
++manifest
++ADDED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml:2:1-6:12
++INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml:2:1-6:12
++INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml:2:1-6:12
++ package
++ ADDED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml:4:5-33
++ INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ xmlns:android
++ ADDED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml:3:5-63
++uses-sdk
++INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml reason: use-sdk injection requested
++INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ android:targetSdkVersion
++ INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ ADDED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ android:minSdkVersion
++ INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ ADDED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
++ INJECTED from /home/m00np3ngu1n/git/edge-react-gui/node_modules/react-native-power-saving-mode/android/src/main/AndroidManifest.xml
+diff --git a/node_modules/react-native-power-saving-mode/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/node_modules/react-native-power-saving-mode/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
+new file mode 100644
+index 0000000..80b9097
+Binary files /dev/null and b/node_modules/react-native-power-saving-mode/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/src/__tests__/DeepLink.test.ts b/src/__tests__/DeepLink.test.ts
index f485a0694e9..336a2555b69 100644
--- a/src/__tests__/DeepLink.test.ts
+++ b/src/__tests__/DeepLink.test.ts
@@ -134,6 +134,10 @@ describe('parseDeepLink', function () {
'https://deep.edge.app/edge/1234567890a': {
type: 'edgeLogin',
lobbyId: '1234567890a'
+ },
+ 'https://return.edge.app/edge/1234567890a': {
+ type: 'edgeLogin',
+ lobbyId: '1234567890a'
}
})
@@ -226,6 +230,26 @@ describe('parseDeepLink', function () {
}
})
})
+ describe('fiatProvider', function () {
+ makeLinkTests({
+ 'https://deep.edge.app/fiatprovider/buy/moonpay?param=alice': {
+ type: 'fiatProvider',
+ providerId: 'moonpay',
+ direction: 'buy',
+ path: '',
+ query: { param: 'alice' },
+ uri: 'edge://fiatprovider/buy/moonpay?param=alice'
+ },
+ 'https://return.edge.app/fiatprovider/buy/moonpay?param=alice': {
+ type: 'fiatProvider',
+ providerId: 'moonpay',
+ direction: 'buy',
+ path: '',
+ query: { param: 'alice' },
+ uri: 'edge://fiatprovider/buy/moonpay?param=alice'
+ }
+ })
+ })
describe('promotion', function () {
makeLinkTests({
diff --git a/src/__tests__/components/PromoCards.test.tsx b/src/__tests__/components/PromoCards.test.tsx
index efbe9e5fdd2..c614ef580f6 100644
--- a/src/__tests__/components/PromoCards.test.tsx
+++ b/src/__tests__/components/PromoCards.test.tsx
@@ -1,9 +1,9 @@
import { describe, expect, test } from '@jest/globals'
-import { PromoCard2 } from 'edge-info-server'
+import { InfoCard } from 'edge-info-server'
import { filterInfoCards } from '../../components/cards/InfoCardCarousel'
-const dummyCard: PromoCard2 = {
+const dummyCard: InfoCard = {
localeMessages: { en: 'hello' },
background: { darkMode: '', lightMode: '' },
ctaButton: undefined,
@@ -32,18 +32,18 @@ const currentDate = new Date('2024-06-13T20:53:33.013Z')
describe('filterPromoCards', () => {
test('No cards', () => {
- const cards: PromoCard2[] = []
+ const cards: InfoCard[] = []
const result = filterInfoCards({ cards, countryCode: 'US', buildNumber, osType, version, osVersion, currentDate })
expect(result.length).toBe(0)
})
test('Card no filters', () => {
- const cards: PromoCard2[] = [{ ...dummyCard }]
+ const cards: InfoCard[] = [{ ...dummyCard }]
const result = filterInfoCards({ cards, countryCode: 'US', buildNumber, osType, version, osVersion, currentDate })
expect(result.length).toBe(1)
expect(result[0].localeMessages.en).toBe('hello')
})
test('Cards for iOS', () => {
- const cards: PromoCard2[] = [
+ const cards: InfoCard[] = [
{ ...dummyCard, osTypes: ['android'], localeMessages: { en: 'Android message' } },
{ ...dummyCard, osTypes: ['ios'], localeMessages: { en: 'iOS Message' } },
{ ...dummyCard, osTypes: ['web'], localeMessages: { en: 'Web Message' } },
@@ -55,7 +55,7 @@ describe('filterPromoCards', () => {
expect(result[1].localeMessages.en).toBe('Another iOS Message')
})
test('Cards for Android, exactBuildNum', () => {
- const cards: PromoCard2[] = [
+ const cards: InfoCard[] = [
{ ...dummyCard, exactBuildNum: '123', osTypes: ['android'], localeMessages: { en: 'Android message' } },
{ ...dummyCard, exactBuildNum: '432', osTypes: ['ios'], localeMessages: { en: 'iOS Message' } },
{ ...dummyCard, exactBuildNum: '432', osTypes: ['web'], localeMessages: { en: 'Web Message' } },
@@ -66,7 +66,7 @@ describe('filterPromoCards', () => {
expect(result[0].localeMessages.en).toBe('Another Android Message')
})
test('Cards for Android, version', () => {
- const cards: PromoCard2[] = [
+ const cards: InfoCard[] = [
{ ...dummyCard, osTypes: ['android'], localeMessages: { en: 'Android message' }, appVersion: '1.2.3' },
{ ...dummyCard, osTypes: ['ios'], localeMessages: { en: 'iOS Message' } },
{ ...dummyCard, osTypes: ['web'], localeMessages: { en: 'Web Message' } },
@@ -114,7 +114,7 @@ describe('filterPromoCards', () => {
expect(result[1].localeMessages.en).toBe('ES message')
})
test('With installerId', () => {
- const cards: PromoCard2[] = [
+ const cards: InfoCard[] = [
{ ...dummyCard, promoId: 'bob1', localeMessages: { en: 'Bob1 message' } },
{ ...dummyCard, promoId: 'bob2', localeMessages: { en: 'Bob2 Message' } },
{ ...dummyCard, promoId: 'bob3', localeMessages: { en: 'Bob3 Message' } },
@@ -134,7 +134,7 @@ describe('filterPromoCards', () => {
expect(result[0].localeMessages.en).toBe('Bob2 Message')
})
test('With promotions.installerId', () => {
- const cards: PromoCard2[] = [
+ const cards: InfoCard[] = [
{ ...dummyCard, promoId: 'bob1', localeMessages: { en: 'Bob1 message' } },
{ ...dummyCard, promoId: 'bob2', localeMessages: { en: 'Bob2 Message' } },
{ ...dummyCard, promoId: 'bob3', localeMessages: { en: 'Bob3 Message' } },
diff --git a/src/__tests__/reducers/__snapshots__/RootReducer.test.ts.snap b/src/__tests__/reducers/__snapshots__/RootReducer.test.ts.snap
index 49ae6dcf319..4f935e52acd 100644
--- a/src/__tests__/reducers/__snapshots__/RootReducer.test.ts.snap
+++ b/src/__tests__/reducers/__snapshots__/RootReducer.test.ts.snap
@@ -98,7 +98,7 @@ exports[`initialState 1`] = `
},
"autoLogoutTimeInSeconds": 3600,
"changesLocked": true,
- "contactsPermissionOn": true,
+ "contactsPermissionShown": false,
"countryCode": "",
"defaultFiat": "USD",
"defaultIsoFiat": "iso:USD",
diff --git a/src/__tests__/scenes/ChangePasswordScene.test.tsx b/src/__tests__/scenes/ChangePasswordScene.test.tsx
index f2886a6725a..2acddde40a7 100644
--- a/src/__tests__/scenes/ChangePasswordScene.test.tsx
+++ b/src/__tests__/scenes/ChangePasswordScene.test.tsx
@@ -14,7 +14,7 @@ describe('ChangePasswordScene', () => {
const actual = renderer.render(
-
+
)
diff --git a/src/__tests__/scenes/ChangePinScene.test.tsx b/src/__tests__/scenes/ChangePinScene.test.tsx
index 2d7c45b9fd6..a79235f4882 100644
--- a/src/__tests__/scenes/ChangePinScene.test.tsx
+++ b/src/__tests__/scenes/ChangePinScene.test.tsx
@@ -14,7 +14,7 @@ describe('ChangePinComponent', () => {
const actual = renderer.render(
-
+
)
diff --git a/src/__tests__/scenes/DefaultFiatSettingScene.test.tsx b/src/__tests__/scenes/DefaultFiatSettingScene.test.tsx
index c956942dc4c..0a4f69d2704 100644
--- a/src/__tests__/scenes/DefaultFiatSettingScene.test.tsx
+++ b/src/__tests__/scenes/DefaultFiatSettingScene.test.tsx
@@ -12,7 +12,7 @@ describe('DefaultFiatSettingComponent', () => {
const actual = renderer.render(
{
const actual = renderer.render(
{
const actual = renderer.render(
{
const actual = renderer.render(
{
it('should render SettingsScene', () => {
const renderer = TestRenderer.create(
-
+
)
diff --git a/src/__tests__/scenes/SwapSuccessScene.test.tsx b/src/__tests__/scenes/SwapSuccessScene.test.tsx
index 43e3b9bf577..6a70d010ab5 100644
--- a/src/__tests__/scenes/SwapSuccessScene.test.tsx
+++ b/src/__tests__/scenes/SwapSuccessScene.test.tsx
@@ -62,7 +62,7 @@ describe('SwapSuccessSceneComponent', () => {
const renderer = TestRenderer.create(
-
+
)
diff --git a/src/__tests__/scenes/__snapshots__/ChangePasswordScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/ChangePasswordScene.test.tsx.snap
index 927686b50ff..5e9c4973f1a 100644
--- a/src/__tests__/scenes/__snapshots__/ChangePasswordScene.test.tsx.snap
+++ b/src/__tests__/scenes/__snapshots__/ChangePasswordScene.test.tsx.snap
@@ -82,7 +82,7 @@ exports[`ChangePasswordScene should render with loading props 1`] = `
{
"key": "changePassword-0",
"name": "changePassword",
- "params": {},
+ "params": undefined,
}
}
/>
diff --git a/src/__tests__/scenes/__snapshots__/ChangePinScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/ChangePinScene.test.tsx.snap
index 78b7bb5e94d..dee473a2daf 100644
--- a/src/__tests__/scenes/__snapshots__/ChangePinScene.test.tsx.snap
+++ b/src/__tests__/scenes/__snapshots__/ChangePinScene.test.tsx.snap
@@ -82,7 +82,7 @@ exports[`ChangePinComponent should render with loading props 1`] = `
{
"key": "changePin-0",
"name": "changePin",
- "params": {},
+ "params": undefined,
}
}
/>
diff --git a/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap b/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap
index 77736f2f035..c68179725b9 100644
--- a/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap
+++ b/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap
@@ -9855,46 +9855,22 @@ exports[`SendScene2 2 spendTargets lock tiles 1`] = `
}
/>
diff --git a/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap
index 0dc2311b829..7b808a23f29 100644
--- a/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap
+++ b/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap
@@ -250,39 +250,30 @@ exports[`TransactionDetailsScene should render 1`] = `
]
}
>
-
-
-
+
+
-
-
-
+
+
string
}
-export const getCountryCodeByIp = async (): Promise => {
+export const getCountryCodeByIp = async (): Promise => {
const apiKey = ENV.IP_API_KEY ?? ''
- let out = '--'
+
try {
const reply = await fetch(`https://pro.ip-api.com/json/?key=${apiKey}`)
const { countryCode } = asIpApi(await reply.json())
- out = countryCode
+ return countryCode
} catch (e: any) {
- console.error(e.message)
+ console.warn(`getCountryCodeByIp() failed: ${String(e)}`)
+ return undefined
}
- return out
}
/**
diff --git a/src/actions/BackupModalActions.tsx b/src/actions/BackupModalActions.tsx
index c7a22f6cbb4..bed703c4849 100644
--- a/src/actions/BackupModalActions.tsx
+++ b/src/actions/BackupModalActions.tsx
@@ -23,7 +23,7 @@ export const showBackupModal = (props: { navigation: NavigationBase; forgetLogin
})
.then((userSel?: BackupModalResult) => {
if (userSel === 'upgrade') {
- navigation.navigate('upgradeUsername', {})
+ navigation.navigate('upgradeUsername')
}
})
.finally(() => {
@@ -43,7 +43,7 @@ export const checkAndShowLightBackupModal = (account: EdgeAccount, navigation: N
})
.then((userSel?: BackupForTransferModalResult) => {
if (userSel === 'upgrade') {
- navigation.navigate('upgradeUsername', {})
+ navigation.navigate('upgradeUsername')
}
})
.finally(() => {
diff --git a/src/actions/CategoriesActions.ts b/src/actions/CategoriesActions.ts
index 95ae91518d3..3e0623f2b31 100644
--- a/src/actions/CategoriesActions.ts
+++ b/src/actions/CategoriesActions.ts
@@ -324,6 +324,8 @@ export const getTxActionDisplayInfo = (tx: EdgeTransaction, account: EdgeAccount
const { assetActionType } = assetAct
payeeText = TX_ACTION_LABEL_MAP[assetActionType]
+ let unsupported = false
+
switch (actionType) {
case 'swap': {
iconPluginId = action.swapInfo.pluginId
@@ -379,7 +381,7 @@ export const getTxActionDisplayInfo = (tx: EdgeTransaction, account: EdgeAccount
break
}
default:
- console.error(`Unsupported EdgeTxAction assetAction:assetActionType: '${assetAction}:${assetActionType}'`)
+ unsupported = true
}
break
}
@@ -450,7 +452,7 @@ export const getTxActionDisplayInfo = (tx: EdgeTransaction, account: EdgeAccount
}
default:
- console.error(`Unsupported EdgeTxAction assetAction:assetActionType: '${assetAction}:${assetActionType}'`)
+ unsupported = true
}
break
}
@@ -479,13 +481,26 @@ export const getTxActionDisplayInfo = (tx: EdgeTransaction, account: EdgeAccount
break
}
default:
- console.error(`Unsupported EdgeTxAction assetAction:assetActionType: '${assetAction}:${assetActionType}'`)
+ unsupported = true
+ }
+ break
+ }
+ case 'tokenApproval': {
+ switch (assetActionType) {
+ case 'tokenApproval': {
+ edgeCategory = { category: 'expense', subcategory: lstrings.wc_smartcontract_network_fee }
+ break
+ }
+ default:
+ unsupported = true
}
break
}
default:
- console.error(`Unsupported EdgeTxAction assetAction: '${assetAction}'`)
+ unsupported = true
}
+
+ if (unsupported) console.error(`Unsupported EdgeTxAction assetAction:assetActionType '${assetAction}:${assetActionType}'`)
}
const savedData: EdgeMetadata = {
name: payeeText,
@@ -521,6 +536,7 @@ export const pluginIdIcons: Record = {
godex: EDGE_CONTENT_SERVER_URI + '/godex.png',
letsexchange: EDGE_CONTENT_SERVER_URI + '/letsexchange-logo.png',
lifi: EDGE_CONTENT_SERVER_URI + '/lifi.png',
+ mayaprotocol: EDGE_CONTENT_SERVER_URI + '/mayaprotocol.png',
rango: EDGE_CONTENT_SERVER_URI + '/rango.png',
sideshift: EDGE_CONTENT_SERVER_URI + '/sideshift-logo.png',
simplex: EDGE_CONTENT_SERVER_URI + '/simplex.png',
diff --git a/src/actions/DeepLinkingActions.tsx b/src/actions/DeepLinkingActions.tsx
index 489875c9bd3..075644a3497 100644
--- a/src/actions/DeepLinkingActions.tsx
+++ b/src/actions/DeepLinkingActions.tsx
@@ -8,7 +8,7 @@ import { pickWallet } from '../components/modals/WalletListModal'
import { Airship, showError, showToast, showToastSpinner } from '../components/services/AirshipInstance'
import { guiPlugins } from '../constants/plugins/GuiPlugins'
import { lstrings } from '../locales/strings'
-import { executePlugin } from '../plugins/gui/fiatPlugin'
+import { executePlugin, fiatProviderDeeplinkHandler } from '../plugins/gui/fiatPlugin'
import { DeepLink } from '../types/DeepLinkTypes'
import { Dispatch, RootState, ThunkAction } from '../types/reduxTypes'
import { NavigationBase } from '../types/routerTypes'
@@ -123,6 +123,11 @@ async function handleLink(navigation: NavigationBase, dispatch: Dispatch, state:
break
}
+ case 'fiatProvider': {
+ fiatProviderDeeplinkHandler(link)
+ break
+ }
+
case 'promotion':
await dispatch(activatePromotion(link.installerId ?? ''))
break
@@ -157,7 +162,7 @@ async function handleLink(navigation: NavigationBase, dispatch: Dispatch, state:
} else {
showError(lstrings.azteco_service_unavailable)
}
- navigation.navigate('homeTab', { screen: 'home' })
+ navigation.navigate('home')
break
}
diff --git a/src/actions/LocalSettingsActions.ts b/src/actions/LocalSettingsActions.ts
index b3adef09202..0e2b32f165c 100644
--- a/src/actions/LocalSettingsActions.ts
+++ b/src/actions/LocalSettingsActions.ts
@@ -1,11 +1,6 @@
import { EdgeAccount } from 'edge-core-js'
-import { openSettings, PermissionStatus, request } from 'react-native-permissions'
-import { sprintf } from 'sprintf-js'
import { showError } from '../components/services/AirshipInstance'
-import { lstrings } from '../locales/strings'
-import { permissionNames } from '../reducers/PermissionsReducer'
-import { config } from '../theme/appConfig'
import { ThunkAction } from '../types/reduxTypes'
import { AccountNotifDismissInfo, asLocalAccountSettings, LocalAccountSettings, PasswordReminder, SpendingLimits } from '../types/types'
import { logActivity } from '../util/logger'
@@ -71,43 +66,6 @@ export function setSpamFilterOn(spamFilterOn: boolean): ThunkAction {
}
}
-/**
- * Toggle the 'Contacts Access' Edge setting. Will request permissions if
- * toggled on/enabled AND system-level contacts permissions are not granted.
- * Does NOT modify system-level contacts permissions if toggling the 'Contacts
- * Access' setting OFF
- */
-export function setContactsPermissionOn(contactsPermissionOn: boolean): ThunkAction> {
- return async (dispatch, getState) => {
- const state = getState()
- const { account } = state.core
-
- await writeContactsPermissionSetting(account, contactsPermissionOn)
-
- if (contactsPermissionOn) {
- // Initial prompt to inform the reason of the permissions request.
- // Denying this prompt will cause permissionStatus to be 'blocked',
- // regardless of the prior permissions state.
- await request(permissionNames.contacts, {
- title: lstrings.contacts_permission_modal_title,
- message: sprintf(lstrings.contacts_permission_modal_body_1, config.appName),
- buttonPositive: lstrings.string_allow,
- buttonNegative: lstrings.string_deny
- })
- .then(async (permissionStatus: PermissionStatus) => {
- // Can't request permission from within the app if previously blocked
- if (permissionStatus === 'blocked') await openSettings()
- })
- // Handle any other potential failure in enabling the permission
- // progmatically from within Edge by redirecting to the system settings
- // instead. Any manual change in system settings causes an app restart.
- .catch(async _e => await openSettings())
- }
-
- dispatch({ type: 'UI/SETTINGS/SET_CONTACTS_PERMISSION', data: { contactsPermissionOn } })
- }
-}
-
const writePasswordReminderSetting = async (account: EdgeAccount, passwordReminder: PasswordReminder) =>
await readLocalAccountSettings(account).then(async settings => {
const updatedSettings = { ...settings, passwordReminder }
@@ -135,9 +93,9 @@ const writeSpamFilterSetting = async (account: EdgeAccount, spamFilterOn: boolea
})
}
-const writeContactsPermissionSetting = async (account: EdgeAccount, contactsPermissionOn: boolean) => {
+export const writeContactsPermissionShown = async (account: EdgeAccount, contactsPermissionShown: boolean) => {
return await readLocalAccountSettings(account).then(async settings => {
- const updatedSettings = { ...settings, contactsPermissionOn }
+ const updatedSettings = { ...settings, contactsPermissionShown }
return await writeLocalAccountSettings(account, updatedSettings)
})
}
diff --git a/src/actions/LoginActions.tsx b/src/actions/LoginActions.tsx
index 2106fa927c9..669d82a4982 100644
--- a/src/actions/LoginActions.tsx
+++ b/src/actions/LoginActions.tsx
@@ -86,8 +86,11 @@ export function initializeAccount(navigation: NavigationBase, account: EdgeAccou
// during account creation
await readLocalAccountSettings(account)
- const newAccountFlow = async (navigation: NavigationProp<'createWalletSelectCrypto'>, items: WalletCreateItem[]) => {
- navigation.replace('edgeTabs', { screen: 'homeTab', params: { screen: 'home' } })
+ const newAccountFlow = async (
+ navigation: NavigationProp<'createWalletSelectCrypto' | 'createWalletSelectCryptoNewAccount'>,
+ items: WalletCreateItem[]
+ ) => {
+ navigation.replace('edgeTabs', { screen: 'home' })
const createWalletsPromise = createCustomWallets(account, fiatCurrencyCode, items, dispatch).catch(error => showError(error))
// New user FIO handle registration flow (if env is properly configured)
@@ -114,7 +117,13 @@ export function initializeAccount(navigation: NavigationBase, account: EdgeAccou
performance.mark('loginEnd', { detail: { isNewAccount: newAccount } })
} else {
- rootNavigation.replace('edgeApp', {})
+ rootNavigation.replace('edgeApp', {
+ screen: 'edgeAppStack',
+ params: {
+ screen: 'edgeTabs',
+ params: { screen: 'home' }
+ }
+ })
referralPromise.catch(() => console.log(`Failed to load account referral info`))
performance.mark('loginEnd', { detail: { isNewAccount: newAccount } })
@@ -157,7 +166,7 @@ export function initializeAccount(navigation: NavigationBase, account: EdgeAccou
// Check for security alerts:
if (hasSecurityAlerts(account)) {
- navigation.push('securityAlerts', {})
+ navigation.push('securityAlerts')
hideSurvey = true
}
diff --git a/src/actions/RecoveryReminderActions.tsx b/src/actions/RecoveryReminderActions.tsx
index d283ce2bb2d..51b55ce93e8 100644
--- a/src/actions/RecoveryReminderActions.tsx
+++ b/src/actions/RecoveryReminderActions.tsx
@@ -54,5 +54,5 @@ async function showReminderModal(navigation: NavigationBase) {
}}
/>
))
- if (reply === 'ok') navigation.push('passwordRecovery', {})
+ if (reply === 'ok') navigation.push('passwordRecovery')
}
diff --git a/src/actions/ScanActions.tsx b/src/actions/ScanActions.tsx
index b7b75c1da22..e990e839eb5 100644
--- a/src/actions/ScanActions.tsx
+++ b/src/actions/ScanActions.tsx
@@ -15,7 +15,7 @@ import { config } from '../theme/appConfig'
import { RequestAddressLink } from '../types/DeepLinkTypes'
import { Dispatch, RootState, ThunkAction } from '../types/reduxTypes'
import { NavigationBase } from '../types/routerTypes'
-import { getCurrencyCode, getWalletTokenId } from '../util/CurrencyInfoHelpers'
+import { getCurrencyCode } from '../util/CurrencyInfoHelpers'
import { parseDeepLink } from '../util/DeepLinkParser'
import { logActivity } from '../util/logger'
import { makeCurrencyCodeTable, upgradeCurrencyCodes } from '../util/tokenIdTools'
@@ -103,14 +103,13 @@ export const doRequestAddress = async (navigation: NavigationBase, account: Edge
)).then(async result => {
if (result?.type === 'wallet') {
- const { walletId, currencyCode } = result
+ const { walletId, tokenId } = result
const { currencyWallets } = account
const wallet = currencyWallets[walletId]
- const tokenId = getWalletTokenId(wallet, currencyCode)
// TODO: Extend getReceiveAddress() to generate the full bitcion:XXXX address instead of using raw addresses here
const { publicAddress } = await wallet.getReceiveAddress({ tokenId })
- jsonPayloadMap[`${currencyWallets[walletId].currencyInfo.currencyCode}_${currencyCode}`] = publicAddress
+ jsonPayloadMap[`${currencyWallets[walletId].currencyInfo.currencyCode}_${getCurrencyCode(wallet, tokenId)}`] = publicAddress
}
})
}
diff --git a/src/actions/SettingsActions.tsx b/src/actions/SettingsActions.tsx
index 5eb0154d187..40a8e90b6bd 100644
--- a/src/actions/SettingsActions.tsx
+++ b/src/actions/SettingsActions.tsx
@@ -276,7 +276,7 @@ export function showRestoreWalletsModal(navigation: NavigationBase): ThunkAction
)
logActivity(`Restore Wallets: ${account.username}`)
- navigation.navigate('homeTab', { screen: 'home' })
+ navigation.navigate('home')
}
}
}
diff --git a/src/actions/WalletActions.tsx b/src/actions/WalletActions.tsx
index fae1fcd4233..6abcfeb8b81 100644
--- a/src/actions/WalletActions.tsx
+++ b/src/actions/WalletActions.tsx
@@ -11,10 +11,10 @@ import { Airship, showError, showToast } from '../components/services/AirshipIns
import { getSpecialCurrencyInfo, SPECIAL_CURRENCY_INFO } from '../constants/WalletAndCurrencyConstants'
import { lstrings } from '../locales/strings'
import { selectDisplayDenomByCurrencyCode } from '../selectors/DenominationSelectors'
-import { Dispatch, RootState, ThunkAction } from '../types/reduxTypes'
+import { ThunkAction } from '../types/reduxTypes'
import { NavigationBase } from '../types/routerTypes'
import { MapObject } from '../types/types'
-import { getCurrencyCode, getToken, isKeysOnlyPlugin } from '../util/CurrencyInfoHelpers'
+import { getCurrencyCode, isKeysOnlyPlugin } from '../util/CurrencyInfoHelpers'
import { getWalletName } from '../util/CurrencyWalletHelpers'
import { fetchInfo } from '../util/network'
import { convertCurrencyFromExchangeRates } from '../util/utils'
@@ -53,7 +53,7 @@ export function selectWalletToken({ navigation, walletId, tokenId, alwaysActivat
if (tokenId != null) {
const { unactivatedTokenIds } = wallet
if (unactivatedTokenIds.find(unactivatedTokenId => unactivatedTokenId === tokenId) != null) {
- await activateWalletTokens(dispatch, state, navigation, wallet, [tokenId])
+ await dispatch(activateWalletTokens(navigation, wallet, [tokenId]))
return false
}
if (walletId !== currentWalletId || currencyCode !== currentWalletCurrencyCode) {
@@ -147,101 +147,97 @@ export function updateMostRecentWalletsSelected(walletId: string, tokenId: EdgeT
}
}
-const activateWalletTokens = async (
- dispatch: Dispatch,
- state: RootState,
- navigation: NavigationBase,
- wallet: EdgeCurrencyWallet,
- tokenIds?: string[]
-): Promise => {
- if (tokenIds == null) throw new Error('Activating mainnet wallets unsupported')
- const { account } = state.core
- const { defaultIsoFiat, defaultFiat } = state.ui.settings
- const { assetOptions } = await account.getActivationAssets({ activateWalletId: wallet.id, activateTokenIds: tokenIds })
- const { pluginId } = wallet.currencyInfo
-
- // See if there is only one wallet option for activation
- if (assetOptions.length === 1 && assetOptions[0].paymentWalletId != null) {
- const { paymentWalletId, tokenId } = assetOptions[0]
- const activationQuote = await account.activateWallet({
- activateWalletId: wallet.id,
- activateTokenIds: tokenIds,
- paymentInfo: {
- walletId: paymentWalletId,
- tokenId
- }
- })
- const tokensText = tokenIds.map(tokenId => {
- const { currencyCode, displayName } = getToken(wallet, tokenId) ?? {}
- return `${displayName} (${currencyCode})`
- })
- const tileTitle = tokenIds.length > 1 ? lstrings.activate_wallet_tokens_scene_tile_title : lstrings.activate_wallet_token_scene_tile_title
- const tileBody = tokensText.join(', ')
-
- const { networkFee } = activationQuote
- const { nativeAmount: nativeFee, currencyPluginId, tokenId: feeTokenId } = networkFee
- if (currencyPluginId !== pluginId) throw new Error('Internal Error: Fee asset mismatch.')
-
- const paymentCurrencyCode = getCurrencyCode(wallet, feeTokenId)
-
- const exchangeNetworkFee = await wallet.nativeToDenomination(nativeFee, paymentCurrencyCode)
- const feeDenom = selectDisplayDenomByCurrencyCode(state, wallet.currencyConfig, paymentCurrencyCode)
- const displayFee = div(nativeFee, feeDenom.multiplier, log10(feeDenom.multiplier))
- let fiatFee = convertCurrencyFromExchangeRates(state.exchangeRates, paymentCurrencyCode, defaultIsoFiat, exchangeNetworkFee)
- if (lt(fiatFee, '0.001')) fiatFee = '<0.001'
- else fiatFee = round(fiatFee, -3)
- const feeString = `${displayFee} ${feeDenom.name} (${fiatFee} ${defaultFiat})`
- let bodyText = lstrings.activate_wallet_token_scene_body
-
- const { tokenActivationAdditionalReserveText } = SPECIAL_CURRENCY_INFO[pluginId] ?? {}
- if (tokenActivationAdditionalReserveText != null) {
- bodyText += '\n\n' + tokenActivationAdditionalReserveText
- }
-
- navigation.navigate('confirmScene', {
- titleText: lstrings.activate_wallet_token_scene_title,
- bodyText,
- infoTiles: [
- { label: tileTitle, value: tileBody },
- { label: lstrings.mining_fee, value: feeString }
- ],
- onConfirm: (resetSlider: () => void) => {
- if (lt(wallet.balanceMap.get(feeTokenId) ?? '0', nativeFee)) {
- const msg = tokenIds.length > 1 ? lstrings.activate_wallet_tokens_insufficient_funds_s : lstrings.activate_wallet_token_insufficient_funds_s
- Airship.show<'ok' | undefined>(bridge => (
-
- )).catch(err => showError(err))
- navigation.pop()
- return
+export function activateWalletTokens(navigation: NavigationBase, wallet: EdgeCurrencyWallet, tokenIds: EdgeTokenId[]): ThunkAction> {
+ return async (_dispatch, getState) => {
+ const state = getState()
+ const { account } = state.core
+ const { defaultIsoFiat, defaultFiat } = state.ui.settings
+ const { assetOptions } = await account.getActivationAssets({ activateWalletId: wallet.id, activateTokenIds: tokenIds })
+ const { pluginId } = wallet.currencyInfo
+
+ // See if there is only one wallet option for activation
+ if (assetOptions.length === 1 && assetOptions[0].paymentWalletId != null) {
+ const { paymentWalletId, tokenId } = assetOptions[0]
+ const activationQuote = await account.activateWallet({
+ activateWalletId: wallet.id,
+ activateTokenIds: tokenIds,
+ paymentInfo: {
+ walletId: paymentWalletId,
+ tokenId
}
+ })
+ const tokensText = tokenIds.map(tokenId => {
+ const { currencyCode, displayName } = tokenId != null ? wallet.currencyConfig.allTokens[tokenId] : wallet.currencyInfo
+ return `${displayName} (${currencyCode})`
+ })
+ const tileTitle = tokenIds.length > 1 ? lstrings.activate_wallet_tokens_scene_tile_title : lstrings.activate_wallet_token_scene_tile_title
+ const tileBody = tokensText.join(', ')
+
+ const { networkFee } = activationQuote
+ const { nativeAmount: nativeFee, currencyPluginId, tokenId: feeTokenId } = networkFee
+ if (currencyPluginId !== pluginId) throw new Error('Internal Error: Fee asset mismatch.')
+
+ const paymentCurrencyCode = getCurrencyCode(wallet, feeTokenId)
+
+ const exchangeNetworkFee = await wallet.nativeToDenomination(nativeFee, paymentCurrencyCode)
+ const feeDenom = selectDisplayDenomByCurrencyCode(state, wallet.currencyConfig, paymentCurrencyCode)
+ const displayFee = div(nativeFee, feeDenom.multiplier, log10(feeDenom.multiplier))
+ let fiatFee = convertCurrencyFromExchangeRates(state.exchangeRates, paymentCurrencyCode, defaultIsoFiat, exchangeNetworkFee)
+ if (lt(fiatFee, '0.001')) fiatFee = '<0.001'
+ else fiatFee = round(fiatFee, -3)
+ const feeString = `${displayFee} ${feeDenom.name} (${fiatFee} ${defaultFiat})`
+ let bodyText = lstrings.activate_wallet_token_scene_body
+
+ const { tokenActivationAdditionalReserveText } = SPECIAL_CURRENCY_INFO[pluginId] ?? {}
+ if (tokenActivationAdditionalReserveText != null) {
+ bodyText += '\n\n' + tokenActivationAdditionalReserveText
+ }
- const name = activateWalletName[pluginId]?.name ?? lstrings.activate_wallet_token_transaction_name_category_generic
- const notes = activateWalletName[pluginId]?.notes ?? lstrings.activate_wallet_token_transaction_notes_generic
- activationQuote
- .approve({
- metadata: {
- name,
- category: `Expense:${lstrings.activate_wallet_token_transaction_name_category_generic}`,
- notes
- }
- })
- .then(result => {
- showToast(lstrings.activate_wallet_token_success, ACTIVATION_TOAST_AUTO_HIDE_MS)
- navigation.pop()
- })
- .catch(e => {
+ navigation.navigate('confirmScene', {
+ titleText: lstrings.activate_wallet_token_scene_title,
+ bodyText,
+ infoTiles: [
+ { label: tileTitle, value: tileBody },
+ { label: lstrings.mining_fee, value: feeString }
+ ],
+ onConfirm: (resetSlider: () => void) => {
+ if (lt(wallet.balanceMap.get(feeTokenId) ?? '0', nativeFee)) {
+ const msg = tokenIds.length > 1 ? lstrings.activate_wallet_tokens_insufficient_funds_s : lstrings.activate_wallet_token_insufficient_funds_s
+ Airship.show<'ok' | undefined>(bridge => (
+
+ )).catch(err => showError(err))
navigation.pop()
- showError(e)
- })
- }
- })
- } else {
- throw new Error('Activation with multiple wallet options not supported yet')
+ return
+ }
+
+ const name = activateWalletName[pluginId]?.name ?? lstrings.activate_wallet_token_transaction_name_category_generic
+ const notes = activateWalletName[pluginId]?.notes ?? lstrings.activate_wallet_token_transaction_notes_generic
+ activationQuote
+ .approve({
+ metadata: {
+ name,
+ category: `Expense:${lstrings.activate_wallet_token_transaction_name_category_generic}`,
+ notes
+ }
+ })
+ .then(result => {
+ showToast(lstrings.activate_wallet_token_success, ACTIVATION_TOAST_AUTO_HIDE_MS)
+ navigation.pop()
+ })
+ .catch(e => {
+ navigation.pop()
+ showError(e)
+ })
+ }
+ })
+ } else {
+ throw new Error('Activation with multiple wallet options not supported yet')
+ }
}
}
diff --git a/src/components/FioAddress/DomainListModal.tsx b/src/components/FioAddress/DomainListModal.tsx
index 947fd989d83..60673a7bee5 100644
--- a/src/components/FioAddress/DomainListModal.tsx
+++ b/src/components/FioAddress/DomainListModal.tsx
@@ -113,7 +113,7 @@ class DomainListModalComponent extends React.Component {
registerNewDomain = () => {
const { bridge, navigation } = this.props
bridge.resolve(undefined)
- navigation.navigate('fioDomainRegister', {})
+ navigation.navigate('fioDomainRegister')
}
selectItem = (value: any) => this.props.bridge.resolve(value)
diff --git a/src/components/Main.tsx b/src/components/Main.tsx
index 636325e1964..bc7d9a9a609 100644
--- a/src/components/Main.tsx
+++ b/src/components/Main.tsx
@@ -1,4 +1,4 @@
-import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'
+import { BottomTabNavigationOptions, createBottomTabNavigator } from '@react-navigation/bottom-tabs'
import { createDrawerNavigator } from '@react-navigation/drawer'
import { DefaultTheme, NavigationContainer } from '@react-navigation/native'
import { createStackNavigator, StackNavigationOptions } from '@react-navigation/stack'
@@ -20,7 +20,17 @@ import { RewardsCardDashboardScene as RewardsCardListSceneComponent } from '../p
import { RewardsCardWelcomeScene as RewardsCardWelcomeSceneComponent } from '../plugins/gui/scenes/RewardsCardWelcomeScene'
import { SepaFormScene } from '../plugins/gui/scenes/SepaFormScene'
import { useDispatch, useSelector } from '../types/reactRedux'
-import { AppParamList, EdgeSceneProps, NavigationBase } from '../types/routerTypes'
+import {
+ BuyTabParamList,
+ DrawerParamList,
+ EdgeAppStackParamList,
+ EdgeSceneProps,
+ EdgeTabsParamList,
+ NavigationBase,
+ RootParamList,
+ SwapTabParamList,
+ WalletsTabParamList
+} from '../types/routerTypes'
import { isMaestro } from '../util/maestro'
import { logEvent } from '../util/tracking'
import { ifLoggedIn } from './hoc/IfLoggedIn'
@@ -209,13 +219,17 @@ const WcDisconnectScene = ifLoggedIn(WcDisconnectSceneComponent)
const WebViewScene = ifLoggedIn(WebViewSceneComponent)
const HomeScene = ifLoggedIn(HomeSceneComponent)
-const Drawer = createDrawerNavigator()
-const Stack = createStackNavigator()
-const Tab = createBottomTabNavigator()
+const RootStack = createStackNavigator()
+const Drawer = createDrawerNavigator()
+const AppStack = createStackNavigator()
+const Tabs = createBottomTabNavigator()
+const SwapStack = createStackNavigator()
+const BuyStack = createStackNavigator()
+const WalletsStack = createStackNavigator()
const headerMode = isMaestro() && Platform.OS === 'android' ? 'float' : undefined
-const defaultScreenOptions: StackNavigationOptions = {
+const defaultScreenOptions: StackNavigationOptions & BottomTabNavigationOptions = {
title: '',
headerTitle: EdgeHeader,
headerLeft: () => ,
@@ -226,7 +240,7 @@ const defaultScreenOptions: StackNavigationOptions = {
headerBackground: HeaderBackground,
headerTransparent: true
}
-const firstSceneScreenOptions: StackNavigationOptions = {
+const firstSceneScreenOptions: StackNavigationOptions & BottomTabNavigationOptions = {
headerLeft: () => ,
headerTitle: EdgeHeader,
headerTitleAlign: 'center'
@@ -236,39 +250,31 @@ const firstSceneScreenOptions: StackNavigationOptions = {
// Tab router
// -------------------------------------------------------------------------
-const EdgeHomeTabScreen = () => {
- return (
-
-
-
- )
-}
-
const EdgeWalletsTabScreen = () => {
return (
-
-
+
}}
/>
-
-
+ fromParams={params => params.walletName} /> }}
/>
-
+
)
}
const EdgeBuyTabScreen = () => {
return (
-
-
-
+
+ {
headerLeft: () =>
}}
/>
- null
}}
/>
- null
}}
/>
- null
}}
/>
- null
}}
/>
-
-
-
-
+
+
+
+
)
}
const EdgeSellTabScreen = () => {
return (
-
-
-
+
+ {
headerLeft: () =>
}}
/>
- null
}}
/>
- null
}}
/>
- null
}}
/>
- null
}}
/>
-
-
-
-
+
+
+
+
)
}
const EdgeSwapTabScreen = () => {
return (
-
-
+ {
title: lstrings.title_exchange
}}
/>
-
-
+ {
headerRight: () => null
}}
/>
-
+
)
}
const EdgeTabs = () => {
const { defaultScreen } = getDeviceSettings()
- const initialRouteName = defaultScreen === 'assets' ? 'walletsTab' : 'homeTab'
+ const initialRouteName = defaultScreen === 'assets' ? 'walletsTab' : 'home'
return (
- }
screenOptions={{
headerShown: false
}}
>
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
)
}
@@ -414,8 +420,8 @@ const EdgeTabs = () => {
const EdgeAppStack = () => {
return (
-
-
+ {
}}
/>
-
}}
/>
- {
headerRight: () => null
}}
/>
- {
headerRight: () => null
}}
/>
-
-
-
-
+
+
+ {
headerRight: () =>
}}
/>
- {
headerRight: () =>
}}
/>
- {
headerRight: () => null
}}
/>
- null
}}
/>
- null
}}
/>
-
-
+ {
headerLeft: () => null
}}
/>
-
-
+ {
headerRight: () => null
}}
/>
- {
headerRight: () => null
}}
/>
- {
headerRight: () => null
}}
/>
- null
}}
/>
-
-
+ null
}}
/>
- {
headerRight: () => null
}}
/>
- null
}}
/>
-
}}
/>
-
-
-
-
+
+
+ null
}}
/>
- {
headerLeft: () => null
}}
/>
-
-
-
+
+
- null
}}
/>
-
-
+ {
headerRight: () => null
}}
/>
-
-
+ null
}}
/>
-
-
-
+
+ null
}}
/>
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ {
}}
/>
-
-
-
-
+
+
+ {
headerRight: () => null
}}
/>
-
-
+ {
headerRight: () => null
}}
/>
-
-
+ {
headerRight: () => null
}}
/>
-
-
+ {
headerRight: () => null
}}
/>
- {
headerRight: () => null
}}
/>
-
- {
headerLeft: () =>
}}
/>
- {
headerRight: () => null
}}
/>
-
-
-
-
+
+
+
- {
headerRight: () => null
}}
/>
-
-
-
-
+
+
+
}}
/>
- {
headerRight: () => null
}}
/>
-
-
-
-
+
+
+ fromParams={params => params.title} />
}}
/>
-
+
)
}
@@ -835,28 +841,28 @@ export const Main = () => {
) : (
-
-
+
-
+
{(props: EdgeSceneProps<'gettingStarted'>) => {
- if (navigation == null) setTimeout(() => setNavigation(props.navigation), 0)
+ if (navigation == null) setTimeout(() => setNavigation(props.navigation as NavigationBase), 0)
return
}}
-
+
-
+
{(props: EdgeSceneProps<'login'>) => {
- if (navigation == null) setTimeout(() => setNavigation(props.navigation), 0)
+ if (navigation == null) setTimeout(() => setNavigation(props.navigation as NavigationBase), 0)
return
}}
-
-
+
+
{navigation == null ? null : }
)}
diff --git a/src/components/cards/InfoCard.tsx b/src/components/cards/InfoCard.tsx
index 18800e669b3..d75d2f05432 100644
--- a/src/components/cards/InfoCard.tsx
+++ b/src/components/cards/InfoCard.tsx
@@ -1,4 +1,4 @@
-import { PromoCard2 } from 'edge-info-server'
+import { InfoCard } from 'edge-info-server'
import * as React from 'react'
import { View } from 'react-native'
import FastImage from 'react-native-fast-image'
@@ -16,11 +16,11 @@ import { EdgeText } from '../themed/EdgeText'
import { EdgeCard } from './EdgeCard'
export interface FilteredInfoCard {
- background: PromoCard2['background']
- ctaButton: PromoCard2['ctaButton']
- dismissable: PromoCard2['dismissable']
- localeMessages: PromoCard2['localeMessages']
- pluginPromotions: PromoCard2['pluginPromotions']
+ background: InfoCard['background']
+ ctaButton: InfoCard['ctaButton']
+ dismissable: InfoCard['dismissable']
+ localeMessages: InfoCard['localeMessages']
+ pluginPromotions: InfoCard['pluginPromotions']
messageId: string
}
@@ -30,7 +30,7 @@ interface Props {
onClose: () => Promise
}
-export function InfoCard(props: Props) {
+export function InfoCarouselCard(props: Props) {
const theme = useTheme()
const styles = getStyles(theme)
const dispatch = useDispatch()
diff --git a/src/components/cards/InfoCardCarousel.tsx b/src/components/cards/InfoCardCarousel.tsx
index 207e830878e..a88459d30e7 100644
--- a/src/components/cards/InfoCardCarousel.tsx
+++ b/src/components/cards/InfoCardCarousel.tsx
@@ -1,5 +1,5 @@
import { asDate } from 'cleaners'
-import { AssetStatus2, PromoCard2 } from 'edge-info-server'
+import { InfoCard } from 'edge-info-server'
import * as React from 'react'
import { ListRenderItem, Platform } from 'react-native'
import { getBuildNumber, getVersion } from 'react-native-device-info'
@@ -15,14 +15,13 @@ import { getOsVersion } from '../../util/utils'
import { Anim, EdgeAnim } from '../common/EdgeAnim'
import { EdgeCarousel } from '../common/EdgeCarousel'
import { useTheme } from '../services/ThemeContext'
-import { FilteredInfoCard, InfoCard } from './InfoCard'
+import { FilteredInfoCard, InfoCarouselCard } from './InfoCard'
interface Props {
navigation: NavigationBase
enterAnim: Anim
screenWidth: number
- // TODO: Add info server InfoCard export
- cards?: PromoCard2[] | AssetStatus2[]
+ cards?: InfoCard[]
countryCode?: string
}
@@ -73,7 +72,7 @@ export const InfoCardCarousel = (props: Props) => {
const handleClose = async (): Promise => {
await dispatch(hideMessageTweak(item.messageId, { type: 'account' }))
}
- return
+ return
})
if (activeCards == null || activeCards.length === 0) return null
@@ -89,7 +88,7 @@ export const InfoCardCarousel = (props: Props) => {
* other factors.
*/
export function filterInfoCards(params: {
- cards: PromoCard2[] | AssetStatus2[]
+ cards: InfoCard[]
countryCode?: string
buildNumber: string
osType: string
diff --git a/src/components/hoc/withLoanAccount.tsx b/src/components/hoc/withLoanAccount.tsx
index 0b47ecfb757..70a3157776b 100644
--- a/src/components/hoc/withLoanAccount.tsx
+++ b/src/components/hoc/withLoanAccount.tsx
@@ -26,7 +26,7 @@ export function withLoanAccount(
const loanAccount = loanAccounts[route.params.loanAccountId]
React.useEffect(() => {
- if (loanAccount == null) navigation.navigate('loanDashboard', {})
+ if (loanAccount == null) navigation.navigate('loanDashboard')
}, [navigation, loanAccount, loanAccounts])
if (loanAccount == null) {
diff --git a/src/components/modals/ContactListModal.tsx b/src/components/modals/ContactListModal.tsx
index 6e4811ca167..62b6bf07a8a 100644
--- a/src/components/modals/ContactListModal.tsx
+++ b/src/components/modals/ContactListModal.tsx
@@ -4,13 +4,15 @@ import { AirshipBridge } from 'react-native-airship'
import IonIcon from 'react-native-vector-icons/Ionicons'
import { sprintf } from 'sprintf-js'
-import { maybeShowContactsPermissionModal } from '../../hooks/redux/useContactThumbnail'
+import { useAsyncEffect } from '../../hooks/useAsyncEffect'
import { lstrings } from '../../locales/strings'
import { useDispatch, useSelector } from '../../types/reactRedux'
import { GuiContact } from '../../types/types'
import { normalizeForSearch } from '../../util/utils'
+import { requestContactsPermission } from '../services/PermissionsManager'
import { cacheStyles, Theme, useTheme } from '../services/ThemeContext'
import { SelectableRow } from '../themed/SelectableRow'
+import { maybeShowContactsPermissionModal } from './ContactsPermissionModal'
import { ListModal } from './ListModal'
export interface ContactModalResult {
@@ -29,7 +31,6 @@ export function ContactListModal({ bridge, contactType, contactName }: Props) {
const styles = getStyles(theme)
const contacts = useSelector(state => state.contacts)
const dispatch = useDispatch()
- const contactsPermissionOn = useSelector(state => state.ui.settings.contactsPermissionOn)
const rowComponent = ({ givenName, familyName, hasThumbnail, thumbnailPath }: GuiContact) => {
const fullName = familyName ? `${givenName} ${familyName}` : givenName
@@ -57,13 +58,16 @@ export function ContactListModal({ bridge, contactType, contactName }: Props) {
const handleSubmitEditing = (contactName: string) => bridge.resolve({ contactName, thumbnailPath: null })
- React.useEffect(() => {
- maybeShowContactsPermissionModal(dispatch, contactsPermissionOn)
-
- // Avoid popping up the modal when component is mounted and the user changes
- // contactsPermissionOn.
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [dispatch])
+ useAsyncEffect(
+ async () => {
+ const result = await dispatch(maybeShowContactsPermissionModal())
+ if (result === 'allow') {
+ await requestContactsPermission(true)
+ }
+ },
+ [],
+ 'ContactListModal'
+ )
return (
}
-export function ContactsPermissionModal(props: Props) {
+let isModalShowing = false
+
+/**
+ * Shows one instance of this modal asking if the user wants to grant contacts
+ * permissions, if the system contacts permission isn't granted.
+ *
+ * @returns Result of Contacts Access modal or undefined if no modal shown or
+ * the modal was dismissed somehow.
+ */
+export function maybeShowContactsPermissionModal(): ThunkAction> {
+ return async (dispatch, getState) => {
+ const state = getState()
+ const { account } = state.core
+
+ // Bail if we are currently showing the modal:
+ if (isModalShowing) return
+ isModalShowing = true
+
+ // Bail if we have ever show the modal:
+ const { contactsPermissionShown } = state.ui.settings
+ if (contactsPermissionShown) return
+
+ // Bail if we already have permission:
+ const contactsPermissionOn = (await check(permissionNames.contacts).catch(_error => 'denied')) === 'granted'
+ if (contactsPermissionOn) return
+
+ // Show the modal:
+ const result = await Airship.show(bridge => )
+ await writeContactsPermissionShown(account, true)
+
+ return result
+ }
+}
+
+/**
+ * Shows the modal if it hasn't been shown before, and attempts to set the
+ * system contacts permission setting
+ */
+function ContactsPermissionModal(props: Props) {
const { bridge } = props
const theme = useTheme()
const styles = getStyles(theme)
+
const message1 = sprintf(lstrings.contacts_permission_modal_body_1, config.appName)
const message2 = sprintf(lstrings.contacts_permission_modal_body_2, config.appName)
const message3 = sprintf(lstrings.contacts_permission_modal_body_3, config.appName)
diff --git a/src/components/modals/PasswordReminderModal.tsx b/src/components/modals/PasswordReminderModal.tsx
index 93f66c4a7d0..c8a985fbeee 100644
--- a/src/components/modals/PasswordReminderModal.tsx
+++ b/src/components/modals/PasswordReminderModal.tsx
@@ -51,7 +51,7 @@ export class PasswordReminderModalComponent extends React.PureComponent this.props.navigation.navigate('changePassword', {}), 10)
+ setTimeout(() => this.props.navigation.navigate('changePassword'), 10)
}
}
diff --git a/src/components/modals/WalletListModal.tsx b/src/components/modals/WalletListModal.tsx
index 6ece36090ef..1f9b96f7add 100644
--- a/src/components/modals/WalletListModal.tsx
+++ b/src/components/modals/WalletListModal.tsx
@@ -15,7 +15,7 @@ import { config } from '../../theme/appConfig'
import { useDispatch, useSelector } from '../../types/reactRedux'
import { NavigationBase } from '../../types/routerTypes'
import { EdgeAsset } from '../../types/types'
-import { getCurrencyCode, isKeysOnlyPlugin } from '../../util/CurrencyInfoHelpers'
+import { isKeysOnlyPlugin } from '../../util/CurrencyInfoHelpers'
import { EdgeTouchableOpacity } from '../common/EdgeTouchableOpacity'
import { SearchIconAnimated } from '../icons/ThemedIcons'
import { CustomAsset } from '../rows/CustomAssetRow'
@@ -37,8 +37,6 @@ export type WalletListResult =
type: 'wallet'
walletId: string
tokenId: EdgeTokenId
- /** @deprecated Use tokenId instead */
- currencyCode: string
}
| { type: 'wyre'; fiatAccountId: string }
| { type: 'bankSignupRequest' }
@@ -144,11 +142,8 @@ export function WalletListModal(props: Props) {
} else if (customAsset != null) {
bridge.resolve({ type: 'custom', customAsset })
} else {
- const wallet = await account.waitForCurrencyWallet(walletId)
- const currencyCode = getCurrencyCode(wallet, tokenId)
-
dispatch(updateMostRecentWalletsSelected(walletId, tokenId))
- bridge.resolve({ type: 'wallet', walletId, currencyCode, tokenId })
+ bridge.resolve({ type: 'wallet', walletId, tokenId })
}
})
const handleSearchClear = useHandler(() => {
@@ -313,9 +308,7 @@ export const pickWallet = async (args: {
if (matchingWallets.length === 1) {
// Only one matching wallet and asset. Auto pick the wallet and token
const { walletId, tokenId } = matchingWallets[0]
- const wallet = currencyWallets[walletId]
- const currencyCode = getCurrencyCode(wallet, tokenId)
- return { type: 'wallet', walletId, currencyCode, tokenId }
+ return { type: 'wallet', walletId, tokenId }
} else {
// There is more than one match or we don't have a wallet for this asset. Launch the picker
const walletListResult = await Airship.show(bridge => (
diff --git a/src/components/scenes/CoinRankingDetailsScene.tsx b/src/components/scenes/CoinRankingDetailsScene.tsx
index 37a1ff8605d..aaec97c3df3 100644
--- a/src/components/scenes/CoinRankingDetailsScene.tsx
+++ b/src/components/scenes/CoinRankingDetailsScene.tsx
@@ -94,7 +94,7 @@ const CoinRankingDetailsSceneComponent = (props: Props) => {
// Take this stale scene off the stack
navigation.pop()
// Force a refresh & refetch
- navigation.navigate('coinRanking', {})
+ navigation.navigate('coinRanking')
}
}, [supportedFiat, initFiat, isFocused, navigation])
diff --git a/src/components/scenes/ConfirmScene.tsx b/src/components/scenes/ConfirmScene.tsx
index 04e9b568e53..6e38530ed18 100644
--- a/src/components/scenes/ConfirmScene.tsx
+++ b/src/components/scenes/ConfirmScene.tsx
@@ -6,13 +6,13 @@ import { SCROLL_INDICATOR_INSET_FIX } from '../../constants/constantSettings'
import { useHandler } from '../../hooks/useHandler'
import { lstrings } from '../../locales/strings'
import { EdgeSceneProps } from '../../types/routerTypes'
+import { EdgeButton } from '../buttons/EdgeButton'
import { SceneWrapper } from '../common/SceneWrapper'
import { EdgeRow } from '../rows/EdgeRow'
import { cacheStyles, Theme, useTheme } from '../services/ThemeContext'
import { EdgeText } from '../themed/EdgeText'
-import { MainButton } from '../themed/MainButton'
import { SafeSlider } from '../themed/SafeSlider'
-import { SceneHeader } from '../themed/SceneHeader'
+import { SceneHeaderUi4 } from '../themed/SceneHeaderUi4'
interface Props extends EdgeSceneProps<'confirmScene'> {}
@@ -24,7 +24,7 @@ export interface ConfirmSceneParams {
onBack?: () => void
}
-const ConfirmComponent = (props: Props) => {
+const ConfirmSceneComponent = (props: Props) => {
const { navigation, route } = props
const theme = useTheme()
const styles = getStyles(theme)
@@ -52,9 +52,9 @@ const ConfirmComponent = (props: Props) => {
}, [onBack])
return (
-
+
-
+
{bodyText}
@@ -63,14 +63,14 @@ const ConfirmComponent = (props: Props) => {
{renderInfoTiles()}
-
+
)
}
-export const ConfirmScene = React.memo(ConfirmComponent)
+export const ConfirmScene = React.memo(ConfirmSceneComponent)
const getStyles = cacheStyles((theme: Theme) => ({
titleText: {
@@ -79,8 +79,7 @@ const getStyles = cacheStyles((theme: Theme) => ({
body: {
alignItems: 'center',
justifyContent: 'center',
- margin: theme.rem(1),
- marginTop: theme.rem(1.5)
+ margin: theme.rem(0.5)
},
footer: {
margin: theme.rem(1),
diff --git a/src/components/scenes/CreateWalletAccountSelectScene.tsx b/src/components/scenes/CreateWalletAccountSelectScene.tsx
index e1a0ffb4215..9636e2c6ce2 100644
--- a/src/components/scenes/CreateWalletAccountSelectScene.tsx
+++ b/src/components/scenes/CreateWalletAccountSelectScene.tsx
@@ -14,7 +14,7 @@ import { config } from '../../theme/appConfig'
import { useDispatch, useSelector } from '../../types/reactRedux'
import { EdgeSceneProps } from '../../types/routerTypes'
import { EdgeAsset } from '../../types/types'
-import { getWalletTokenId } from '../../util/CurrencyInfoHelpers'
+import { getCurrencyCode, getWalletTokenId } from '../../util/CurrencyInfoHelpers'
import { getWalletName } from '../../util/CurrencyWalletHelpers'
import { logEvent } from '../../util/tracking'
import { ButtonsView } from '../buttons/ButtonsView'
@@ -112,13 +112,14 @@ export const CreateWalletAccountSelectScene = withWallet((props: Props) => {
))
.then(async result => {
if (result?.type === 'wallet') {
- const { walletId, currencyCode } = result
+ const { walletId, tokenId } = result
+ const wallet = account.currencyWallets[walletId]
setWalletAccountActivationQuoteError('')
setWalletId(walletId)
const createdWalletInstance = await handleRenameAndReturnWallet()
const paymentInfo: ActivationPaymentInfo = {
requestedAccountName: accountName,
- currencyCode,
+ currencyCode: getCurrencyCode(wallet, tokenId),
ownerPublicKey: createdWalletInstance.publicWalletInfo.keys.ownerPublicKey,
activePublicKey: createdWalletInstance.publicWalletInfo.keys.publicKey,
requestedAccountCurrencyCode: existingCurrencyCode
diff --git a/src/components/scenes/EditTokenScene.tsx b/src/components/scenes/EditTokenScene.tsx
index 9327908b980..f56634259a2 100644
--- a/src/components/scenes/EditTokenScene.tsx
+++ b/src/components/scenes/EditTokenScene.tsx
@@ -26,7 +26,10 @@ export interface EditTokenParams {
displayName?: string
multiplier?: string
networkLocation?: JsonObject
- tokenId?: EdgeTokenId // Acts like "add token" if this is missing
+
+ /** If exists, means they are editing an existing custom token.
+ * If missing, then creating/adding a new token */
+ tokenId?: EdgeTokenId
walletId: string
}
@@ -138,45 +141,49 @@ function EditTokenSceneComponent(props: Props) {
await wallet.currencyConfig.changeCustomToken(tokenId, customTokenInput)
navigation.goBack()
} else {
+ // Creating a new token
const { currencyConfig } = wallet
const { builtinTokens } = currencyConfig
- // Check if custom token input conflicts with built-in tokens.
- // There's currently no mechanism to obtain a new custom token's tokenId
- // for proper comparison against built-in tokens besides physically adding
- // the new custom token first.
- const newTokenId = await currencyConfig.addCustomToken(customTokenInput)
-
- const matchingContractToken =
- Object.keys(builtinTokens).find(builtinTokenId => builtinTokenId === newTokenId) == null ? undefined : builtinTokens[newTokenId]
- const isMatchingCurrencyCode = Object.values(builtinTokens).find(builtInToken => builtInToken.currencyCode === currencyCode) != null
+ const newTokenId = await currencyConfig.getTokenId(customTokenInput)
- if (matchingContractToken != null && isMatchingCurrencyCode) {
- await showMessage(sprintf(lstrings.warning_token_exists_1s, currencyCode))
+ // Check if custom token input conflicts with built-in tokens.
+ const matchingBuiltinTokenId = Object.keys(builtinTokens).find(builtinTokenId => builtinTokenId === newTokenId)
+ if (matchingBuiltinTokenId != null) {
+ await showMessage(sprintf(lstrings.warning_token_exists_1s, builtinTokens[matchingBuiltinTokenId].currencyCode))
return
}
- const warningMessage =
- isMatchingCurrencyCode && matchingContractToken == null
- ? sprintf(lstrings.warning_token_code_override_2s, currencyCode, config.supportEmail)
- : matchingContractToken != null && !isMatchingCurrencyCode
- ? sprintf(lstrings.warning_token_contract_override_3s, currencyCode, matchingContractToken.currencyCode, config.supportEmail)
- : undefined
-
- const approveAdd =
- warningMessage == null
- ? true
- : await Airship.show(bridge => (
-
- ))
+ const isMatchingBuiltinCurrencyCode = Object.values(builtinTokens).find(builtInToken => builtInToken.currencyCode === currencyCode) != null
+ const approveAdd = !isMatchingBuiltinCurrencyCode
+ ? true
+ : await Airship.show(bridge => (
+
+ ))
if (approveAdd) {
+ // Check if custom token input conflicts with custom tokens.
+ if (currencyConfig.customTokens[newTokenId] != null) {
+ // Always override changes to custom tokens
+ // TODO: Fine for if they are on this scene intentionally modifying a
+ // custom token, but maybe warn about this override if they are trying
+ // to add a new custom token with the same contract address as an
+ // existing custom token
+ await currencyConfig.changeCustomToken(newTokenId, customTokenInput)
+ } else {
+ await currencyConfig.addCustomToken(customTokenInput)
+ }
+
await wallet.changeEnabledTokenIds([...wallet.enabledTokenIds, newTokenId])
logActivity(`Add Custom Token: ${account.username} -- ${getWalletName(wallet)} -- ${wallet.type} -- ${newTokenId} -- ${currencyCode} -- ${decimals}`)
- navigation.goBack()
- } else {
- await currencyConfig.removeCustomToken(newTokenId)
}
+ navigation.goBack()
}
})
@@ -217,7 +224,7 @@ function EditTokenSceneComponent(props: Props) {
onChangeText={value =>
setLocation(location => {
const out = new Map(location)
- out.set(item.key, value)
+ out.set(item.key, value.replace(/\s/g, ''))
return out
})
}
diff --git a/src/components/scenes/Fio/FioAddressDetailsScene.tsx b/src/components/scenes/Fio/FioAddressDetailsScene.tsx
index 20d24114891..95fd2c3340c 100644
--- a/src/components/scenes/Fio/FioAddressDetailsScene.tsx
+++ b/src/components/scenes/Fio/FioAddressDetailsScene.tsx
@@ -19,6 +19,11 @@ import { SettingsTappableRow } from '../../settings/SettingsTappableRow'
import { EdgeText } from '../../themed/EdgeText'
import { SceneHeader } from '../../themed/SceneHeader'
+export interface FioAddressDetailsParams {
+ fioAddressName: string
+ bundledTxs: number
+}
+
interface StateProps {
fioWallets: EdgeCurrencyWallet[]
}
diff --git a/src/components/scenes/Fio/FioAddressListScene.tsx b/src/components/scenes/Fio/FioAddressListScene.tsx
index e0bfbc759f3..56aea86f687 100644
--- a/src/components/scenes/Fio/FioAddressListScene.tsx
+++ b/src/components/scenes/Fio/FioAddressListScene.tsx
@@ -153,11 +153,11 @@ export class FioAddressList extends React.Component {
navigation.navigate('fioAddressRegister', {})
+ onPress: () => navigation.navigate('fioAddressRegister')
}}
secondary={{
label: lstrings.fio_address_list_domain_register,
- onPress: () => navigation.navigate('fioDomainRegister', {})
+ onPress: () => navigation.navigate('fioDomainRegister')
}}
/>
diff --git a/src/components/scenes/Fio/FioAddressRegisterSelectWalletScene.tsx b/src/components/scenes/Fio/FioAddressRegisterSelectWalletScene.tsx
index c2fff52aa57..11d9788e85a 100644
--- a/src/components/scenes/Fio/FioAddressRegisterSelectWalletScene.tsx
+++ b/src/components/scenes/Fio/FioAddressRegisterSelectWalletScene.tsx
@@ -195,7 +195,7 @@ export class FioAddressRegisterSelectWallet extends React.Component {}
type Props = OwnProps & ThemeProps
@@ -46,7 +51,7 @@ export class FioAddressRegistered extends React.Component {
{fioName}
{this.renderExpDate()}
- navigation.navigate('fioAddressList', {})} label={lstrings.title_fio_names} />
+ navigation.navigate('fioAddressList')} label={lstrings.title_fio_names} />
)
diff --git a/src/components/scenes/Fio/FioAddressSettingsScene.tsx b/src/components/scenes/Fio/FioAddressSettingsScene.tsx
index 54eca0eb9dd..032a6d531e3 100644
--- a/src/components/scenes/Fio/FioAddressSettingsScene.tsx
+++ b/src/components/scenes/Fio/FioAddressSettingsScene.tsx
@@ -89,7 +89,7 @@ export class FioAddressSettingsComponent extends React.Component{transferredMessage}
))
- return navigation.navigate('fioAddressList', {})
+ return navigation.navigate('fioAddressList')
}
onTransferPress = () => {
diff --git a/src/components/scenes/Fio/FioDomainRegisterSelectWalletScene.tsx b/src/components/scenes/Fio/FioDomainRegisterSelectWalletScene.tsx
index f8c995ef4ce..0182a9db966 100644
--- a/src/components/scenes/Fio/FioDomainRegisterSelectWalletScene.tsx
+++ b/src/components/scenes/Fio/FioDomainRegisterSelectWalletScene.tsx
@@ -184,7 +184,7 @@ class FioDomainRegisterSelectWallet extends React.PureComponent {
))
- return navigation.navigate('fioAddressList', {})
+ return navigation.navigate('fioAddressList')
}
onVisibilityPress = () => {
diff --git a/src/components/scenes/Fio/FioNameConfirmScene.tsx b/src/components/scenes/Fio/FioNameConfirmScene.tsx
index b6f47a63d15..e4223543ea5 100644
--- a/src/components/scenes/Fio/FioNameConfirmScene.tsx
+++ b/src/components/scenes/Fio/FioNameConfirmScene.tsx
@@ -115,7 +115,7 @@ class FioNameConfirm extends React.PureComponent {
buttons={{ ok: { label: lstrings.string_ok_cap } }}
/>
))
- navigation.navigate('homeTab', { screen: 'home' })
+ navigation.navigate('home')
} else {
// no free domains
showError(lstrings.fio_get_fee_err_msg)
diff --git a/src/components/scenes/Fio/FioRequestListScene.tsx b/src/components/scenes/Fio/FioRequestListScene.tsx
index ea5c10f03b5..2bc4b211ebf 100644
--- a/src/components/scenes/Fio/FioRequestListScene.tsx
+++ b/src/components/scenes/Fio/FioRequestListScene.tsx
@@ -12,7 +12,7 @@ import { getExchangeDenomByCurrencyCode } from '../../../selectors/DenominationS
import { connect } from '../../../types/reactRedux'
import { EdgeSceneProps } from '../../../types/routerTypes'
import { FioAddress, FioRequest } from '../../../types/types'
-import { getTokenIdForced } from '../../../util/CurrencyInfoHelpers'
+import { getCurrencyCode, getTokenIdForced } from '../../../util/CurrencyInfoHelpers'
import {
addToFioAddressCache,
cancelFioRequest,
@@ -379,7 +379,9 @@ class FioRequestList extends React.Component {
))
if (result?.type === 'wallet') {
- const { walletId, currencyCode } = result
+ const { walletId, tokenId } = result
+ const wallet = account.currencyWallets[walletId]
+ const currencyCode = getCurrencyCode(wallet, tokenId)
onSelectWallet(walletId, currencyCode)
await this.sendCrypto(selectedFioPendingRequest, walletId, currencyCode)
}
diff --git a/src/components/scenes/Fio/FioSentRequestDetailsScene.tsx b/src/components/scenes/Fio/FioSentRequestDetailsScene.tsx
index 95989845065..ec2483610b1 100644
--- a/src/components/scenes/Fio/FioSentRequestDetailsScene.tsx
+++ b/src/components/scenes/Fio/FioSentRequestDetailsScene.tsx
@@ -7,7 +7,7 @@ import { formatDate, formatNumber, SHORT_DATE_FMT } from '../../../locales/intl'
import { lstrings } from '../../../locales/strings'
import { connect } from '../../../types/reactRedux'
import { EdgeSceneProps } from '../../../types/routerTypes'
-import { FioRequestStatus, GuiExchangeRates } from '../../../types/types'
+import { FioRequest, FioRequestStatus, GuiExchangeRates } from '../../../types/types'
import { EdgeCard } from '../../cards/EdgeCard'
import { SceneWrapper } from '../../common/SceneWrapper'
import { EdgeRow } from '../../rows/EdgeRow'
@@ -15,6 +15,10 @@ import { cacheStyles, Theme, ThemeProps, withTheme } from '../../services/ThemeC
import { EdgeText } from '../../themed/EdgeText'
import { SceneHeader } from '../../themed/SceneHeader'
+export interface FioSentRequestDetailsParams {
+ selectedFioSentRequest: FioRequest
+}
+
interface OwnProps extends EdgeSceneProps<'fioSentRequestDetails'> {}
interface StateProps {
diff --git a/src/components/scenes/Fio/FioStakingOverviewScene.tsx b/src/components/scenes/Fio/FioStakingOverviewScene.tsx
index 53dadb092d0..a61bdda98c0 100644
--- a/src/components/scenes/Fio/FioStakingOverviewScene.tsx
+++ b/src/components/scenes/Fio/FioStakingOverviewScene.tsx
@@ -1,5 +1,5 @@
import { add, gt } from 'biggystring'
-import { EdgeCurrencyWallet, EdgeDenomination } from 'edge-core-js'
+import { EdgeCurrencyWallet, EdgeDenomination, EdgeTokenId } from 'edge-core-js'
import * as React from 'react'
import { Image, View } from 'react-native'
import { sprintf } from 'sprintf-js'
@@ -26,6 +26,11 @@ import { cacheStyles, Theme, ThemeProps, withTheme } from '../../services/ThemeC
import { EdgeText } from '../../themed/EdgeText'
import { SceneHeader } from '../../themed/SceneHeader'
+export interface FioStakingOverviewParams {
+ tokenId: EdgeTokenId
+ walletId: string
+}
+
interface OwnProps extends EdgeSceneProps<'fioStakingOverview'> {}
interface StateProps {
diff --git a/src/components/scenes/GuiPluginViewScene.tsx b/src/components/scenes/GuiPluginViewScene.tsx
index 243e000b1d2..35dacfddd68 100644
--- a/src/components/scenes/GuiPluginViewScene.tsx
+++ b/src/components/scenes/GuiPluginViewScene.tsx
@@ -3,7 +3,7 @@ import * as React from 'react'
import { checkAndShowLightBackupModal } from '../../actions/BackupModalActions'
import { GuiPlugin } from '../../types/GuiPluginTypes'
import { useSelector } from '../../types/reactRedux'
-import { EdgeSceneProps } from '../../types/routerTypes'
+import { NavigationProp } from '../../types/routerTypes'
import { UriQueryMap } from '../../types/WebTypes'
import { SceneWrapper } from '../common/SceneWrapper'
import { EdgeProviderComponent } from '../themed/EdgeProviderComponent'
@@ -17,7 +17,12 @@ export interface PluginViewParams {
deepQuery?: UriQueryMap
}
-interface Props extends EdgeSceneProps<'pluginView' | 'pluginViewBuy' | 'pluginViewSell'> {}
+interface Props {
+ navigation: NavigationProp<'pluginView' | 'pluginViewBuy' | 'pluginViewSell'>
+
+ // Work around an extremely strange & hard-to-debug type error:
+ route: any // RouteProp<'pluginView' | 'pluginViewBuy' | 'pluginViewSell'>
+}
export function GuiPluginViewScene(props: Props): JSX.Element {
const { route, navigation } = props
diff --git a/src/components/scenes/HomeScene.tsx b/src/components/scenes/HomeScene.tsx
index 9ee24a1a836..4cf57d9cf38 100644
--- a/src/components/scenes/HomeScene.tsx
+++ b/src/components/scenes/HomeScene.tsx
@@ -76,16 +76,16 @@ export const HomeScene = (props: Props) => {
//
const handleBuyPress = useHandler(() => {
- navigation.navigate('buyTab', {})
+ navigation.navigate('buyTab')
})
const handleSellPress = useHandler(() => {
- navigation.navigate('sellTab', {})
+ navigation.navigate('sellTab')
})
const handleFioPress = useHandler(() => {
- navigation.navigate('fioAddressList', {})
+ navigation.navigate('fioAddressList')
})
const handleSwapPress = useHandler(() => {
- navigation.navigate('swapTab', {})
+ navigation.navigate('swapTab')
})
const handleViewAssetsPress = useHandler(() => {
navigation.navigate('walletsTab', { screen: 'walletList' })
@@ -95,7 +95,7 @@ export const HomeScene = (props: Props) => {
// Set countryCode once
useAsyncEffect(
async () => {
- const countryCode = await getCountryCodeByIp().catch(() => '')
+ const countryCode = await getCountryCodeByIp()
setCountryCode(countryCode)
},
[],
@@ -210,7 +210,7 @@ export const HomeScene = (props: Props) => {
>
)}
<>
- navigation.navigate('coinRanking', {})} />
+ navigation.navigate('coinRanking')} />
diff --git a/src/components/scenes/Loans/LoanCloseScene.tsx b/src/components/scenes/Loans/LoanCloseScene.tsx
index ec388ae0bad..1cefbb4c81a 100644
--- a/src/components/scenes/Loans/LoanCloseScene.tsx
+++ b/src/components/scenes/Loans/LoanCloseScene.tsx
@@ -125,7 +125,7 @@ export const LoanCloseSceneComponent = (props: Props) => {
// Update the loan program marking it as close
await dispatch(saveLoanAccount({ ...loanAccount, closed: true }))
// Navigate to loan dashboard scene if no action program is necessary
- navigation.navigate('loanDashboard', {})
+ navigation.navigate('loanDashboard')
}
})
diff --git a/src/components/scenes/Loans/LoanCreateConfirmationScene.tsx b/src/components/scenes/Loans/LoanCreateConfirmationScene.tsx
index be1fb906bc6..7d310291462 100644
--- a/src/components/scenes/Loans/LoanCreateConfirmationScene.tsx
+++ b/src/components/scenes/Loans/LoanCreateConfirmationScene.tsx
@@ -180,7 +180,7 @@ export const LoanCreateConfirmationScene = (props: Props) => {
await dispatch(saveLoanAccount(loanAccount))
await dispatch(runLoanActionProgram(loanAccount, actionProgram, 'loan-create'))
- navigation.navigate('loanDashboard', {})
+ navigation.navigate('loanDashboard')
navigation.navigate('loanDetails', { loanAccountId: loanAccount.id })
// Further route to LoanStatusScene only if Action Program contains multiple ops
diff --git a/src/components/scenes/Loans/LoanCreateScene.tsx b/src/components/scenes/Loans/LoanCreateScene.tsx
index 0b788115c2b..23a70a5417b 100644
--- a/src/components/scenes/Loans/LoanCreateScene.tsx
+++ b/src/components/scenes/Loans/LoanCreateScene.tsx
@@ -28,7 +28,7 @@ import { useSelector } from '../../../types/reactRedux'
import { EdgeSceneProps } from '../../../types/routerTypes'
import { getWalletPickerExcludeWalletIds } from '../../../util/borrowUtils'
import { getBorrowPluginIconUri } from '../../../util/CdnUris'
-import { getTokenId, getTokenIdForced } from '../../../util/CurrencyInfoHelpers'
+import { getCurrencyCode, getTokenId, getTokenIdForced } from '../../../util/CurrencyInfoHelpers'
import { enableToken } from '../../../util/CurrencyWalletHelpers'
import { DECIMAL_PRECISION, removeIsoPrefix, truncateDecimals, zeroString } from '../../../util/utils'
import { EdgeCard } from '../../cards/EdgeCard'
@@ -291,12 +291,12 @@ export const LoanCreateScene = (props: Props) => {
setDestWallet(borrowEngineWallet)
setDestTokenId(hardDestTokenAddr)
} else if (result?.type === 'wallet') {
- const { walletId, currencyCode, tokenId } = result
+ const { walletId, tokenId } = result
const selectedWallet = wallets[walletId]
if (isSrc) {
setSrcWalletId(walletId)
setSrcTokenId(tokenId)
- setSrcCurrencyCode(currencyCode)
+ setSrcCurrencyCode(getCurrencyCode(selectedWallet, tokenId))
} else {
setDestBankId(undefined)
setDestWallet(selectedWallet)
diff --git a/src/components/scenes/Loans/LoanStatusScene.tsx b/src/components/scenes/Loans/LoanStatusScene.tsx
index c0402a9ac39..db814017847 100644
--- a/src/components/scenes/Loans/LoanStatusScene.tsx
+++ b/src/components/scenes/Loans/LoanStatusScene.tsx
@@ -94,7 +94,7 @@ export const LoanStatusSceneComponent = (props: Props) => {
const handleDonePress = useHandler(() => {
if (loanAccountId != null) navigation.navigate('loanDetails', { loanAccountId })
- else navigation.navigate('loanDashboard', {})
+ else navigation.navigate('loanDashboard')
})
const isProgramDone = steps.length > 0 && steps[steps.length - 1].status === 'done'
diff --git a/src/components/scenes/RequestScene.tsx b/src/components/scenes/RequestScene.tsx
index a98fb1d0d45..cb7ae90adf5 100644
--- a/src/components/scenes/RequestScene.tsx
+++ b/src/components/scenes/RequestScene.tsx
@@ -289,7 +289,7 @@ export class RequestSceneComponent extends React.Component this.props.navigation.navigate('upgradeUsername', {})
+ handleBackupPress = () => this.props.navigation.navigate('upgradeUsername')
renderLightAccountMode = () => {
const styles = getStyles(this.props.theme)
return (
diff --git a/src/components/scenes/SendScene2.tsx b/src/components/scenes/SendScene2.tsx
index d243707ac54..65f7d929dbd 100644
--- a/src/components/scenes/SendScene2.tsx
+++ b/src/components/scenes/SendScene2.tsx
@@ -404,7 +404,7 @@ const SendComponent = (props: Props) => {
}
setWalletId(result.walletId)
const { pluginId: newPluginId } = currencyWallets[result.walletId].currencyInfo
- if (pluginId !== newPluginId || currencyCode !== result.currencyCode) {
+ if (pluginId !== newPluginId || tokenId !== result.tokenId) {
setTokenId(result.tokenId)
setSpendInfo({ tokenId: result.tokenId, spendTargets: [{}] })
}
diff --git a/src/components/scenes/SettingsScene.tsx b/src/components/scenes/SettingsScene.tsx
index 52793d8827e..79544e8fe61 100644
--- a/src/components/scenes/SettingsScene.tsx
+++ b/src/components/scenes/SettingsScene.tsx
@@ -2,13 +2,14 @@ import { EdgeLogType } from 'edge-core-js'
import { getSupportedBiometryType } from 'edge-login-ui-rn'
import * as React from 'react'
import { Platform } from 'react-native'
+import { check } from 'react-native-permissions'
import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome'
import IonIcon from 'react-native-vector-icons/Ionicons'
import { sprintf } from 'sprintf-js'
import { showBackupModal } from '../../actions/BackupModalActions'
import { getDeviceSettings, writeDisableAnimations, writeForceLightAccountCreate } from '../../actions/DeviceSettingsActions'
-import { setContactsPermissionOn, setDeveloperModeOn, setSpamFilterOn } from '../../actions/LocalSettingsActions'
+import { setDeveloperModeOn, setSpamFilterOn } from '../../actions/LocalSettingsActions'
import { showClearLogsModal, showSendLogsModal } from '../../actions/LogActions'
import { logoutRequest } from '../../actions/LoginActions'
import {
@@ -19,11 +20,12 @@ import {
togglePinLoginEnabled,
updateTouchIdEnabled
} from '../../actions/SettingsActions'
-import { CURRENCY_SETTINGS_KEYS } from '../../constants/WalletAndCurrencyConstants'
import { ENV } from '../../env'
+import { useAsyncEffect } from '../../hooks/useAsyncEffect'
import { useHandler } from '../../hooks/useHandler'
import { useWatch } from '../../hooks/useWatch'
import { lstrings } from '../../locales/strings'
+import { permissionNames } from '../../reducers/PermissionsReducer'
import { getDefaultFiat } from '../../selectors/SettingsSelectors'
import { config } from '../../theme/appConfig'
import { useState } from '../../types/reactHooks'
@@ -40,6 +42,7 @@ import { AutoLogoutModal } from '../modals/AutoLogoutModal'
import { ConfirmContinueModal } from '../modals/ConfirmContinueModal'
import { TextInputModal } from '../modals/TextInputModal'
import { Airship, showDevError, showError } from '../services/AirshipInstance'
+import { requestContactsPermission } from '../services/PermissionsManager'
import { changeTheme, useTheme } from '../services/ThemeContext'
import { SettingsHeaderRow } from '../settings/SettingsHeaderRow'
import { SettingsLabelRow } from '../settings/SettingsLabelRow'
@@ -54,7 +57,6 @@ export const SettingsScene = (props: Props) => {
const dispatch = useDispatch()
const autoLogoutTimeInSeconds = useSelector(state => state.ui.settings.autoLogoutTimeInSeconds)
- const contactsPermissionOn = useSelector(state => state.ui.settings.contactsPermissionOn)
const defaultFiat = useSelector(state => getDefaultFiat(state))
const developerModeOn = useSelector(state => state.ui.settings.developerModeOn)
const isLocked = useSelector(state => state.ui.settings.changesLocked)
@@ -69,6 +71,8 @@ export const SettingsScene = (props: Props) => {
const context = useSelector(state => state.core.context)
const logSettings = useWatch(context, 'logSettings')
+ const [localContactPermissionOn, setLocalContactsPermissionOn] = React.useState(false)
+
const [isDarkTheme, setIsDarkTheme] = React.useState(theme === config.darkTheme)
const [defaultLogLevel, setDefaultLogLevel] = React.useState(logSettings.defaultLogLevel)
const [disableAnim, setDisableAnim] = useState(getDeviceSettings().disableAnimations)
@@ -134,7 +138,7 @@ export const SettingsScene = (props: Props) => {
})
const handleDefaultFiat = useHandler(() => {
- navigation.navigate('defaultFiatSetting', {})
+ navigation.navigate('defaultFiatSetting')
})
const handleShowRestoreWalletsModal = useHandler(async () => {
@@ -156,19 +160,19 @@ export const SettingsScene = (props: Props) => {
})
const handleChangePassword = useHandler((): void => {
- isLocked ? handleUnlock() : navigation.navigate('changePassword', {})
+ isLocked ? handleUnlock() : navigation.navigate('changePassword')
})
const handleChangePin = useHandler((): void => {
- isLocked ? handleUnlock() : navigation.navigate('changePin', {})
+ isLocked ? handleUnlock() : navigation.navigate('changePin')
})
const handleChangeOtp = useHandler((): void => {
- isLocked ? handleUnlock() : navigation.navigate('otpSetup', {})
+ isLocked ? handleUnlock() : navigation.navigate('otpSetup')
})
const handleChangeRecovery = useHandler((): void => {
- isLocked ? handleUnlock() : navigation.navigate('passwordRecovery', {})
+ isLocked ? handleUnlock() : navigation.navigate('passwordRecovery')
})
const handleDeleteAccount = useHandler(async () => {
@@ -212,11 +216,11 @@ export const SettingsScene = (props: Props) => {
})
const handleExchangeSettings = useHandler((): void => {
- navigation.navigate('swapSettings', {})
+ navigation.navigate('swapSettings')
})
const handleSpendingLimits = useHandler((): void => {
- navigation.navigate('spendingLimits', {})
+ navigation.navigate('spendingLimits')
})
const handleTermsOfService = useHandler(() => {
@@ -224,15 +228,15 @@ export const SettingsScene = (props: Props) => {
})
const handleToggleContactsPermission = useHandler(async () => {
- await dispatch(setContactsPermissionOn(!contactsPermissionOn))
+ setLocalContactsPermissionOn(await requestContactsPermission(!localContactPermissionOn))
})
const handleNotificationSettings = useHandler(() => {
- navigation.navigate('notificationSettings', {})
+ navigation.navigate('notificationSettings')
})
const handlePromotionSettings = useHandler(() => {
- navigation.navigate('promotionSettings', {})
+ navigation.navigate('promotionSettings')
})
const handleToggleVerboseLogging = useHandler(() => {
@@ -274,6 +278,15 @@ export const SettingsScene = (props: Props) => {
}
}
+ useAsyncEffect(
+ async () => {
+ const currentContactsPermission = await check(permissionNames.contacts)
+ setLocalContactsPermissionOn(currentContactsPermission === 'granted')
+ },
+ [],
+ 'SettingsScene'
+ )
+
// Load biometry type on mount
React.useEffect(() => {
if (!supportsTouchId) return
@@ -344,15 +357,12 @@ export const SettingsScene = (props: Props) => {
- navigation.push('assetSettings', { currencySettingsKeys: CURRENCY_SETTINGS_KEYS })}
- />
+ navigation.push('assetSettings')} />
diff --git a/src/components/scenes/SwapConfirmationScene.tsx b/src/components/scenes/SwapConfirmationScene.tsx
index 21c9890e521..12ff809c8ad 100644
--- a/src/components/scenes/SwapConfirmationScene.tsx
+++ b/src/components/scenes/SwapConfirmationScene.tsx
@@ -186,7 +186,7 @@ export const SwapConfirmationScene = (props: Props) => {
nativeAmount ${networkFee.nativeAmount}
`)
- navigation.push('swapSuccess', {})
+ navigation.push('swapSuccess')
// Dispatch the success action and callback
onApprove()
diff --git a/src/components/scenes/SwapCreateScene.tsx b/src/components/scenes/SwapCreateScene.tsx
index f47da88f2a1..4d30a9fe90c 100644
--- a/src/components/scenes/SwapCreateScene.tsx
+++ b/src/components/scenes/SwapCreateScene.tsx
@@ -1,5 +1,14 @@
import { gt, gte } from 'biggystring'
-import { EdgeCurrencyWallet, EdgeSwapRequest, EdgeTokenId } from 'edge-core-js'
+import {
+ asMaybeInsufficientFundsError,
+ asMaybeSwapAboveLimitError,
+ asMaybeSwapBelowLimitError,
+ asMaybeSwapCurrencyError,
+ asMaybeSwapPermissionError,
+ EdgeCurrencyWallet,
+ EdgeSwapRequest,
+ EdgeTokenId
+} from 'edge-core-js'
import * as React from 'react'
import { useState } from 'react'
import { Text, View } from 'react-native'
@@ -47,6 +56,7 @@ export interface SwapCreateParams {
export interface SwapErrorDisplayInfo {
message: string
title: string
+ error: unknown
}
interface Props extends EdgeSceneProps<'swapCreate'> {}
@@ -110,6 +120,35 @@ export const SwapCreateScene = (props: Props) => {
// Callbacks
//
+ /** Potentially clear an error if swap parameters relevant to the error have
+ * been user-modified. */
+ const getNewErrorInfo = (changed: 'amount' | 'asset'): { errorDisplayInfo?: SwapErrorDisplayInfo } => {
+ const { error } = errorDisplayInfo ?? {}
+ const isInsufficentFunds = asMaybeInsufficientFundsError(error) != null
+ const isSwapAboveLimit = asMaybeSwapAboveLimitError(error) != null
+ const isSwapBelowLimit = asMaybeSwapBelowLimitError(error) != null
+ const isSwapPermission = asMaybeSwapPermissionError(error) != null
+ const isSwapCurrency = asMaybeSwapCurrencyError(error) != null
+
+ let clearError = false
+
+ // Unknown error, clear it no matter what the user changes.
+ if (!(error instanceof Error) || error.name == null) {
+ clearError = true
+ }
+ // Amount related errors
+ else if (changed === 'amount' && (isInsufficentFunds || isSwapAboveLimit || isSwapBelowLimit)) {
+ clearError = true
+ }
+ // Selected asset related errors (arbitrarily includes all amount-related
+ // errors as well)
+ else if (changed === 'asset' && (isSwapPermission || isSwapCurrency || isInsufficentFunds || isSwapAboveLimit || isSwapBelowLimit)) {
+ clearError = true
+ }
+
+ return { errorDisplayInfo: clearError ? undefined : errorDisplayInfo }
+ }
+
const checkDisableAsset = (disableAssets: DisableAsset[], walletId: string, tokenId: EdgeTokenId): boolean => {
const wallet = currencyWallets[walletId] ?? { currencyInfo: {} }
const walletPluginId = wallet.currencyInfo.pluginId
@@ -208,8 +247,10 @@ export const SwapCreateScene = (props: Props) => {
fromTokenId: toTokenId,
toWalletId: fromWalletId,
toTokenId: fromTokenId,
- errorDisplayInfo
+ // Update the error state:
+ ...getNewErrorInfo('asset')
})
+
// Clear amount input state:
setInputNativeAmountFor(inputNativeAmountFor === 'from' ? 'to' : 'from')
@@ -228,7 +269,7 @@ export const SwapCreateScene = (props: Props) => {
})
const handleSelectWallet = useHandler(async (walletId: string, tokenId: EdgeTokenId, direction: 'from' | 'to') => {
- const params = {
+ navigation.setParams({
...route.params,
...(direction === 'to'
? {
@@ -238,9 +279,10 @@ export const SwapCreateScene = (props: Props) => {
: {
fromWalletId: walletId,
fromTokenId: tokenId
- })
- }
- navigation.setParams(params)
+ }),
+ // Update the error state:
+ ...getNewErrorInfo('asset')
+ })
})
const handleMaxPress = useHandler(() => {
@@ -300,6 +342,12 @@ export const SwapCreateScene = (props: Props) => {
})
const handleFromAmountChange = useHandler((amounts: ExchangedFlipInputAmounts) => {
+ navigation.setParams({
+ ...route.params,
+ // Update the error state:
+ ...getNewErrorInfo('amount')
+ })
+
setInputNativeAmount(amounts.nativeAmount)
setInputFiatAmount(amounts.fiatAmount)
setInputNativeAmountFor('from')
@@ -308,6 +356,12 @@ export const SwapCreateScene = (props: Props) => {
})
const handleToAmountChange = useHandler((amounts: ExchangedFlipInputAmounts) => {
+ navigation.setParams({
+ ...route.params,
+ // Update the error state:
+ ...getNewErrorInfo('amount')
+ })
+
setInputNativeAmount(amounts.nativeAmount)
setInputFiatAmount(amounts.fiatAmount)
setInputNativeAmountFor('to')
diff --git a/src/components/scenes/SwapProcessingScene.tsx b/src/components/scenes/SwapProcessingScene.tsx
index 33089c1c792..7c257a6f645 100644
--- a/src/components/scenes/SwapProcessingScene.tsx
+++ b/src/components/scenes/SwapProcessingScene.tsx
@@ -108,7 +108,8 @@ function processSwapQuoteError({
if (insufficientFunds != null || errorMessage === 'InsufficientFundsError') {
return {
title: lstrings.exchange_insufficient_funds_title,
- message: lstrings.exchange_insufficient_funds_message
+ message: lstrings.exchange_insufficient_funds_message,
+ error
}
}
@@ -122,7 +123,8 @@ function processSwapQuoteError({
return {
title: lstrings.exchange_generic_error_title,
- message: sprintf(lstrings.amount_above_limit, displayMax, currentCurrencyDenomination.name)
+ message: sprintf(lstrings.amount_above_limit, displayMax, currentCurrencyDenomination.name),
+ error
}
}
@@ -136,7 +138,8 @@ function processSwapQuoteError({
return {
title: lstrings.exchange_generic_error_title,
- message: sprintf(lstrings.amount_below_limit, displayMin, currentCurrencyDenomination.name)
+ message: sprintf(lstrings.amount_below_limit, displayMin, currentCurrencyDenomination.name),
+ error
}
}
@@ -147,7 +150,8 @@ function processSwapQuoteError({
return {
title: lstrings.exchange_generic_error_title,
- message: sprintf(lstrings.ss_unable, fromCurrencyCode, toCurrencyCode)
+ message: sprintf(lstrings.ss_unable, fromCurrencyCode, toCurrencyCode),
+ error
}
}
@@ -155,13 +159,15 @@ function processSwapQuoteError({
if (permissionError?.reason === 'geoRestriction') {
return {
title: lstrings.exchange_generic_error_title,
- message: lstrings.ss_geolock
+ message: lstrings.ss_geolock,
+ error
}
}
// Anything else:
return {
title: lstrings.exchange_generic_error_title,
- message: errorMessage
+ message: errorMessage,
+ error
}
}
diff --git a/src/components/scenes/TransactionListScene.tsx b/src/components/scenes/TransactionListScene.tsx
index 62b379a7855..4643098b6ba 100644
--- a/src/components/scenes/TransactionListScene.tsx
+++ b/src/components/scenes/TransactionListScene.tsx
@@ -4,8 +4,10 @@ import { ListRenderItemInfo, Platform, RefreshControl, View } from 'react-native
import Animated from 'react-native-reanimated'
import { useSafeAreaFrame } from 'react-native-safe-area-context'
+import { activateWalletTokens } from '../../actions/WalletActions'
import { SCROLL_INDICATOR_INSET_FIX } from '../../constants/constantSettings'
import { SPECIAL_CURRENCY_INFO } from '../../constants/WalletAndCurrencyConstants'
+import { useAsyncEffect } from '../../hooks/useAsyncEffect'
import { useHandler } from '../../hooks/useHandler'
import { useIconColor } from '../../hooks/useIconColor'
import { useTransactionList } from '../../hooks/useTransactionList'
@@ -14,7 +16,7 @@ import { lstrings } from '../../locales/strings'
import { getExchangeDenomByCurrencyCode } from '../../selectors/DenominationSelectors'
import { FooterRender } from '../../state/SceneFooterState'
import { useSceneScrollHandler } from '../../state/SceneScrollState'
-import { useSelector } from '../../types/reactRedux'
+import { useDispatch, useSelector } from '../../types/reactRedux'
import { EdgeSceneProps } from '../../types/routerTypes'
import { infoServerData } from '../../util/network'
import { calculateSpamThreshold, darkenHexColor, unixToLocaleDateTime, zeroString } from '../../util/utils'
@@ -47,6 +49,7 @@ function TransactionListComponent(props: Props) {
const { navigation, route, wallet } = props
const theme = useTheme()
const styles = getStyles(theme)
+ const dispatch = useDispatch()
const { width: screenWidth } = useSafeAreaFrame()
@@ -70,6 +73,7 @@ function TransactionListComponent(props: Props) {
// Watchers:
const enabledTokenIds = useWatch(wallet, 'enabledTokenIds')
+ const unactivatedTokenIds = useWatch(wallet, 'unactivatedTokenIds')
// ---------------------------------------------------------------------------
// Derived values
@@ -139,6 +143,21 @@ function TransactionListComponent(props: Props) {
}
}, [enabledTokenIds, navigation, tokenId])
+ // Automatically navigate to the token activation confirmation scene if
+ // the token appears in the unactivatedTokenIds list once the wallet loads
+ // this state.
+ useAsyncEffect(
+ async () => {
+ if (unactivatedTokenIds.length > 0) {
+ if (unactivatedTokenIds.some(unactivatedTokenId => unactivatedTokenId === tokenId)) {
+ await dispatch(activateWalletTokens(navigation, wallet, [tokenId]))
+ }
+ }
+ },
+ [unactivatedTokenIds],
+ 'TransactionListScene unactivatedTokenIds check'
+ )
+
//
// Handlers
//
diff --git a/src/components/scenes/WcConnectionsScene.tsx b/src/components/scenes/WcConnectionsScene.tsx
index 217c17b4f85..00c32edc8e2 100644
--- a/src/components/scenes/WcConnectionsScene.tsx
+++ b/src/components/scenes/WcConnectionsScene.tsx
@@ -36,8 +36,8 @@ export interface WcConnectionsParams {
}
export const WcConnectionsScene = (props: Props) => {
- const { navigation } = props
- const { uri } = props.route.params
+ const { navigation, route } = props
+ const { uri } = route.params ?? {}
const theme = useTheme()
const styles = getStyles(theme)
const [connections, setConnections] = React.useState([])
diff --git a/src/components/services/AccountCallbackManager.tsx b/src/components/services/AccountCallbackManager.tsx
index 9d4ff29a2b3..01f4fd5123e 100644
--- a/src/components/services/AccountCallbackManager.tsx
+++ b/src/components/services/AccountCallbackManager.tsx
@@ -75,7 +75,7 @@ export function AccountCallbackManager(props: Props) {
watchSecurityAlerts(account, hasAlerts => {
if (hasAlerts) {
- navigation.navigate('securityAlerts', {})
+ navigation.navigate('securityAlerts')
}
})
]
diff --git a/src/components/services/ContactsLoader.ts b/src/components/services/ContactsLoader.ts
index abda5f99033..19d3f913b06 100644
--- a/src/components/services/ContactsLoader.ts
+++ b/src/components/services/ContactsLoader.ts
@@ -233,6 +233,18 @@ const merchantPartners = [
familyName: '',
recordID: ''
},
+ {
+ givenName: 'Maya Protocol',
+ hasThumbnail: true,
+ thumbnailPath: 'mayaprotocol.png',
+ emailAddresses: [],
+ postalAddresses: [],
+ middleName: '',
+ company: '',
+ jobTitle: '',
+ familyName: '',
+ recordID: ''
+ },
{
givenName: 'Thorchain',
hasThumbnail: true,
diff --git a/src/components/services/PermissionsManager.tsx b/src/components/services/PermissionsManager.tsx
index c2484159109..5f3e940d243 100644
--- a/src/components/services/PermissionsManager.tsx
+++ b/src/components/services/PermissionsManager.tsx
@@ -1,14 +1,16 @@
import { Disklet } from 'disklet'
import * as React from 'react'
-import { check, checkMultiple, PermissionStatus, request } from 'react-native-permissions'
+import { check, checkMultiple, openSettings, PermissionStatus, request } from 'react-native-permissions'
+import { sprintf } from 'sprintf-js'
import { SETTINGS_PERMISSION_LIMITS, SETTINGS_PERMISSION_QUANTITY } from '../../constants/constantSettings'
import { useAsyncEffect } from '../../hooks/useAsyncEffect'
import { useIsAppForeground } from '../../hooks/useIsAppForeground'
+import { lstrings } from '../../locales/strings'
import { Permission, permissionNames, PermissionsState } from '../../reducers/PermissionsReducer'
+import { config } from '../../theme/appConfig'
import { useDispatch, useSelector } from '../../types/reactRedux'
import { ThunkAction } from '../../types/reduxTypes'
-import { ContactsPermissionModal, ContactsPermissionResult } from '../modals/ContactsPermissionModal'
import { PermissionsSettingModal } from '../modals/PermissionsSettingModal'
import { Airship, showError } from './AirshipInstance'
@@ -29,30 +31,38 @@ export const PermissionsManager = () => {
return null
}
-let showModalPromise: Promise
/**
- * Show the contacts permission modal if we enabled the Edge Contacts Access
- * setting, but the corresponding system permission is not granted. Only shows
- * modal once for simultaneous callers.
- *
- * Responding 'Deny' to the modal will disable the Edge Contacts Access setting.
- *
- * @param contactsAccessSettingOn - Edge Local Contact Access setting
- * @returns Result of Contacts Access modal or undefined if no modal shown or
- * the modal was dismissed somehow.
+ * If toggled on, will request permissions if system-level contacts permissions
+ * are not granted. If toggled off, will open system settings.
*/
-export async function showContactsPermissionModal(contactsAccessSettingOn: boolean): Promise {
- // We requested to show the modal when the setting was off already or another
- // caller to this fn is already handling it. Ignore this call.
- if (!contactsAccessSettingOn || showModalPromise != null) return undefined
-
- showModalPromise = (async () => {
- if (contactsAccessSettingOn && (await check(permissionNames.contacts)) !== 'granted') {
- return await Airship.show(bridge => )
- }
- })()
+export async function requestContactsPermission(contactsPermissionOn: boolean): Promise {
+ const currentContactsPermissionOn = (await check(permissionNames.contacts)) === 'granted'
+
+ if (contactsPermissionOn && !currentContactsPermissionOn) {
+ // Initial prompt to inform the reason of the permissions request.
+ // Denying this prompt will cause permissionStatus to be 'blocked',
+ // regardless of the prior permissions state.
+ await request(permissionNames.contacts, {
+ title: lstrings.contacts_permission_modal_title,
+ message: sprintf(lstrings.contacts_permission_modal_body_1, config.appName),
+ buttonPositive: lstrings.string_allow,
+ buttonNegative: lstrings.string_deny
+ })
+ .then(async (permissionStatus: PermissionStatus) => {
+ // Can't request permission from within the app if previously blocked
+ if (permissionStatus === 'blocked') await openSettings()
+ })
+ // Handle any other potential failure in enabling the permission
+ // progmatically from within Edge by redirecting to the system settings
+ // instead. Any manual change in system settings causes an app restart.
+ .catch(async _e => await openSettings())
+ } else if (!contactsPermissionOn && currentContactsPermissionOn) {
+ // Can't deny permission from within the app if previously allowed
+ await openSettings()
+ }
- return await showModalPromise
+ // Return the current permission state
+ return (await check(permissionNames.contacts)) === 'granted'
}
/**
diff --git a/src/components/services/Services.tsx b/src/components/services/Services.tsx
index 38823c2190b..6c731f4bbab 100644
--- a/src/components/services/Services.tsx
+++ b/src/components/services/Services.tsx
@@ -1,6 +1,9 @@
import { asDate, asJSON, asObject, uncleaner } from 'cleaners'
import { EdgeAccount } from 'edge-core-js'
import * as React from 'react'
+import { EmitterSubscription } from 'react-native'
+import { AirshipBridge } from 'react-native-airship'
+import { powerSavingModeChanged, powerSavingOn } from 'react-native-power-saving-mode'
import { updateExchangeInfo } from '../../actions/ExchangeInfoActions'
import { refreshConnectedWallets } from '../../actions/FioActions'
@@ -11,6 +14,7 @@ import { ENV } from '../../env'
import { useAsyncEffect } from '../../hooks/useAsyncEffect'
import { useHandler } from '../../hooks/useHandler'
import { useRefresher } from '../../hooks/useRefresher'
+import { lstrings } from '../../locales/strings'
import { defaultAccount } from '../../reducers/CoreReducer'
import { FooterAccordionEventService } from '../../state/SceneFooterState'
import { useDispatch, useSelector } from '../../types/reactRedux'
@@ -18,6 +22,7 @@ import { NavigationBase } from '../../types/routerTypes'
import { height, ratioHorizontal, ratioVertical, width } from '../../util/scaling'
import { snooze } from '../../util/utils'
import { FioCreateHandleModal } from '../modals/FioCreateHandleModal'
+import { AlertDropdown } from '../navigation/AlertDropdown'
import { AccountCallbackManager } from './AccountCallbackManager'
import { ActionQueueService } from './ActionQueueService'
import { Airship } from './AirshipInstance'
@@ -123,6 +128,52 @@ export function Services(props: Props) {
'Services 2'
)
+ // Subscribe to Android Power Saver state, and show a warning only if it
+ // changes from off to on:
+ useAsyncEffect(
+ async () => {
+ // This method is only available for Android
+ if (powerSavingOn == null) return
+
+ let airshipBridge: AirshipBridge | undefined
+ const handlePowerSavingModeChanged = async (isPowerSavingModeOn: boolean) => {
+ if (isPowerSavingModeOn && airshipBridge == null) {
+ await Airship.show(bridge => {
+ airshipBridge = bridge // Capture the bridge here
+ return
+ }).then(() => {
+ airshipBridge = undefined
+ })
+ } else if (!isPowerSavingModeOn && airshipBridge != null) {
+ // Dismiss the alert when power-saving mode turns off and there's an
+ // active warning that wasn't dismissed
+ airshipBridge.resolve()
+ }
+ }
+
+ // Show warning if Power Saver mode is on initially on app boot
+ await handlePowerSavingModeChanged(await powerSavingOn())
+
+ // Subscribe to Power Saver mode changes
+ let subscription: EmitterSubscription | undefined
+ if (powerSavingModeChanged != null) {
+ subscription = powerSavingModeChanged(handlePowerSavingModeChanged)
+ }
+
+ // Cleanup
+ return () => {
+ if (subscription != null) {
+ subscription.remove()
+ }
+ if (airshipBridge != null) {
+ airshipBridge.resolve()
+ }
+ }
+ },
+ [],
+ 'Services 3'
+ )
+
// Methods to call periodically
useRefresher(
async () => {
diff --git a/src/components/themed/MainButton.tsx b/src/components/themed/MainButton.tsx
index faa8acd349e..77143f7b4b0 100644
--- a/src/components/themed/MainButton.tsx
+++ b/src/components/themed/MainButton.tsx
@@ -28,13 +28,13 @@ interface Props {
// Which visual style to use. Defaults to primary (solid):
type?: MainButtonType
- // From ButtonUi4
+ // From EdgeButton
layout?: 'row' | 'column' | 'solo'
}
/**
* @deprecated
- * Use ButtonUi4 instead, and consider whether there is a genuine need for
+ * Use EdgeButton instead, and consider whether there is a genuine need for
* special margins in MainButton use cases from a UI4 design perspective.
*/
export function MainButton(props: Props) {
diff --git a/src/components/themed/MenuTabs.tsx b/src/components/themed/MenuTabs.tsx
index 09fc03406fa..3b72a5eb44c 100644
--- a/src/components/themed/MenuTabs.tsx
+++ b/src/components/themed/MenuTabs.tsx
@@ -41,7 +41,7 @@ export const MAX_TAB_BAR_HEIGHT = 58 + MAYBE_BOTTOM_PADDING
export const MIN_TAB_BAR_HEIGHT = 40 + MAYBE_BOTTOM_PADDING
const title: { readonly [key: string]: string } = {
- homeTab: lstrings.title_home,
+ home: lstrings.title_home,
walletsTab: lstrings.title_assets,
buyTab: lstrings.title_buy,
sellTab: lstrings.title_sell,
@@ -189,7 +189,7 @@ const Tab = ({
const color = isActive ? theme.tabBarIconHighlighted : theme.tabBarIcon
const icon: { readonly [key: string]: JSX.Element } = {
- homeTab: ,
+ home: ,
walletsTab: ,
buyTab: ,
sellTab: ,
@@ -200,11 +200,11 @@ const Tab = ({
const handleOnPress = useHandler(() => {
switch (route.name) {
- case 'homeTab':
+ case 'home':
setTimeout(() => {
writeDefaultScreen('home').catch(e => console.error('Failed to write defaultScreen setting: home'))
}, SAVE_DEFAULT_SCREEN_DELAY)
- return navigation.navigate('homeTab', currentName === 'homeTab' ? { screen: 'home' } : {})
+ return navigation.navigate('home')
case 'walletsTab':
setTimeout(() => {
writeDefaultScreen('assets').catch(e => console.error('Failed to write defaultScreen setting: assets'))
diff --git a/src/components/themed/SideMenu.tsx b/src/components/themed/SideMenu.tsx
index eb84a1e7a0c..08dfd3f5f78 100644
--- a/src/components/themed/SideMenu.tsx
+++ b/src/components/themed/SideMenu.tsx
@@ -122,7 +122,7 @@ export function SideMenu(props: DrawerContentComponentProps) {
}
const handleBorrow = () => {
- navigation.navigate('loanDashboard', {})
+ navigation.navigate('loanDashboard')
navigation.dispatch(DrawerActions.closeDrawer())
}
@@ -148,7 +148,7 @@ export function SideMenu(props: DrawerContentComponentProps) {
}
const handleMarketsPress = () => {
- navigation.navigate('coinRanking', {})
+ navigation.navigate('coinRanking')
}
const handleShareApp = () => {
@@ -216,7 +216,7 @@ export function SideMenu(props: DrawerContentComponentProps) {
}> = [
{
pressHandler: () => {
- navigation.navigate('fioAddressList', {})
+ navigation.navigate('fioAddressList')
navigation.dispatch(DrawerActions.closeDrawer())
},
iconName: 'control-panel-fio-names',
@@ -224,7 +224,7 @@ export function SideMenu(props: DrawerContentComponentProps) {
},
{
pressHandler: () => {
- navigation.navigate('fioRequestList', {})
+ navigation.navigate('fioRequestList')
navigation.dispatch(DrawerActions.closeDrawer())
},
iconName: 'control-panel-fio',
@@ -252,7 +252,7 @@ export function SideMenu(props: DrawerContentComponentProps) {
{ pressHandler: handleShareApp, iconName: 'control-panel-share', title: lstrings.string_share + ' ' + config.appName },
{
pressHandler: () => {
- navigation.navigate('settingsOverview', {})
+ navigation.navigate('settingsOverview')
navigation.dispatch(DrawerActions.closeDrawer())
},
iconName: 'control-panel-settings',
diff --git a/src/components/themed/TransactionListTop.tsx b/src/components/themed/TransactionListTop.tsx
index 0647515a5a3..0292e809c3f 100644
--- a/src/components/themed/TransactionListTop.tsx
+++ b/src/components/themed/TransactionListTop.tsx
@@ -29,7 +29,6 @@ import { useDispatch, useSelector } from '../../types/reactRedux'
import { NavigationProp } from '../../types/routerTypes'
import { GuiExchangeRates } from '../../types/types'
import { CryptoAmount } from '../../util/CryptoAmount'
-import { getTokenId } from '../../util/CurrencyInfoHelpers'
import { triggerHaptic } from '../../util/haptic'
import { getFioStakingBalances, getPluginFromPolicy, getPositionAllocations } from '../../util/stakeUtils'
import { convertNativeToDenomination, datelog, DECIMAL_PRECISION, removeIsoPrefix, zeroString } from '../../util/utils'
@@ -213,10 +212,9 @@ export class TransactionListTopComponent extends React.PureComponent {
if (result?.type === 'wallet') {
- const { currencyCode, walletId } = result
+ const { tokenId, walletId } = result
const wallet = account.currencyWallets[walletId]
if (wallet == null) return
- const tokenId = getTokenId(wallet.currencyConfig, currencyCode)
navigation.setParams({ tokenId, walletId })
}
})
@@ -244,18 +242,6 @@ export class TransactionListTopComponent extends React.PureComponent
- {!config.disableSwaps ? (
- this.handleTradeSwap(bridge)}
- icon={
-
-
-
- }
- />
- ) : null}
}
/>
+ {!config.disableSwaps ? (
+ this.handleTradeSwap(bridge)}
+ icon={
+
+
+
+ }
+ />
+ ) : null}
))
}
handleTradeBuy = (bridge: AirshipBridge) => {
const { navigation, wallet, tokenId } = this.props
- const forcedWalletResult = { type: 'wallet', walletId: wallet.id, tokenId }
+ const forcedWalletResult: WalletListResult = {
+ type: 'wallet',
+ walletId: wallet.id,
+ tokenId
+ }
navigation.navigate('buyTab', { screen: 'pluginListBuy', params: { forcedWalletResult } })
bridge.resolve()
@@ -292,7 +294,11 @@ export class TransactionListTopComponent extends React.PureComponent) => {
const { navigation, wallet, tokenId } = this.props
- const forcedWalletResult = { type: 'wallet', walletId: wallet.id, tokenId }
+ const forcedWalletResult: WalletListResult = {
+ type: 'wallet',
+ walletId: wallet.id,
+ tokenId
+ }
navigation.navigate('sellTab', { screen: 'pluginListSell', params: { forcedWalletResult } })
bridge.resolve()
diff --git a/src/components/themed/WalletListSwipeable.tsx b/src/components/themed/WalletListSwipeable.tsx
index d804f6dfbc6..a5fad91fbdf 100644
--- a/src/components/themed/WalletListSwipeable.tsx
+++ b/src/components/themed/WalletListSwipeable.tsx
@@ -67,7 +67,7 @@ function WalletListSwipeableComponent(props: Props) {
const handleCreateWallet = useHandler(async (walletId: string, tokenId: EdgeTokenId) => {
const wallet = account.currencyWallets[walletId]
- const countryCode = await getCountryCodeByIp().catch(() => '')
+ const countryCode = await getCountryCodeByIp()
dispatch(selectWalletToken({ navigation, walletId, tokenId }))
.then(
activationNotRequired =>
diff --git a/src/components/themed/WalletListSwipeableCurrencyRow.tsx b/src/components/themed/WalletListSwipeableCurrencyRow.tsx
index f8356a19af8..080b23f9c16 100644
--- a/src/components/themed/WalletListSwipeableCurrencyRow.tsx
+++ b/src/components/themed/WalletListSwipeableCurrencyRow.tsx
@@ -70,7 +70,7 @@ function WalletListSwipeableCurrencyRowComponent(props: Props) {
closeRow()
dispatch(selectWalletToken({ navigation, walletId: wallet.id, tokenId, alwaysActivate: true }))
.then(async activated => {
- const countryCode = await getCountryCodeByIp().catch(() => '')
+ const countryCode = await getCountryCodeByIp()
if (activated) {
navigation.navigate('transactionList', { tokenId, walletId: wallet.id, walletName: wallet.name ?? wallet.currencyInfo.displayName, countryCode })
}
diff --git a/src/components/tiles/AddressTile2.tsx b/src/components/tiles/AddressTile2.tsx
index df83761ead6..41aea8ed88b 100644
--- a/src/components/tiles/AddressTile2.tsx
+++ b/src/components/tiles/AddressTile2.tsx
@@ -240,9 +240,7 @@ export const AddressTile2 = React.forwardRef((props: Props, ref: React.Forwarded
})
const handleTilePress = useHandler(async () => {
- if (!lockInputs && !!recipientAddress) {
- resetSendTransaction()
- }
+ resetSendTransaction()
})
// ---------------------------------------------------------------------------
@@ -266,7 +264,7 @@ export const AddressTile2 = React.forwardRef((props: Props, ref: React.Forwarded
const tileType = !!recipientAddress && !lockInputs ? 'delete' : 'none'
return (
-
+
{!recipientAddress && (
diff --git a/src/constants/plugins/buyPluginList.json b/src/constants/plugins/buyPluginList.json
index 5239fbee63a..59e6e83785c 100644
--- a/src/constants/plugins/buyPluginList.json
+++ b/src/constants/plugins/buyPluginList.json
@@ -66,7 +66,7 @@
"title": "Bank Wire Transfer",
"description": "Fee: ~2%\nSettlement: ~5 minutes\nLimit $10000",
"forCountries": ["US"],
- "notStateProvinces": { "US": ["FL", "NY", "TX"] },
+ "notStateProvinces": { "US": ["AK", "AR", "CT", "NC", "NY", "TX"] },
"cryptoCodes": [],
"paymentTypeLogoKey": "bank"
},
diff --git a/src/controllers/edgeProvider/EdgeProviderServer.tsx b/src/controllers/edgeProvider/EdgeProviderServer.tsx
index 89840b79000..96f467329bc 100644
--- a/src/controllers/edgeProvider/EdgeProviderServer.tsx
+++ b/src/controllers/edgeProvider/EdgeProviderServer.tsx
@@ -29,7 +29,7 @@ import { NavigationBase } from '../../types/routerTypes'
import { EdgeAsset, MapObject } from '../../types/types'
import { getCurrencyIconUris } from '../../util/CdnUris'
import { CryptoAmount } from '../../util/CryptoAmount'
-import { getTokenIdForced } from '../../util/CurrencyInfoHelpers'
+import { getCurrencyCode } from '../../util/CurrencyInfoHelpers'
import { getWalletName } from '../../util/CurrencyWalletHelpers'
import { makeCurrencyCodeTable } from '../../util/tokenIdTools'
import { logEvent } from '../../util/tracking'
@@ -115,14 +115,14 @@ export class EdgeProviderServer implements EdgeProviderMethods {
))
if (result?.type === 'wallet') {
- const { walletId, currencyCode } = result
+ const { walletId, tokenId } = result
this._selectedWallet = account.currencyWallets[walletId]
+ const currencyCode = getCurrencyCode(this._selectedWallet, tokenId)
if (this._selectedWallet == null) throw new Error(`Missing wallet for walletId`)
const chainCode = this._selectedWallet.currencyInfo.currencyCode
const tokenCode = currencyCode
const { pluginId } = this._selectedWallet.currencyInfo
- const tokenId = getTokenIdForced(account, pluginId, currencyCode)
this._selectedTokenId = tokenId
const unfixCode = unfixCurrencyCode(this._plugin.fixCurrencyCodes, pluginId, tokenId)
diff --git a/src/declare-modules.d.ts b/src/declare-modules.d.ts
index 6fd1ecc0091..7f825d6da83 100644
--- a/src/declare-modules.d.ts
+++ b/src/declare-modules.d.ts
@@ -30,6 +30,13 @@ declare module 'csv-stringify/lib/browser/sync' {
export default function stringify(input: any[], options?: any): string
}
+declare module 'react-native-power-saving-mode' {
+ import { EmitterSubscription } from 'react-native'
+
+ export const powerSavingOn: (() => Promise) | null
+ export const powerSavingModeChanged: ((callback: (state: boolean) => void) => EmitterSubscription) | null
+}
+
declare module 'edge-currency-monero/lib/react-native-io'
declare module 'react-native-smart-splash-screen'
declare module 'rn-id-blurview'
diff --git a/src/envConfig.ts b/src/envConfig.ts
index 5be035d1979..759c4e30d36 100644
--- a/src/envConfig.ts
+++ b/src/envConfig.ts
@@ -275,7 +275,22 @@ export const asEnvConfig = asObject({
apiKey: asOptional(asString, '')
}).withRest
),
+ MAYA_PROTOCOL_INIT: asCorePluginInit(
+ asObject({
+ affiliateFeeBasis: asOptional(asString, '50'),
+ appId: asOptional(asString, 'edge'),
+ thorname: asOptional(asString, 'ej')
+ }).withRest
+ ),
THORCHAIN_INIT: asCorePluginInit(
+ asObject({
+ affiliateFeeBasis: asOptional(asString, '50'),
+ appId: asOptional(asString, 'edge'),
+ ninerealmsClientId: asOptional(asString, ''),
+ thorname: asOptional(asString, 'ej')
+ }).withRest
+ ),
+ THORCHAIN_DA_INIT: asCorePluginInit(
asObject({
affiliateFeeBasis: asOptional(asString, '50'),
appId: asOptional(asString, 'edge'),
diff --git a/src/hooks/redux/useContactThumbnail.ts b/src/hooks/redux/useContactThumbnail.ts
index 5913b3186ef..45126bf1903 100644
--- a/src/hooks/redux/useContactThumbnail.ts
+++ b/src/hooks/redux/useContactThumbnail.ts
@@ -1,45 +1,42 @@
import * as React from 'react'
+import { check } from 'react-native-permissions'
-import { setContactsPermissionOn } from '../../actions/LocalSettingsActions'
-import { showError } from '../../components/services/AirshipInstance'
-import { showContactsPermissionModal } from '../../components/services/PermissionsManager'
+import { maybeShowContactsPermissionModal } from '../../components/modals/ContactsPermissionModal'
+import { requestContactsPermission } from '../../components/services/PermissionsManager'
+import { permissionNames } from '../../reducers/PermissionsReducer'
import { useDispatch, useSelector } from '../../types/reactRedux'
-import { Dispatch } from '../../types/reduxTypes'
import { normalizeForSearch } from '../../util/utils'
-
-export const maybeShowContactsPermissionModal = (dispatch: Dispatch, contactsPermissionOn: boolean) => {
- // Ignored if 'Contacts Access' setting is disabled
- if (!contactsPermissionOn) return
-
- // Contacts permission request:
- showContactsPermissionModal(contactsPermissionOn)
- .then(modalResult => {
- if (modalResult !== undefined) {
- // Update the Edge setting and system permission setting
- dispatch(setContactsPermissionOn(modalResult === 'allow')).catch(error => showError(error))
- }
- })
- .catch(error => showError(error))
-}
+import { useAsyncEffect } from '../useAsyncEffect'
/**
- * Looks up a thumbnail image for a contact.
+ * Looks up a thumbnail image for a contact. Will show a contacts permission
+ * request modal if we haven't shown it before and the system contacts
+ * permission is not granted.
*/
export const useContactThumbnail = (name?: string): string | undefined => {
- const dispatch = useDispatch()
const contacts = useSelector(state => state.contacts)
- const contactsPermissionOn = useSelector(state => state.ui.settings.contactsPermissionOn)
-
- React.useEffect(() => {
- maybeShowContactsPermissionModal(dispatch, contactsPermissionOn)
-
- // Avoid popping up the modal when the scene calling the hook is mounted and
- // the user changes contactsPermissionOn.
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [dispatch])
+ const dispatch = useDispatch()
+ const [currentContactsPermissionOn, setCurrentContactsPermissionOn] = React.useState(false)
+
+ useAsyncEffect(
+ async () => {
+ const currentContactsPermissionOn = (await check(permissionNames.contacts).catch(_error => 'denied')) === 'granted'
+ setCurrentContactsPermissionOn(currentContactsPermissionOn)
+
+ if (!currentContactsPermissionOn) {
+ const result = await dispatch(maybeShowContactsPermissionModal())
+ if (result === 'allow') {
+ await requestContactsPermission(true)
+ }
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ },
+ [],
+ 'useContactThumbnail'
+ )
return React.useMemo(() => {
- if (name == null || !contactsPermissionOn) return
+ if (name == null || !currentContactsPermissionOn) return
const searchName = normalizeForSearch(name)
for (const contact of contacts) {
@@ -49,5 +46,5 @@ export const useContactThumbnail = (name?: string): string | undefined => {
return contact.thumbnailPath
}
}
- }, [contacts, contactsPermissionOn, name])
+ }, [contacts, currentContactsPermissionOn, name])
}
diff --git a/src/hooks/useAsyncNavigation.tsx b/src/hooks/useAsyncNavigation.tsx
index 582bfff09f4..4939b46888d 100644
--- a/src/hooks/useAsyncNavigation.tsx
+++ b/src/hooks/useAsyncNavigation.tsx
@@ -1,14 +1,14 @@
import { NavigationProp as NavigationCoreProp, StackActionHelpers } from '@react-navigation/native'
import * as React from 'react'
-import { AppParamList, NavigationBase, RouteParamList } from '../types/routerTypes'
+import { AppParamList, NavigationBase } from '../types/routerTypes'
/**
* Use this in place of NavigationProp/NavigationBase methods to prevent
* multiple navigations from rapid tapping. Navigation calls are only executed
* if there isn't already another one in flight
*/
-export const useAsyncNavigation = (
+export const useAsyncNavigation = (
navigation: NavigationBase | (NavigationCoreProp & StackActionHelpers)
): NavigationBase & (NavigationCoreProp & StackActionHelpers) => {
const [isNavigating, setIsNavigating] = React.useState(false)
diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts
index 51fc06c1779..3c271e54212 100644
--- a/src/locales/en_US.ts
+++ b/src/locales/en_US.ts
@@ -124,10 +124,9 @@ const strings = {
warning_token_code_override_2s:
'The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.',
- warning_token_contract_override_3s:
- 'The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.',
warning_token_exists_1s: 'The entered token already exists as a built-in token %1$s',
warning_uk_risk: `Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.`,
+ warning_battery_saver: `Battery Saver mode detected. Balances and transactions may be inaccurate`,
// Alert component:
alert_dropdown_alert: 'Alert! ',
@@ -324,7 +323,6 @@ const strings = {
activate_wallet_token_transaction_name_xrp: 'XRP Ledger',
activate_wallet_token_transaction_notes_xrp: 'Activate XRP token by enabling Trust Line to issuer',
activate_wallet_token_scene_title: 'Activate Token',
- activate_wallet_tokens_scene_title: 'Activate Tokens',
activate_wallet_token_scene_tile_title: 'Token to Activate',
activate_wallet_tokens_scene_tile_title: 'Tokens to Activate',
activate_wallet_token_scene_body:
@@ -1447,6 +1445,11 @@ const strings = {
fiat_plugin_fetching_assets: 'Fetching supported assets',
fiat_plugin_sell_cancelled: 'Sell order cancelled',
fiat_plugin_finalizing_quote: 'Finalizing your exchange quote. Please wait as this may take up to a minute',
+ fiat_plugin_buy_complete_title: 'Buy Order Complete',
+ fiat_plugin_buy_complete_message_s: 'Your buy order of %1$s %2$s with %3$s %4$s has been completed.',
+ fiat_plugin_buy_complete_message_2_hour_s: 'Please allow up to %1$s hour for the funds to appear in your wallet.',
+ fiat_plugin_buy_complete_message_2_hours_s: 'Please allow up to %1$s hours for the funds to appear in your wallet.',
+ fiat_plugin_buy_failed_try_again: 'Buy order failed. Please try again',
fiat_plugin_sell_complete_title: 'Sell Order Complete',
fiat_plugin_sell_complete_message_s: 'Your sell order of %1$s %2$s for %3$s %4$s has been completed.',
fiat_plugin_sell_complete_message_2_hour_s: 'Please allow up to %1$s hour for the funds to appear in your account.',
diff --git a/src/locales/strings/de.json b/src/locales/strings/de.json
index ab650a7b709..30504b1bf15 100644
--- a/src/locales/strings/de.json
+++ b/src/locales/strings/de.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Achtung!",
"alert_dropdown_warning": "Warnung! ",
"azteco_success": "Sie haben eine Azteco-Bitcoin-Karte eingelöst. Das Geld sollte in Kürze eintreffen.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json
index ef3c6174e7d..9dd418b8c0a 100644
--- a/src/locales/strings/enUS.json
+++ b/src/locales/strings/enUS.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Alert! ",
"alert_dropdown_warning": "Warning! ",
"azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/es.json b/src/locales/strings/es.json
index 5233ca01c00..ad404a63b31 100644
--- a/src/locales/strings/es.json
+++ b/src/locales/strings/es.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "¡Alerta! ",
"alert_dropdown_warning": "¡Advertencia! ",
"azteco_success": "Has canjeado una tarjeta de bitcoin Azteco. Los fondos deberían llegar pronto.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "Libro contable de XRP",
"activate_wallet_token_transaction_notes_xrp": "Activar el token XRP habilitando la Línea de Confianza al emisor",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token para activar",
"activate_wallet_tokens_scene_tile_title": "Tokens para activar",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/esMX.json b/src/locales/strings/esMX.json
index 56e00a17d96..8fb1974b055 100644
--- a/src/locales/strings/esMX.json
+++ b/src/locales/strings/esMX.json
@@ -10,7 +10,7 @@
"action_queue_display_fiat_buy_title": "Compra %s",
"action_queue_display_fiat_buy_message": "Compra %1$s de %3$s.",
"action_queue_display_fiat_sell_title": "Depositar fondos a banco",
- "action_queue_display_fiat_sell_message": "Nuestros socios venden sus %1$s y los depositan en su cuenta bancaria a través de %2$s.",
+ "action_queue_display_fiat_sell_message": "Tu %1$s está siendo vendido por nuestros socios y depositado en tu cuenta bancaria a través de %2$s.",
"action_queue_display_loan_borrow_title": "Obtener préstamo",
"action_queue_display_loan_borrow_message_1s": "Un préstamo de %1$s ha sido solicitado y está en camino a tu billetera.",
"action_queue_display_loan_deposit_title": "Depositando %1$s como colateral",
@@ -28,7 +28,7 @@
"action_display_title_create": "Creando préstamo",
"action_display_title_swap": "Intercambiando fondos",
"action_display_message_create_3s": "%1$s está creando su préstamo en %2$s usando su %3$s como colateral",
- "action_display_message_swap_4s": "%1$s está intercambiando tus %2$s por %3$s para depositarlos en %4$s. Esto puede tardar desde unos minutos hasta varias horas…",
+ "action_display_message_swap_4s": "%1$s está intercambiando tus %2$s por %3$s para depositarlos en %4$s. Esto puede tardar desde unos minutos hasta horas…",
"action_display_message_swap_fees_5s": "%1$s está intercambiando tus %2$s por %3$s y %4$s (para pagar tarifas) por depósito en %5$s. Esto puede tardar desde unos minutos hasta varias horas…",
"action_display_title_complete_default": "Felicitaciones!",
"action_display_message_complete_default": "¡Tus transacciones se completaron exitosamente!\nEspere tiempo para que sus cuentas se actualicen.",
@@ -36,23 +36,23 @@
"action_display_message_complete_bank": "¡Tu préstamo está completo!\nDeberías ver fondos en tu cuenta bancaria en 1 a 4 días",
"bitpay_metadata_name": "Factura #: %s",
"bitcoin_received": "Has recibido %1$s",
- "dialog_title": "Auto cierre de sesión",
+ "dialog_title": "Establecer tiempo de cierre de sesión automático",
"share_subject": "Hola, creo que deberías probar %s",
"share_message": "Puedes comprar, guardar y intercambiar con decenas de criptomonedas en una sola aplicación.",
"drawer_borrow_dollars": "Pedir prestado dolares",
- "drawer_exchange_rate_loading": "Cargando Tipo de Cambio",
+ "drawer_exchange_rate_loading": "Cargando tipo de cambio",
"drawer_exchange": "Intercambio",
- "drawer_scan_qr_send": "Escanear Código QR",
- "drawer_sweep_private_key": "Retirar clave privada (Sweep Pk)",
+ "drawer_scan_qr_send": "Escanear código QR",
+ "drawer_sweep_private_key": "Barrido de clave privada",
"drawer_fio_names": "Nombres FIO",
"drawer_fio_requests": "Solicitudes FIO",
"network_alert_title": "Sin conexión a Internet",
"fio_network_alert_text": "La funcionalidad FIO requiere conexión a Internet.",
- "fio_address_choose_label": "Elige un ususario para FIO",
+ "fio_address_choose_label": "Elige un usuario para FIO",
"fio_domain_choose_label": "Elegir un dominio FIO",
- "fio_address_choose_domain_label": "Elige un dominio FIO para tu ususario",
+ "fio_address_choose_domain_label": "Elige un dominio FIO para tu usuario",
"scan_qr_label": "Escanear código QR",
- "error_no_email_account": "No hay configuración de cuenta de correo electrónico en el teléfono. Configure una cuenta de correo electrónico en su teléfono para utilizar esta función.",
+ "error_no_email_account": "No hay configuración de cuenta de correo electrónico en el teléfono. Por favor configure una cuenta de correo electrónico en su teléfono para utilizar esta función.",
"error_paymentprotocol_empty_output_invoice": "No se ha recibido respuesta en la solicitud de pago",
"error_paymentprotocol_empty_verification_hex_req": "Generado hex(s) de transacción vacía",
"error_paymentprotocol_currency_not_supported": "Pagos de facturas con protocolo de pago en %s no se admiten actualmente. Elija otra moneda de pago.",
@@ -63,8 +63,8 @@
"error_paymentprotocol_no_payment_option": "No hay monedas disponibles para esta factura de Protocolo de pago. Monedas aceptadas: %s",
"error_paymentprotocol_tx_verification_failed": "La verificación de la transacción del protocolo de pago no coincide",
"error_spend_amount_less_then_min_s": "El importe del gasto es inferior al mínimo de %s",
- "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully",
- "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.",
+ "error_amount_too_low_to_stake_s": "La cantidad %s es demasiado baja para apostar con éxito",
+ "error_balance_below_minimum_to_stake_2s": "Tu saldo de %1$s no cumple con el mínimo %2$s requerido para apostar.",
"warning_low_fee_selected": "Tarifa baja seleccionada",
"warning_custom_fee_selected": "Tarifa personalizada seleccionada",
"warning_low_or_custom_fee": "Usar una comisión baja puede aumentar la cantidad de tiempo que tarda en confirmar tu transacción. En raras ocasiones tu transacción puede fallar.",
@@ -73,15 +73,15 @@
"warning_scam_title": "Advertencia de Estafa",
"warning_scam_message_financial_advice_s": "%s no dará asesoramiento financiero.",
"warning_scam_message_irreversibility": "Las transacciones con criptomonedas son irreversibles.",
- "warning_scam_message_unknown_recipients": "No envíes dinero a personas u organizaciones que no concoces.",
- "warning_scam_footer_s": "Si usted tiene alguna pregunta o inquietud con respecto a este envío, comuníquese con %s",
+ "warning_scam_message_unknown_recipients": "No envíes dinero a personas u organizaciones que no conoces.",
+ "warning_scam_footer_s": "Si tiene alguna pregunta o inquietud con respecto a este envío, comuníquese con %s",
"warning_scam_message": "¿Alguien te ha ayudado a configurar esta cuenta?",
"warning_scam_message_no_1s": "Genial, si alguna vez tiene alguna pregunta, comuníquese con nuestro equipo de soporte al %1$s.",
"warning_scam_message_yes_1s": "¡Por favor proceda con precaución! La asistencia con la creación de cuentas tiene el potencial de ser fraudulenta. Los usuarios nunca deben compartir contraseñas o claves privadas. Las redes sociales y las plataformas de chat han estado involucradas en los ataques. No envíes criptomonedas a extraños. Si cree que se están aprovechando de usted, comuníquese con nuestro equipo de soporte al %1$s.",
"warning_token_code_override_2s": "La dirección del contrato ingresada difiere de la dirección del contrato del token integrado %1$s. Por favor. Proceda con precaución y verifique que el contrato sea legítimo, ya que el uso de este token puede provocar la pérdida de fondos. Si tiene preguntas sobre esta función o contrato, comuníquese con %2$s.",
- "warning_token_contract_override_3s": "El token ingresado %1$s existe como un token integrado %2$s con la misma dirección de contrato. Por favor. Proceda con precaución y verifique que el contrato sea legítimo, ya que el uso de este token puede provocar la pérdida de fondos. Si tiene preguntas sobre esta función, comuníquese con %3$s.",
"warning_token_exists_1s": "El token ingresado ya existe como token integrado %1$s",
- "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_uk_risk": "No invierta a menos que esté dispuesto a perder todo el dinero que invierta. Esta es una inversión de alto riesgo y no debe esperar estar protegido si algo sale mal. Tómese al menos dos minutos para obtener más información.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "¡Alerta! ",
"alert_dropdown_warning": "¡Advertencia! ",
"azteco_success": "Has canjeado una tarjeta de bitcoin Azteco. Los fondos deberían llegar pronto.",
@@ -89,8 +89,8 @@
"azteco_service_unavailable": "Error contactando con el servidor Azteco. Por favor, inténtalo de nuevo más tarde.",
"reqaddr_error_unsupported_chains": "%1$s no admite las siguientes cadenas enumeradas en la solicitud: %2$s",
"reqaddr_error_invalid_redir": "Consulta 'redir' inválida en la solicitud de dirección de pago",
- "reqaddr_error_no_currencies_found": "No se encontraron divisas en la solicitud de dirección de pago",
- "reqaddr_error_no_wallets_selected": "No hay monederos seleccionados para la solicitud de dirección de pago",
+ "reqaddr_error_no_currencies_found": "No se encontraron monedas en la solicitud de dirección de pago",
+ "reqaddr_error_no_wallets_selected": "No hay billeteras seleccionadas para solicitar la dirección de pago",
"reqaddr_error_post_redir": "Dirección de publicación y redirección no encontrada en la solicitud de dirección de pago",
"reqaddr_application_fragment": "Una solicitud",
"reqaddr_confirm_modal_title": "Confirmar solicitud?",
@@ -118,7 +118,7 @@
"addtoken_denomination_input_text": "Número de decimales",
"addtoken_name_input_text": "Nombre del token",
"addtoken_add": "Añadir token personalizado",
- "edittoken_delete_token": "Borrar token",
+ "edittoken_delete_token": "Eliminar token",
"edittoken_delete_prompt": "¿Seguro que quieres eliminar este token?",
"edittoken_invalid_decimal_places": "Ingresa un número de decimales válido por favor.",
"fragment_create_wallet_create_wallet": "Crear cartera",
@@ -126,7 +126,7 @@
"fragment_create_wallet_select_valid": "Seleccione datos válidos por favor",
"fragment_request_copy_title": "Copiar",
"fragment_request_subtitle": "Recibir",
- "fragment_request_address_uri_copied": "Solicitar dirección URI copiada al portapapeles",
+ "fragment_request_address_uri_copied": "Dirección de solicitud URI copiada al portapapeles",
"fragment_copied": "Copiado correctamente en el portapapeles",
"request_minimum_notification_title": "Saldo mínimo requerido",
"request_xrp_minimum_notification_body": "Para que las billeteras Ripple (XRP) funcionen se requieren un saldo mínimo de 10 XRP. Debe depositar al menos 10 XRP en esta dirección antes de que esta billetera muestre un saldo o transacciones. 10 XRP serán inutilizables de por vida en la dirección de esta billetera.",
@@ -144,9 +144,9 @@
"scan_invalid_address_error_title": "Dirección Inválida",
"scan_invalid_address_error_description": "No es una dirección pública válida",
"fragment_send_subtitle": "Enviar",
- "fragment_send_myself": "A mí",
+ "fragment_send_myself": "Yo mismo",
"fragment_send_from_label": "De",
- "fragment_stake_label": "Bloqueo (Stake)",
+ "fragment_stake_label": "Apuesta",
"fragment_transaction_exchange": "Intercambiar",
"fragment_transaction_expense": "Gasto",
"fragment_transaction_income": "Ingreso",
@@ -179,7 +179,7 @@
"fragment_wallets_unpause_wallet": "Reactivar billetera",
"fragment_wallets_wallet_paused": "Billetera en pausa",
"fragment_wallets_wallet_disabled": "Cartera desactivada",
- "fragment_wallets_view_private_view_key": "Clave de Visualización",
+ "fragment_wallets_view_private_view_key": "Clave de vista privada",
"fragment_wallets_view_private_view_key_warning_s": "La clave de vista privada permite al receptor ver el saldo en su billetera %1$s. Por favor. No comparta esta clave a menos que sea necesario, como por motivos fiscales, contables o motivos similares.",
"fragment_wallets_view_xpub": "Ver dirección XPub",
"fragment_wallets_pubkey_copied_title": "Dirección XPub copiada",
@@ -243,10 +243,10 @@
"create_wallet_account_invalid_account_name": "Nombre de cuenta inválido. No cumple los requisitos",
"create_wallet_account_account_name_unavailable": "Nombre de cuenta no disponible. Por favor elige otro",
"create_wallet_account_unknown_error": "Error desconocido comprobando el nombre de la cuenta. Por favor inténtalo más tarde",
- "create_wallet_account_confirm": "Verifique la cartera y el información del pago antes de enviar.",
+ "create_wallet_account_confirm": "Verifique la cartera y la información del pago antes de enviar.",
"create_wallet_account_amount_due": "Importe:",
"create_wallet_account_error_sending_transaction": "Error enviando la transacción",
- "create_wallet_account_payment_sent_title": "Pago Enviado",
+ "create_wallet_account_payment_sent_title": "Pago enviado",
"create_wallet_account_payment_sent_message": "Pago de activación enviado. Espere una confirmación de su transacción antes de usar su nueva billetera.",
"create_wallet_account_handle_unavailable_modal_title": "Alias de cuenta no disponible",
"create_wallet_account_handle_unavailable_modal_message": "Tu alias de cuenta elegido, %s, no esta disponible en este momento. Por favor utiliza uno distinto para continuar.",
@@ -261,9 +261,8 @@
"activate_wallet_token_transaction_name_xrp": "Libro contable de XRP",
"activate_wallet_token_transaction_notes_xrp": "Activar el token XRP habilitando la Línea de Confianza al emisor",
"activate_wallet_token_scene_title": "Activar token",
- "activate_wallet_tokens_scene_title": "Activar tokens",
"activate_wallet_token_scene_tile_title": "Token para activar",
- "activate_wallet_tokens_scene_tile_title": "Tokens para activar",
+ "activate_wallet_tokens_scene_tile_title": "Token para activar",
"activate_wallet_token_scene_body": "Para enviar y recibir el token seleccionado, primero deberá activarlo con una transacción blockchain. Esta transacción costará la siguiente tarifa.\n\nConfirme usando el control deslizante a continuación.",
"activate_wallet_token_scene_body_xrp_extra": "La activación del token aumentará el requisito de reserva de XRP en 2 XRP por token activado.",
"activate_wallet_token_scene_body_algo_extra": "La activación del token aumentará el requisito de reserva de ALGO en 0,1 ALGO por token activado.",
@@ -278,7 +277,7 @@
"fio_src_wallet": "Pagar desde cartera",
"submit": "Enviar",
"login": "Entrar",
- "help_build": "Versión",
+ "help_build": "Construir",
"help_modal_title_thanks": "Gracias por utilizar %1$s!",
"help_version": "Versión",
"help_knowledge_base": "Centro de conocimientos",
@@ -336,11 +335,11 @@
"transaction_success_message": "Tu transacción ha sido enviada correctamente.",
"incorrect_pin": "NIP incorrecto",
"invalid_spend_request": "Solicitud de gasto inválida",
- "invalid_custom_fee": "Tarifa mínima es",
- "guest_account_id_1s": "Guest Account (%1$s)",
+ "invalid_custom_fee": "La tarifa personalizada mínima es",
+ "guest_account_id_1s": "Cuenta de invitado (%1$s)",
"settings_detect_tokens": "Detectar y habilitar tokens",
"settings_enable_detected_tokens_toast": "Tokens detectados habilitados",
- "settings_no_detected_tokens_toast": "No se encontraron saldos en tokens deshabilitados",
+ "settings_no_detected_tokens_toast": "No hay saldos en tokens deshabilitados",
"settings_account_title_cap": "Cuenta",
"settings_asset_settings": "Configuración de activos",
"settings_button_change_password": "Cambiar contraseña",
@@ -370,9 +369,9 @@
"swap_options_header_centralized": "Centralizado\nPuede requerir información personal",
"swap_preferred_instructions": "Cuando varias casas de cambio pueden ejecutar una orden, preferir:",
"swap_preferred_promo_instructions": "Cuando varias casas de cambio pueden completar un pedido, la promoción actual prefiere:",
- "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time",
- "swap_minimum_receive_amount": "Min Receive Amount",
- "swap_minimum_amount_1s": "Min %1$s",
+ "swap_token_no_enabled_exchanges_2s": "Ningún intercambio habilitado admite %1$s (en %2$s) en este momento",
+ "swap_minimum_receive_amount": "Cantidad mínima de recepción",
+ "swap_minimum_amount_1s": "Mínimo %1$s",
"settings_button_clear_logs": "Eliminar registros",
"settings_button_send_logs": "Enviar registros a Edge",
"settings_button_export_logs": "Exportar registros",
@@ -380,7 +379,7 @@
"settings_button_unlock_settings": "Pulsa para desbloquear la configuración de la cuenta",
"settings_button_use_touchID": "Usar TouchID",
"settings_button_use_faceID": "Usar FaceID",
- "settings_button_use_biometric": "Usar huella",
+ "settings_button_use_biometric": "Usar biometría",
"settings_days": "Día(s)",
"settings_denominations_title": "Denominaciones",
"settings_custom_nodes_title": "Servidores Personalizados",
@@ -435,16 +434,16 @@
"staking_change_unlock_explainer2": "Estos continúan bloqueados e inutilizables durante 7 días después de retirar los fondos.",
"staking_overview_header": "Bloquear %s",
"staking_overview_explainer": "Tienes los siguientes fondos bloqueados:",
- "staking_locked_title": "Sin invertir y bloqueado hasta %1$s",
- "staking_stake_funds_button": "Bloquear más fondos",
- "staking_unstake_funds_button": "Dejar de invertir",
+ "staking_locked_title": "Desapostado y bloqueado hasta %1$s",
+ "staking_stake_funds_button": "Apostar más fondos",
+ "staking_unstake_funds_button": "Desapuesta",
"staking_status": "%1$s bloqueado (%2$s)",
- "staking_success": "Bloqueado exitosamente",
- "staking_unstake_success": "Desbloqueado exitosamente",
+ "staking_success": "Apuesta con éxito",
+ "staking_unstake_success": "Desapostado con éxito",
"staking_estimated_rewards": "Recompensas estimadas",
"staking_estimated_return": "Rendimiento estimado: %1$s APY",
"staking_estimated_return_up_to": "Rendimiento estimado: hasta %1$s APY",
- "staking_no_fio_address_error": "No se puede hacer el bloqueo sin una direccion FIO",
+ "staking_no_fio_address_error": "No se puede apostar sin direcciones FIO",
"staking_no_bundled_txs_error": "No hay suficientes transacciones incluidas para la dirección FIO %1$s",
"string_i_agree": "Acepto",
"string_expires": "Expirado",
@@ -462,7 +461,7 @@
"gasPrice": "Precio Gas (Gwei)",
"string_disable": "Deshabilitado",
"string_done_cap": "Hecho",
- "string_first_amoy_wallet_name": "My Amoy",
+ "string_first_amoy_wallet_name": "Mi Amoy",
"string_first_ethereum_wallet_name": "Mi Ether",
"string_first_ethereum_classic_wallet_name": "Mi Ethereum Classic",
"string_first_ethereum_pow_wallet_name": "Mi Ethereum POW",
@@ -477,9 +476,9 @@
"string_first_bitcoin_sv_wallet_name": "Mi Bitcoin SV",
"string_first_bitcoin_gold_wallet_name": "Mi Bitcoin Gold",
"string_first_dash_wallet_name": "Mi Dash",
- "string_first_digibyte_wallet_name": "Mi Digibyte",
+ "string_first_digibyte_wallet_name": "Mi DigiByte",
"string_first_eos_wallet_name": "Mi EOS",
- "string_first_holesky_wallet_name": "My Holesky",
+ "string_first_holesky_wallet_name": "Mi Holesky",
"string_first_telos_wallet_name": "Mis Telos",
"string_first_wax_wallet_name": "Mis Wax",
"string_first_feather_coin_wallet_name": "Mi Feather Coin",
@@ -521,10 +520,10 @@
"string_first_pulsechain_wallet_name": "Mi PulseChain",
"string_first_avalanche_wallet_name": "Mi Avalanche",
"string_first_optimism_wallet_name": "Mi Optimism",
- "string_first_bobevm_wallet_name": "My BOB",
+ "string_first_bobevm_wallet_name": "Mi BOB",
"string_first_algorand_wallet_name": "Mi Algorand",
"string_first_zksync_wallet_name": "Mi zkSync",
- "string_first_sepolia_wallet_name": "My Sepolia",
+ "string_first_sepolia_wallet_name": "Mi Sepolia",
"my_crypto_wallet_name": "Mi %s",
"string_help": "Ayuda",
"string_exit": "Salir",
@@ -539,8 +538,8 @@
"string_share": "Compartir",
"string_to_capitalize": "A",
"string_show_balance": "Mostrar saldo",
- "string_amount": "Cantidad",
- "string_tap_next_for_quote": "Tap \"Next\" for Quote",
+ "string_amount": "Monto",
+ "string_tap_next_for_quote": "Pulse \"Siguiente\" para cotizar",
"string_tap_to_edit": "Toca para editar",
"string_rate": "Calificar",
"string_got_it": "Entendido!",
@@ -548,18 +547,18 @@
"exchange_rate_loading_singular": "Cargando tipo de cambio...",
"string_master_private_key": "Clave privada maestra",
"string_add_edit_tokens": "Añadir /Editar Tokens",
- "string_get_raw_keys": "Obtener llaves crudas",
- "string_raw_keys": "Llaves Crudas",
+ "string_get_raw_keys": "Obtener llaves sin formato",
+ "string_raw_keys": "Llaves sin formato",
"title_create_wallet_select_crypto": "Elegir monederos a añadir",
"title_create_wallet_select_fiat": "Seleccionar Fiat",
"title_change_mining_fee": "Cambiar comisión de minado",
"title_change_password": "Cambiar contraseña",
"title_change_pin": "Cambiar NIP",
"title_create_wallet": "Crear Cartera",
- "title_create_wallet_from_seed": "Create Wallet From Seed",
- "title_create_wallets": "Crear monederos",
- "title_export_transactions": "Exportar Transacciones",
- "title_edge_login": "Edge Login",
+ "title_create_wallet_from_seed": "Crear billetera a partir de semillas",
+ "title_create_wallets": "Crear una cartera",
+ "title_export_transactions": "Exportar transacciones",
+ "title_edge_login": "Registro de Edge",
"title_exchange": "Intercambio",
"title_fio_sent_request_details": "Detalles de la solicitud enviados",
"title_fio_address_settings": "Recargar y transferir",
@@ -570,8 +569,8 @@
"title_fio_make_public_domain": "Hacer público el dominio",
"title_fio_make_private_domain": "Hacer Dominio Privado",
"title_fio_transfer_domain": "Transfer FIO Domain",
- "title_fio_transfer_address": "Manejo de Transferencia",
- "title_fio_address": "Manijas criptográficas FIO",
+ "title_fio_transfer_address": "Transferencia Handle",
+ "title_fio_address": "FIO Crypto Handles",
"title_fio_names": "Nombres FIO",
"title_fio_domains": "Dominios FIO",
"title_fio_address_confirmation": "Register FIO Crypto Handle",
@@ -579,22 +578,22 @@
"title_fio_connect_to_wallet": "Conectar a cartera",
"title_fio_disconnect_wallets": "Desconectar carteras",
"title_edit_token": "Editar token",
- "title_add_token": "Añadir Token",
+ "title_add_token": "Añadir token",
"title_password_recovery": "Recuperación de contraseña",
- "title_plugin_buy_s": "Buy %1$s",
- "title_select_region": "Select Region",
- "title_select_payment_method": "Select Payment Method",
- "title_plugin_sell_s": "Sell %1$s",
+ "title_plugin_buy_s": "Comprar %1$s",
+ "title_select_region": "Seleccionar región",
+ "title_select_payment_method": "Seleccione el método de pago",
+ "title_plugin_sell_s": "Enviado %1$s",
"title_otp": "Seguridad de 2 factores",
"title_register_fio_address": "Registrar dirección FIO",
"title_register_fio_domain": "Registrar dominio FIO",
"title_settings": "Configuración",
"title_promotion_settings": "Ajustes de la promoción",
"title_terms_of_service": "Términos del Servicio",
- "title_assets": "Assets",
+ "title_assets": "Activos",
"title_markets": "Mercados",
"title_wallets": "Carteras",
- "title_dev_tab": "Dev Tab",
+ "title_dev_tab": "Pestaña de desarrollo",
"title_buy": "Comprar",
"title_sell": "Vender",
"title_map": "Mapa",
@@ -602,9 +601,9 @@
"check_exchange_settings": "Por favor actívalas en los ajustes de casa de cambio.",
"amount_above_limit": "La cantidad está por encima del límite máximo de %1$s %2$s. Este límite máximo está sujeto a cambios basados en las condiciones del mercado",
"amount_below_limit": "La cantidad está por debajo del límite mínimo de %1$s %2$s. Este límite mínimo está sujeto a cambios basados en las condiciones del mercado",
- "trade_currency": "Trade",
- "trade_s": "Trade %1$s",
- "swap_s_to_from_crypto": "Swap %1$s to/from another crypto",
+ "trade_currency": "Vender",
+ "trade_s": "Vender %1$s",
+ "swap_s_to_from_crypto": "Intercambiar %1$s hacia/desde otra criptomoneda",
"transaction_details_category_title": "Categoría",
"transaction_details_payee": "Beneficiario",
"transaction_details_payer": "Pagador",
@@ -620,7 +619,7 @@
"transaction_details_show_advanced_block_explorer": "Mostrar en el explorador de bloques",
"transaction_history_permission": "¿Quieres compartir todo el historial de transacciones de %s con este socio?",
"transaction_details_error_invalid": "Transacción inválida",
- "sub_category_label": "Sub-category",
+ "sub_category_label": "Sub-categoría",
"transaction_details_recipient_addresses": "Dirección del destinatario",
"transaction_details_advance_details_header": "Parámetros avanzados",
"transaction_details_advance_details_fee_setting": "Ajuste de comisión",
@@ -634,18 +633,18 @@
"transaction_details_advance_details_satpervbyte": "Sats / VByte",
"transaction_details_advance_details_gasprice": "Precio gas Gwei",
"transaction_details_advance_details_gaslimit": "Límite de gas",
- "transaction_details_advance_details_minertip": "Miner Tip Gwei",
+ "transaction_details_advance_details_minertip": "Punta de minero Gwei",
"transaction_details_accelerate_transaction_header": "Acelerar transacción",
"transaction_details_accelerate_transaction_instructional": "Esto reenviará tu transacción con su comisión doblada para ayudar a priorizar la confirmación de la red. Por favor revise la nueva cantidad de comisión antes de confirmar.",
"confirm_finish": "Confirmar y terminar",
"transaction_details_accelerate_transaction_old_fee_title": "Comisión anterior",
"transaction_details_accelerate_transaction_new_fee_title": "Nueva comisión",
"transaction_details_accelerate_transaction_slider_disabled": "No se puede acelerar la transacción",
- "transaction_details_accelerate_transaction_fee_too_low": "Accelerated transaction fee is too low. Fee has been updated. Please try again.",
+ "transaction_details_accelerate_transaction_fee_too_low": "La tarifa de transacción acelerada es demasiado baja. La tarifa ha sido actualizada. Por favor inténtalo de nuevo.",
"transaction_details_accelerate_transaction_sent": "Tu transacción ha sido acelerada.",
- "transaction_details_accelerate_transaction_lower_amount_tx_title": "Lower Send Amount",
- "transaction_details_accelerate_transaction_lower_amount_tx_message": "In order to accelerate this transaction, the recipient's amount will be lower due to insufficient balance to cover the new fee.",
- "transaction_details_empty_note_placeholder": "Tap to Add Note (Optional)",
+ "transaction_details_accelerate_transaction_lower_amount_tx_title": "Menos cantidad de envío",
+ "transaction_details_accelerate_transaction_lower_amount_tx_message": "Para acelerar esta transacción, el monto del destinatario será menor debido a que el saldo es insuficiente para cubrir la nueva tarifa.",
+ "transaction_details_empty_note_placeholder": "Toca para añadir nota (opcional)",
"transaction_details_exchange_details": "Detalles de la casa de cambio",
"transaction_details_exchange_service": "Servicios de casa de cambio",
"transaction_details_exchange_order_id": "Número de pedido",
@@ -659,15 +658,15 @@
"transaction_details_exchange_support": "Soporte de la casa de cambio",
"transaction_details_exchange_support_request": "Petición de soporte %s",
"transaction_details_fee_warning": "Tarifas de red altas",
- "transaction_details_swap": "Swap Funds",
- "transaction_details_swap_network_fee": "Swap Network Fee",
- "transaction_details_swap_order_cancel": "Swap Order Canceled",
- "transaction_details_swap_order_post": "Swap Order Opened",
- "transaction_details_swap_order_fill": "Swap Order Filled",
- "transaction_details_claim": "Claim Staked Funds",
- "transaction_details_claim_order": "Claim Order",
- "transaction_details_stake": "Stake Funds",
- "transaction_details_stake_order": "Stake Order",
+ "transaction_details_swap": "Intercambio de fondos",
+ "transaction_details_swap_network_fee": "Tarifa de red de intercambio",
+ "transaction_details_swap_order_cancel": "Orden de intercambio cancelada",
+ "transaction_details_swap_order_post": "Orden de intercambio abierta",
+ "transaction_details_swap_order_fill": "Orden de intercambio cancelada",
+ "transaction_details_claim": "Reclamar fondos apostados",
+ "transaction_details_claim_order": "Reclamar orden",
+ "transaction_details_stake": "Fondos de participación",
+ "transaction_details_stake_order": "Orden de apuesta",
"transaction_details_stake_network_fee": "Tarifa de la red de inversión",
"transaction_details_transfer_network_fee": "Tarifa de red de transferencia",
"transaction_details_unstake": "Fondos sin invertir",
@@ -684,22 +683,22 @@
"transaction_details_unstake_order_subcat": "Crear orden de no inversión",
"transaction_details_unstake_subcat_1s": "Dejar de invertir %1$s",
"transaction_details_unstake_subcat_2s": "Dejar de invertir %1$s y %2$s",
- "transaction_details_unstake_order_notes_1s": "Create Unstake %1$s Order",
- "transaction_details_unstake_order_notes_2s": "Create Unstake %1$s and %2$s Order",
- "transaction_details_token_approval": "Token Approval",
- "transaction_details_token_approval_subcat": "Token Approval Fee",
- "transaction_details_transfer_funds": "Transfer Funds",
- "my_receive_addresses_title": "My Receive Addresses",
- "category_modal_title": "Choose a Category",
+ "transaction_details_unstake_order_notes_1s": "Crear orden sin participación de %1$s",
+ "transaction_details_unstake_order_notes_2s": "Crear orden sin participación de %1$s y %2$s",
+ "transaction_details_token_approval": "Aprobación de Token",
+ "transaction_details_token_approval_subcat": "Tarifa de aprobación de token",
+ "transaction_details_transfer_funds": "Transferir Fondos",
+ "my_receive_addresses_title": "Mis direcciones de recepción",
+ "category_modal_title": "Elige una categoría",
"transaction_details_notes_title": "Notas",
"back_button_tap_again_to_exit": "Por favor, pulsa BACK de nuevo para cerrar la sesión",
- "fragment_tx_detail_mining_fee_with_symbol": "+%1$s fee",
- "fragment_tx_detail_mining_fee_with_denom": "+%1$f %2$s fee",
+ "fragment_tx_detail_mining_fee_with_symbol": "+%1$s comisión",
+ "fragment_tx_detail_mining_fee_with_denom": "+%1$f %2$s comisión",
"confirm_password_text": "Confirmar contraseña",
"title_otp_enabled": "La autenticación de doble factor está habilitada",
"title_otp_disabled": "Protege tu cuenta con autenticación de doble factor",
"otp_description": "La autenticación de doble factor (2FA) evita el acceso no autorizado desde otros dispositivos, incluso si su nombre de usuario y contraseña están en peligro.",
- "otp_description_two": "If you download %1$s on a new device, you can allow or deny the login from your current device, or you can enter the backup code below.",
+ "otp_description_two": "Si descargas %1$s en un nuevo dispositivo, puedes permitir o denegar el inicio de sesión desde tu dispositivo actual, o puedes ingresar el código de respaldo a continuación.",
"otp_enabled_message": "Si pierdes tu teléfono o desinstalas la aplicación, tardarás 7 días en acceder a tu cuenta sin el código de copia de seguridad.",
"otp_disable": "Desactivar 2FA",
"otp_enable": "Habilitar 2FA",
@@ -708,24 +707,24 @@
"otp_copied_msg": "Código 2FA copiado correctamente",
"otp_modal_headline": "¿ Estás seguro de que quieres desactivar 2FA?",
"otp_modal_body": "La autenticación de doble factor está recomendada para mantener tu dispositivo seguro frente a accesos no autorizados desde otros dispositivos.",
- "otp_authentication_header": "2FA has been enabled",
- "otp_authentication_message": "2FA has been enabled. A unique authentication code has been generated. If you lose your phone or uninstall the app, it will take 7 days to disable 2FA and access your account from another device without the following authentication code.\n\n%s",
- "otp_reset_modal_dont_ask": "Don't ask again",
- "otp_reset_modal_header": "Secure Your Account",
- "otp_reset_modal_message": "Two factor authentication (2FA) prevents unauthorized access from other devices, even if your username and password is compromised. You can scan a QR code or type in an authentication code to seamlessly authorize other devices. Would you like to enable 2FA?",
+ "otp_authentication_header": "La autenticación de doble factor 2FA ha sido activada",
+ "otp_authentication_message": "2FA ha sido habilitado. Se ha generado un código de autenticación único. Si pierde su teléfono o desinstala la aplicación, le tomará 7 días desactivar 2FA y acceder a su cuenta desde otro dispositivo sin el siguiente código de autenticación. %s",
+ "otp_reset_modal_dont_ask": "No preguntar de nuevo",
+ "otp_reset_modal_header": "Asegure su cuenta",
+ "otp_reset_modal_message": "La autenticación de dos factores (2FA) evita el acceso no autorizado desde otros dispositivos, incluso si su nombre de usuario y contraseña están comprometidos. Puede escanear un código QR o escribir un código de autenticación para autorizar sin problemas otros dispositivos. ¿Le gustaría habilitar 2FA?",
"title_otp_keep_modal": "Autenticación de doble factor",
"otp_modal_reset_description": "Se ha producido un intento de acceder a tu cuenta desde otro dispositivo y se ha solicitado un reseteo de 2FA. \n\nSi tú no has hecho esta solicitud, pulsa \"Mantener 2FA\", después ve a \"Configuración\" y cambia tu contraseña y PIN.",
"otp_keep": "Mantener 2FA",
"word_to_in_convert_from_to_string": "hacia",
- "legacy_address_modal_title": "Legacy Address Detected",
+ "legacy_address_modal_title": "Dirección heredada detectada",
"legacy_address_modal_warning": "Has escaneado un formato de dirección antiguo (legacy address) que pudiera no corresponder a la moneda deseada ya que no es distinguible de direcciones de otras monedas.\n\n¡Enviar a esta dirección PUEDE resultar en la PÉRDIDA de fondos!\n\n¿Estás seguro de que quieres continuar?",
"legacy_address_modal_continue": "Continuar",
- "password_reminder_card_title": "Security Check: Tap to verify password.",
- "password_reminder_card_body": "Your password is required in case of device theft, loss, or app uninstallation.",
- "password_reminder_modal_title": "Verify your password",
- "password_reminder_modal_body": "To ensure the security of your account.\n\nPlease enter your password below. A successful verification will prevent this warning from appearing for a few logins.",
+ "password_reminder_card_title": "Comprobación de seguridad: toque para verificar la contraseña.",
+ "password_reminder_card_body": "Se requiere su contraseña en caso de robo, pérdida o desinstalación de la aplicación.",
+ "password_reminder_modal_title": "Verifica tu contraseña",
+ "password_reminder_modal_body": "Para garantizar la seguridad de su cuenta.\n\nPor favor ingrese su contraseña a continuación. Una verificación exitosa evitará que esta advertencia aparezca durante algunos inicios de sesión.",
"password_reminder_check_password": "Comprueba la contraseña",
- "password_reminder_forgot_password": "I Forgot. Change Password",
+ "password_reminder_forgot_password": "Me olvidé. Cambiar la contraseña",
"password_reminder_great_job": "Gran trabajo recordando tu contraseña.",
"password_reminder_invalid": "Contraseña inválida",
"password_recovery_reminder_modal_title": "Configuración de la recuperación de contraseña",
@@ -736,19 +735,19 @@
"password": "Contraseña",
"buy_crypto_modal_title": "Cartera vacía",
"buy_crypto_modal_message": "Tu cartera %s está vacía. ¿Quieres comprar %s o cambiar otra cripto en %s?",
- "buy_parent_crypto_modal_message_2s": "%1$s%2$s is required to send this transaction. Would you like to buy %2$s or exchange another crypto into %2$s?",
- "buy_parent_crypto_modal_message_3s": "%1$s%2$s (on %3$s) is required to send this transaction. Would you like to buy %2$s or exchange another crypto into %2$s?",
+ "buy_parent_crypto_modal_message_2s": "Se requiere %1$s%2$s para enviar esta transacción. ¿Te gustaría comprar %2$s o cambiar otra criptomoneda por %2$s?",
+ "buy_parent_crypto_modal_message_3s": "Se requiere %1$s%2$s (en %3$s) para enviar esta transacción. ¿Te gustaría comprar %2$s o cambiar otra criptomoneda por %2$s?",
"buy_crypto_decline": "No en este momento",
"buy_crypto_modal_buy_action": "Comprar %s",
"buy_crypto_modal_exchange": "Cambiar",
"exchange_crypto_modal_message": "Tu cartera %s está vacía. ¿Quieres cambiar otra cripto a %s?",
"private_key_modal_sweep_from_private_address": "Barrer fondos de clave privada",
- "private_key_modal_sweep_from_private_key_message": "This process needs an on-chain transaction from the original wallet to %1$s. Mining fees are applied and depend on the network status.",
- "private_key_modal_sweep_insufficient_funds": "The private key has insufficient funds to cover the onchain fees required by the sweep.",
+ "private_key_modal_sweep_from_private_key_message": "Este proceso necesita una transacción en cadena desde la billetera original a %1$s. Se aplican tarifas de minería y dependen del estado de la red.",
+ "private_key_modal_sweep_insufficient_funds": "La clave privada no tiene fondos suficientes para cubrir las tasas de onchain requeridas por el sorteo.",
"private_key_modal_import": "Importar",
"private_key_modal_cancel": "Cancelar",
- "sweep_private_key_calculate_fee_title": "Confirm Sweep",
- "sweep_private_key_instructions_fragment": "Sweeping assets incurs a network fee for each asset transferred. If you don't have enough funds, you can return and deselect tokens or tap the row for more options.",
+ "sweep_private_key_calculate_fee_title": "Confirmar barrido",
+ "sweep_private_key_instructions_fragment": "El barrido de activos genera una tarifa de red por cada activo transferido. Si no tiene fondos suficientes, puede devolver y anular la selección de tokens o tocar la fila para ver más opciones.",
"sweep_private_key_select_crypto_title": "Choose Assets to Sweep",
"sweep_private_key_no_funds_found": "No funds found",
"sweep_private_key_syncing_balances": "Searching for balances...",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/fr.json b/src/locales/strings/fr.json
index 3a3e174c3ed..01e5cfd1034 100644
--- a/src/locales/strings/fr.json
+++ b/src/locales/strings/fr.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Alert! ",
"alert_dropdown_warning": "Warning! ",
"azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/it.json b/src/locales/strings/it.json
index 86eebaab519..1b6a8054ce6 100644
--- a/src/locales/strings/it.json
+++ b/src/locales/strings/it.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Grandioso! Se mai dovessi avere domande, contatta il nostro team di supporto qui %1$s.",
"warning_scam_message_yes_1s": "Per favore, procedi con cautela! Ricevere assistenza durante la creazione dell'account potrebbe portare a delle truffe. Gli utenti non dovrebbero mai condividere la password o le chiavi private. I social media e le piattaforme di chat sono stati coinvolti in tentativi di truffa, spesso riusciti. Non inviare criptovalute agli sconosciuti. Se hai anche solo il minimo sospetto di esserne vittima, contatta il nostro team di supporto qui %1$s.",
"warning_token_code_override_2s": "L'indirizzo del contratto inserito differisce dall'indirizzo del contratto del token integrato %1$s. Si prega di procedere con cautela e verificare che il contratto sia legittimo in quanto l'uso di questo token può comportare la perdita di fondi. Se hai domande su questa funzione o sul contratto contatta %2$s.",
- "warning_token_contract_override_3s": "Il token %1$s inserito esiste come token %2$s integrato con lo stesso indirizzo del contratto. Si prega di procedere con cautela e verificare che il contratto sia legittimo in quanto l'uso di questo token può comportare la perdita di fondi. Se hai domande su questa funzionalità, contatta %3$s.",
"warning_token_exists_1s": "Il token inserito esiste già come token integrato %1$s",
"warning_uk_risk": "Non investire a meno che non sia disposto a perdere tutti i soldi che investi. Questo è un investimento ad alto rischio e non dovresti aspettarti di essere protetto se qualcosa va storto. Prenditi 2 minuti per saperne di più.",
+ "warning_battery_saver": "Modalità risparmio batteria rilevata. I saldi e le transazioni potrebbero essere imprecisi",
"alert_dropdown_alert": "Avviso! ",
"alert_dropdown_warning": "Attenzione! ",
"azteco_success": "Hai riscattato una carta bitcoin Azteco. I fondi dovrebbero arrivare a breve.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "Ledger XRP",
"activate_wallet_token_transaction_notes_xrp": "Attiva il token XRP abilitando Trust Line all'emittente",
"activate_wallet_token_scene_title": "Attiva Token",
- "activate_wallet_tokens_scene_title": "Attiva Token",
"activate_wallet_token_scene_tile_title": "Token da attivare",
"activate_wallet_tokens_scene_tile_title": "Token da attivare",
"activate_wallet_token_scene_body": "Per inviare e ricevere il token selezionato dovrai prima attivarlo con una transazione blockchain. Questa transazione costerà la seguente commissione.\n\nSi prega di confermare utilizzando il cursore qui sotto.",
@@ -371,7 +370,7 @@
"swap_preferred_instructions": "Quando più cambi valuta possono eseguire un ordine, preferisci:",
"swap_preferred_promo_instructions": "Quando più cambi valuta possono eseguire un ordine, la promozione corrente preferisce sempre:",
"swap_token_no_enabled_exchanges_2s": "Nessun cambio valuta abilitato supporta %1$s (su %2$s) al momento",
- "swap_minimum_receive_amount": "Min Receive Amount",
+ "swap_minimum_receive_amount": "Importo minimo in ricezione",
"swap_minimum_amount_1s": "Min %1$s",
"settings_button_clear_logs": "Cancella i log",
"settings_button_send_logs": "Invia i logs a Edge",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Recupero degli asset supportati",
"fiat_plugin_sell_cancelled": "Ordine di vendita annullato",
"fiat_plugin_finalizing_quote": "Finalizzazione della quota di scambio. Potrebbe richiedere fino a un minuto",
+ "fiat_plugin_buy_complete_title": "Ordine di vendita completato",
+ "fiat_plugin_buy_complete_message_s": "Il tuo ordine di acquisto di %1$s %2$s con %3$s %4$s è stato completato.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Si prega di attendere fino a %1$s ore perché i fondi appaiano nel tuo portafoglio.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Si prega di attendere fino a %1$s ore per i fondi di apparire nel tuo portafoglio.",
+ "fiat_plugin_buy_failed_try_again": "Ordine di acquisto non riuscito. Riprova",
"fiat_plugin_sell_complete_title": "Ordine di vendita completato",
"fiat_plugin_sell_complete_message_s": "Il tuo ordine di vendita di %1$s %2$s per %3$s %4$s è stato completato.",
"fiat_plugin_sell_complete_message_2_hour_s": "Si prega di attendere fino a %1$s ore perché i fondi appaiano nel tuo account.",
diff --git a/src/locales/strings/ja.json b/src/locales/strings/ja.json
index b2b63f6d844..9a8b4356449 100644
--- a/src/locales/strings/ja.json
+++ b/src/locales/strings/ja.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "警告! ",
"alert_dropdown_warning": "注意! ",
"azteco_success": "Aztecoビットコインカードを使用しました。資金はまもなく届きます。",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "トラストラインを発行者に有効にしてXRPトークンを有効にする",
"activate_wallet_token_scene_title": "トークンを有効にする",
- "activate_wallet_tokens_scene_title": "トークンを有効にする",
"activate_wallet_token_scene_tile_title": "有効にするトークン",
"activate_wallet_tokens_scene_tile_title": "有効にするトークン",
"activate_wallet_token_scene_body": "選択したトークンを送受信するには、まずブロックチェーントランザクションでトークンを有効にする必要があります。 この取引には以下の手数料がかかります。\n\n下のスライダーを使用して確認してください。",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "サポートされている資産を取得中",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/kaa.json b/src/locales/strings/kaa.json
index cdffae793c4..f34221e3b51 100644
--- a/src/locales/strings/kaa.json
+++ b/src/locales/strings/kaa.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Dıqqat! ",
"alert_dropdown_warning": "Dıqqat! ",
"azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/ko.json b/src/locales/strings/ko.json
index a333db0adf2..cd74b0643b5 100644
--- a/src/locales/strings/ko.json
+++ b/src/locales/strings/ko.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Alert! ",
"alert_dropdown_warning": "Warning! ",
"azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/pt.json b/src/locales/strings/pt.json
index 545f2b3af19..e71ea84d113 100644
--- a/src/locales/strings/pt.json
+++ b/src/locales/strings/pt.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "O endereço do contrato informado difere do endereço do contrato do token %1$sincorporado. Proceda com cuidado e verifique se o contrato é legítimo, já que o uso desse token pode resultar em perda de fundos. Se você tiver dúvidas sobre este recurso ou contrato, entre em contato com %2$s.",
- "warning_token_contract_override_3s": "O token %1$s informado existe como um token %2$s interno com o mesmo endereço de contrato. Prossiga com cuidado e verifique se o contrato é legítimo, já que o uso desse token pode resultar em perda de fundos. Se você tiver dúvidas sobre este recurso, por favor contate %3$s.",
"warning_token_exists_1s": "O token informado já existe como um token interno %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Alerta! ",
"alert_dropdown_warning": "Atenção! ",
"azteco_success": "Você resgatou um cartão bitcoin Azteco. Os fundos devem chegar em breve.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Ative o token XRP habilitando a Trust Line para o emissor",
"activate_wallet_token_scene_title": "Ativar token",
- "activate_wallet_tokens_scene_title": "Ativar Tokens",
"activate_wallet_token_scene_tile_title": "Token para ativar",
"activate_wallet_tokens_scene_tile_title": "Tokens para ativar",
"activate_wallet_token_scene_body": "Para enviar e receber o token selecionado, primeiro precisa ativá-lo com uma transação blockchain. Esta transação custará a seguinte taxa.\n\nPor favor, confirme usando o controle deslizante abaixo.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Buscando ativos suportados",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/ru.json b/src/locales/strings/ru.json
index 526ac5aa536..1b28a416058 100644
--- a/src/locales/strings/ru.json
+++ b/src/locales/strings/ru.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Внимание! ",
"alert_dropdown_warning": "Внимание! ",
"azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/vi.json b/src/locales/strings/vi.json
index 95b288e7330..0122bd577e1 100644
--- a/src/locales/strings/vi.json
+++ b/src/locales/strings/vi.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Alert! ",
"alert_dropdown_warning": "Warning! ",
"azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/locales/strings/zh.json b/src/locales/strings/zh.json
index e8c7452684d..b117300e1f9 100644
--- a/src/locales/strings/zh.json
+++ b/src/locales/strings/zh.json
@@ -79,9 +79,9 @@
"warning_scam_message_no_1s": "Great, if you ever have any questions, please reach out to our support team at %1$s.",
"warning_scam_message_yes_1s": "Please proceed with caution! Assistance with account creation has the potential for fraud. Users should never share passwords or private keys. Social media and chat platforms have been involved in attacks. Do not send cryptocurrency to strangers. If you believe you’re being taken advantage of, please contact our support team at %1$s.",
"warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.",
- "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.",
"warning_token_exists_1s": "The entered token already exists as a built-in token %1$s",
"warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.",
+ "warning_battery_saver": "Battery Saver mode detected. Balances and transactions may be inaccurate",
"alert_dropdown_alert": "Alert! ",
"alert_dropdown_warning": "Warning! ",
"azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.",
@@ -261,7 +261,6 @@
"activate_wallet_token_transaction_name_xrp": "XRP Ledger",
"activate_wallet_token_transaction_notes_xrp": "Activate XRP token by enabling Trust Line to issuer",
"activate_wallet_token_scene_title": "Activate Token",
- "activate_wallet_tokens_scene_title": "Activate Tokens",
"activate_wallet_token_scene_tile_title": "Token to Activate",
"activate_wallet_tokens_scene_tile_title": "Tokens to Activate",
"activate_wallet_token_scene_body": "To send and receive the selected token you will first need to activate it with a blockchain transaction. This transaction will cost the following fee.\n\nPlease confirm using the slider below.",
@@ -1277,6 +1276,11 @@
"fiat_plugin_fetching_assets": "Fetching supported assets",
"fiat_plugin_sell_cancelled": "Sell order cancelled",
"fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute",
+ "fiat_plugin_buy_complete_title": "Buy Order Complete",
+ "fiat_plugin_buy_complete_message_s": "Your buy order of %1$s %2$s with %3$s %4$s has been completed.",
+ "fiat_plugin_buy_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your wallet.",
+ "fiat_plugin_buy_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your wallet.",
+ "fiat_plugin_buy_failed_try_again": "Buy order failed. Please try again",
"fiat_plugin_sell_complete_title": "Sell Order Complete",
"fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.",
"fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.",
diff --git a/src/plugins/gui/RewardsCardPlugin.tsx b/src/plugins/gui/RewardsCardPlugin.tsx
index 0df4b84a0f9..c7a949e6f27 100644
--- a/src/plugins/gui/RewardsCardPlugin.tsx
+++ b/src/plugins/gui/RewardsCardPlugin.tsx
@@ -6,6 +6,7 @@ import { Space } from '../../components/layout/Space'
import { showError } from '../../components/services/AirshipInstance'
import { lstrings } from '../../locales/strings'
import { EdgeAsset } from '../../types/types'
+import { getCurrencyCode } from '../../util/CurrencyInfoHelpers'
import { logActivity } from '../../util/logger'
import { removeIsoPrefix, runWithTimeout, snooze } from '../../util/utils'
import { openBrowserUri } from '../../util/WebUtils'
@@ -137,10 +138,11 @@ export const makeRewardsCardPlugin: FiatPluginFactory = async params => {
}
const showNewCardEnterAmount = async (walletListResult: FiatPluginWalletPickerResult) => {
- const { walletId, currencyCode, tokenId } = walletListResult
+ const { walletId, tokenId } = walletListResult
const wallet = account.currencyWallets[walletId]
if (wallet == null) return await showUi.showError(new Error(`Missing wallet with ID ${walletId}`))
+ const currencyCode = getCurrencyCode(wallet, tokenId)
let providerQuote: FiatProviderQuote | undefined
let counter = 0
diff --git a/src/plugins/gui/fiatPlugin.tsx b/src/plugins/gui/fiatPlugin.tsx
index 7847584b378..cc068a13124 100644
--- a/src/plugins/gui/fiatPlugin.tsx
+++ b/src/plugins/gui/fiatPlugin.tsx
@@ -17,25 +17,25 @@ import { SendScene2Params } from '../../components/scenes/SendScene2'
import { Airship, showError, showToast, showToastSpinner } from '../../components/services/AirshipInstance'
import { requestPermissionOnSettings } from '../../components/services/PermissionsManager'
import { FiatPluginEnterAmountParams } from '../../plugins/gui/scenes/FiatPluginEnterAmountScene'
+import { FiatProviderLink } from '../../types/DeepLinkTypes'
import { HomeAddress, SepaInfo } from '../../types/FormTypes'
import { GuiPlugin } from '../../types/GuiPluginTypes'
import { NavigationBase } from '../../types/routerTypes'
import { getHistoricalRate } from '../../util/exchangeRates'
import { getNavigationAbsolutePath } from '../../util/routerUtils'
-import { OnLogEvent, SellConversionValues, TrackingEventName } from '../../util/tracking'
+import { BuyConversionValues, OnLogEvent, SellConversionValues, TrackingEventName } from '../../util/tracking'
import { datelog } from '../../util/utils'
import {
+ FiatDirection,
FiatPaymentType,
- FiatPluginAddressFormParams,
FiatPluginListModalParams,
FiatPluginPermissions,
FiatPluginRegionCode,
- FiatPluginSepaFormParams,
- FiatPluginSepaTransferParams,
FiatPluginStartParams,
FiatPluginUi,
FiatPluginUtils,
FiatPluginWalletPickerResult,
+ LinkHandler,
SaveTxActionParams,
SaveTxMetadataParams
} from './fiatPluginTypes'
@@ -43,6 +43,31 @@ import {
export const SendErrorNoTransaction = 'SendErrorNoTransaction'
export const SendErrorBackPressed = 'SendErrorBackPressed'
+const deeplinkListeners: { listener: { direction: FiatDirection; providerId: string; deeplinkHandler: LinkHandler } | null } = { listener: null }
+
+export const fiatProviderDeeplinkHandler = (link: FiatProviderLink) => {
+ if (deeplinkListeners.listener == null) {
+ showError(`No buy/sell interface currently open to handle fiatProvider deeplink`)
+ return
+ }
+ const { direction, providerId, deeplinkHandler } = deeplinkListeners.listener
+ if (link.providerId !== providerId) {
+ showError(`Deeplink providerId ${link.providerId} does not match expected providerId ${providerId}`)
+ return
+ }
+
+ if (link.direction !== direction) {
+ showError(`Deeplink direction ${link.direction} does not match expected direction ${direction}`)
+ return
+ }
+
+ // Close the SafariView if it's open. Otherwise we can't see the Edge app interface
+ if (Platform.OS === 'ios') {
+ SafariView.dismiss()
+ }
+ deeplinkHandler(link)
+}
+
export const executePlugin = async (params: {
account: EdgeAccount
disklet: Disklet
@@ -86,7 +111,7 @@ export const executePlugin = async (params: {
function maybeNavigateToCorrectTabScene() {
const navPath = getNavigationAbsolutePath(navigation)
if (!navPath.includes(`/edgeTabs/${tabSceneKey}`)) {
- navigation.navigate(tabSceneKey, {})
+ navigation.navigate(tabSceneKey)
navigation.navigate(listSceneKey, {})
}
}
@@ -103,8 +128,12 @@ export const executePlugin = async (params: {
},
openExternalWebView: async (params): Promise => {
- const { redirectExternal, url } = params
- datelog(`**** openExternalWebView ${url}`)
+ const { deeplinkHandler, providerId, redirectExternal, url } = params
+ datelog(`**** openExternalWebView ${url} deeplinkHandler:${deeplinkHandler}`)
+ if (deeplinkHandler != null) {
+ if (providerId == null) throw new Error('providerId is required for deeplinkHandler')
+ deeplinkListeners.listener = { direction, providerId, deeplinkHandler }
+ }
if (redirectExternal === true) {
await Linking.openURL(url)
return
@@ -141,7 +170,7 @@ export const executePlugin = async (params: {
maybeNavigateToCorrectTabScene()
navigation.navigate('guiPluginEnterAmount', params)
},
- addressForm: async (params: FiatPluginAddressFormParams) => {
+ addressForm: async params => {
const { countryCode, headerTitle, headerIconUri, onSubmit } = params
return await new Promise((resolve, reject) => {
maybeNavigateToCorrectTabScene()
@@ -176,7 +205,7 @@ export const executePlugin = async (params: {
maybeNavigateToCorrectTabScene()
navigation.navigate('rewardsCardWelcome', params)
},
- sepaForm: async (params: FiatPluginSepaFormParams) => {
+ sepaForm: async params => {
const { headerTitle, headerIconUri, doneLabel, onDone } = params
return await new Promise((resolve, reject) => {
maybeNavigateToCorrectTabScene()
@@ -194,7 +223,7 @@ export const executePlugin = async (params: {
})
})
},
- sepaTransferInfo: async (params: FiatPluginSepaTransferParams) => {
+ sepaTransferInfo: async params => {
return await new Promise((resolve, reject) => {
const { headerTitle, headerIconUri, promptMessage, transferInfo, onDone } = params
maybeNavigateToCorrectTabScene()
@@ -258,7 +287,7 @@ export const executePlugin = async (params: {
showToast: async (message: string, autoHideMs?: number) => {
showToast(message, autoHideMs)
},
- trackConversion: async (event: TrackingEventName, opts: { conversionValues: SellConversionValues }) => {
+ trackConversion: async (event: TrackingEventName, opts: { conversionValues: BuyConversionValues | SellConversionValues }) => {
onLogEvent(event, opts)
},
exitScene: async () => {
@@ -310,4 +339,5 @@ export const executePlugin = async (params: {
providerId
}
await plugin.startPlugin(startPluginParams)
+ deeplinkListeners.listener = null
}
diff --git a/src/plugins/gui/fiatPluginTypes.ts b/src/plugins/gui/fiatPluginTypes.ts
index 66e9e8898b0..d6ab44a1832 100644
--- a/src/plugins/gui/fiatPluginTypes.ts
+++ b/src/plugins/gui/fiatPluginTypes.ts
@@ -8,14 +8,18 @@ import { LaunchPaymentProtoParams } from '../../actions/PaymentProtoActions'
import { ButtonInfo, ButtonModalProps } from '../../components/modals/ButtonsModal'
import { SendScene2Params } from '../../components/scenes/SendScene2'
import { Permission } from '../../reducers/PermissionsReducer'
+import { FiatProviderLink } from '../../types/DeepLinkTypes'
import { HomeAddress, SepaInfo } from '../../types/FormTypes'
import { GuiPlugin } from '../../types/GuiPluginTypes'
import { AppParamList } from '../../types/routerTypes'
import { EdgeAsset } from '../../types/types'
-import { SellConversionValues, TrackingEventName } from '../../util/tracking'
+import { BuyConversionValues, SellConversionValues, TrackingEventName } from '../../util/tracking'
+import { FiatPluginAddressFormParams } from './scenes/AddressFormScene'
import { FiatPluginOpenWebViewParams } from './scenes/FiatPluginWebView'
+import { FiatPluginSepaTransferParams } from './scenes/InfoDisplayScene'
import { RewardsCardDashboardParams } from './scenes/RewardsCardDashboardScene'
import { RewardsCardWelcomeParams } from './scenes/RewardsCardWelcomeScene'
+import { FiatPluginSepaFormParams } from './scenes/SepaFormScene'
export const asFiatDirection = asValue('buy', 'sell')
export type FiatDirection = ReturnType
@@ -45,21 +49,7 @@ export const asFiatPaymentType = asValue(
)
export type FiatPaymentType = ReturnType
-export interface FiatPluginAddressFormParams {
- countryCode: string
- headerTitle: string
- headerIconUri?: string
- onSubmit: (homeAddress: HomeAddress) => Promise
- onClose: () => void
-}
-
-export interface FiatPluginSepaFormParams {
- headerTitle: string
- doneLabel: string
- headerIconUri?: string
- onDone: (sepaInfo: SepaInfo) => Promise
- onClose: () => void
-}
+export type LinkHandler = (url: FiatProviderLink) => void
export interface FiatPluginSepaTransferInfo {
input: {
@@ -80,14 +70,6 @@ export interface FiatPluginSepaTransferInfo {
}
}
-export interface FiatPluginSepaTransferParams {
- headerTitle: string
- promptMessage: string
- transferInfo: FiatPluginSepaTransferInfo
- headerIconUri?: string
- onDone: () => Promise
-}
-
export interface FiatPluginListModalParams {
title: string
items: Array<{ icon: string | number | React.ReactNode; name: string; text?: string }> // Icon strings are image uri, numbers are local files
@@ -109,13 +91,20 @@ export interface FiatPluginOpenExternalWebViewParams {
* redirect to the external webview.
*/
redirectExternal?: boolean
+
+ /**
+ * @param url
+ * @returns void
+ *
+ * providerId is required if deeplinkHandler is provided
+ */
+ deeplinkHandler?: LinkHandler
+ providerId?: string
}
export interface FiatPluginWalletPickerResult {
walletId: string
tokenId: EdgeTokenId
- /** @deprecated Use tokenId instead */
- currencyCode: string
}
export interface SaveTxMetadataParams {
@@ -160,7 +149,7 @@ export interface FiatPluginUi {
trackConversion: (
event: TrackingEventName,
opts: {
- conversionValues: SellConversionValues
+ conversionValues: SellConversionValues | BuyConversionValues
}
) => Promise
exitScene: () => {}
diff --git a/src/plugins/gui/providers/moonpayProvider.ts b/src/plugins/gui/providers/moonpayProvider.ts
index e709e6d2b0d..aeeae92faa3 100644
--- a/src/plugins/gui/providers/moonpayProvider.ts
+++ b/src/plugins/gui/providers/moonpayProvider.ts
@@ -115,6 +115,7 @@ interface MoonpayWidgetQueryParams {
lockAmount: true
showAllCurrencies: false
paymentMethod: MoonpayPaymentMethod
+ redirectURL: string
}
type MoonpayBuyWidgetQueryParams = MoonpayWidgetQueryParams & {
@@ -140,7 +141,6 @@ type MoonpaySellWidgetQueryParams = MoonpayWidgetQueryParams & {
/** crypto currency code */
baseCurrencyCode: string
refundWalletAddress: string
- redirectURL: string
/** fiat amount to receive */
quoteCurrencyAmount?: number
@@ -213,6 +213,14 @@ export const moonpayProvider: FiatProviderFactory = {
let moonpayCurrencies: MoonpayCurrency[] = []
try {
moonpayCurrencies = asMoonpayCurrencies(result)
+
+ // HACK: Moonpay API returns the burn address for EVM chain native currency
+ moonpayCurrencies = moonpayCurrencies.map(currency => {
+ if (currency.metadata?.contractAddress === '0x0000000000000000000000000000000000000000') {
+ currency.metadata.contractAddress = null
+ }
+ return currency
+ })
} catch (error: any) {
console.log(error.message)
console.log(JSON.stringify(error, null, 2))
@@ -399,7 +407,8 @@ export const moonpayProvider: FiatProviderFactory = {
baseCurrencyCode: fiatCurrencyObj.code,
lockAmount: true,
showAllCurrencies: false,
- enableRecurringBuys: false
+ enableRecurringBuys: false,
+ redirectURL: `https://deep.edge.app/fiatprovider/buy/moonpay`
}
if (params.amountType === 'crypto') {
queryObj.quoteCurrencyAmount = moonpayQuote.quoteCurrencyAmount
@@ -408,7 +417,49 @@ export const moonpayProvider: FiatProviderFactory = {
}
urlObj.set('query', queryObj)
console.log('Approving moonpay buy quote url=' + urlObj.href)
- await showUi.openExternalWebView({ url: urlObj.href })
+ await showUi.openExternalWebView({
+ url: urlObj.href,
+ providerId,
+ deeplinkHandler: async link => {
+ const { query, uri } = link
+ console.log('Moonpay WebView launch buy success: ' + uri)
+ const { transactionId, transactionStatus } = query
+ if (transactionId == null || transactionStatus == null) {
+ return
+ }
+ if (transactionStatus !== 'pending') {
+ return
+ }
+ await showUi.trackConversion('Buy_Success', {
+ conversionValues: {
+ conversionType: 'buy',
+ sourceFiatCurrencyCode: fiatCurrencyCode,
+ sourceFiatAmount: fiatAmount,
+ destAmount: new CryptoAmount({
+ currencyConfig: coreWallet.currencyConfig,
+ currencyCode: displayCurrencyCode,
+ exchangeAmount: cryptoAmount
+ }),
+ fiatProviderId: providerId,
+ orderId: transactionId
+ }
+ })
+
+ const message =
+ sprintf(lstrings.fiat_plugin_buy_complete_message_s, cryptoAmount, displayCurrencyCode, fiatAmount, displayFiatCurrencyCode, '1') +
+ '\n\n' +
+ sprintf(lstrings.fiat_plugin_buy_complete_message_2_hour_s, '1') +
+ '\n\n' +
+ lstrings.fiat_plugin_sell_complete_message_3
+ await showUi.buttonModal({
+ buttons: {
+ ok: { label: lstrings.string_ok, type: 'primary' }
+ },
+ title: lstrings.fiat_plugin_buy_complete_title,
+ message
+ })
+ }
+ })
} else {
const urlObj = new URL('https://sell.moonpay.com?', true)
const queryObj: MoonpaySellWidgetQueryParams = {
diff --git a/src/plugins/gui/providers/paybisProvider.ts b/src/plugins/gui/providers/paybisProvider.ts
index 0f922584f37..9ddd6a086ed 100644
--- a/src/plugins/gui/providers/paybisProvider.ts
+++ b/src/plugins/gui/providers/paybisProvider.ts
@@ -1,6 +1,7 @@
import { eq, lte, mul, round } from 'biggystring'
import { asArray, asBoolean, asDate, asMaybe, asObject, asOptional, asString, asValue } from 'cleaners'
import { EdgeAssetAction, EdgeFetchOptions, EdgeSpendInfo, EdgeTxActionFiat, JsonObject } from 'edge-core-js'
+import { sprintf } from 'sprintf-js'
import URL from 'url-parse'
import { SendScene2Params } from '../../../components/scenes/SendScene2'
@@ -195,7 +196,7 @@ const asQuote = asObject({
const asPaymentDetails = asObject({
assetId: asString,
- invoice: asString,
+ // invoice: asString,
blockchain: asString,
network: asString,
depositAddress: asString,
@@ -249,7 +250,7 @@ const PAYBIS_TO_EDGE_CURRENCY_MAP: Record = {
ETH: { pluginId: 'ethereum', tokenId: null },
LTC: { pluginId: 'litecoin', tokenId: null },
DOT: { pluginId: 'polkadot', tokenId: null },
- 'MATIC-POLYGON': { pluginId: 'polygon', currencyCode: 'MATIC', tokenId: null },
+ POL: { pluginId: 'polygon', currencyCode: 'POL', tokenId: null },
SOL: { pluginId: 'solana', tokenId: null },
TRX: { pluginId: 'tron', tokenId: null },
XLM: { pluginId: 'stellar', tokenId: null },
@@ -584,14 +585,55 @@ export const paybisProvider: FiatProviderFactory = {
const promoCodeParam = promoCode != null ? `&promoCode=${promoCode}` : ''
if (direction === 'buy') {
+ const successReturnURL = encodeURIComponent('https://return.edge.app/fiatprovider/buy/paybis?transactionStatus=success')
+ const failureReturnURL = encodeURIComponent('https://return.edge.app/fiatprovider/buy/paybis?transactionStatus=fail')
await showUi.openExternalWebView({
- url: `${widgetUrl}?requestId=${requestId}${ott}${promoCodeParam}`
+ url: `${widgetUrl}?requestId=${requestId}${ott}${promoCodeParam}&successReturnURL=${successReturnURL}&failureReturnURL=${failureReturnURL}`,
+ providerId,
+ deeplinkHandler: async link => {
+ const { query, uri } = link
+ console.log('Paybis WebView launch buy success: ' + uri)
+ const { transactionStatus } = query
+ if (transactionStatus === 'success') {
+ await showUi.trackConversion('Buy_Success', {
+ conversionValues: {
+ conversionType: 'buy',
+ sourceFiatCurrencyCode: fiatCurrencyCode,
+ sourceFiatAmount: fiatAmount,
+ destAmount: new CryptoAmount({
+ currencyConfig: coreWallet.currencyConfig,
+ currencyCode: displayCurrencyCode,
+ exchangeAmount: cryptoAmount
+ }),
+ fiatProviderId: providerId,
+ orderId: requestId
+ }
+ })
+ const message =
+ sprintf(lstrings.fiat_plugin_buy_complete_message_s, cryptoAmount, displayCurrencyCode, fiatAmount, fiat, '1') +
+ '\n\n' +
+ sprintf(lstrings.fiat_plugin_buy_complete_message_2_hour_s, '1') +
+ '\n\n' +
+ lstrings.fiat_plugin_sell_complete_message_3
+ await showUi.buttonModal({
+ buttons: {
+ ok: { label: lstrings.string_ok, type: 'primary' }
+ },
+ title: lstrings.fiat_plugin_buy_complete_title,
+ message
+ })
+ } else if (transactionStatus === 'failure') {
+ await showUi.showToast(lstrings.fiat_plugin_buy_failed_try_again, NOT_SUCCESS_TOAST_HIDE_MS)
+ } else {
+ await showUi.showError(new Error(`Paybis: Invalid transactionStatus "${transactionStatus}".`))
+ }
+ }
})
return
}
- const successReturnURL = encodeURI(RETURN_URL_SUCCESS)
- const failureReturnURL = encodeURI(RETURN_URL_FAIL)
+ const successReturnURL = encodeURIComponent(RETURN_URL_SUCCESS)
+ const failureReturnURL = encodeURIComponent(RETURN_URL_FAIL)
const webviewUrl = `${widgetUrl}?requestId=${requestId}&successReturnURL=${successReturnURL}&failureReturnURL=${failureReturnURL}${ott}${promoCodeParam}`
console.log(`webviewUrl: ${webviewUrl}`)
let inPayment = false
@@ -609,7 +651,7 @@ export const paybisProvider: FiatProviderFactory = {
inPayment = true
try {
const payDetails = await paybisFetch({ method: 'GET', url, path: `v2/request/${requestId}/payment-details`, apiKey, promoCode })
- const { assetId, amount, currencyCode: pbCurrencyCode, invoice, network, depositAddress, destinationTag } = asPaymentDetails(payDetails)
+ const { assetId, amount, currencyCode: pbCurrencyCode, network, depositAddress, destinationTag } = asPaymentDetails(payDetails)
const { pluginId, tokenId } = PAYBIS_TO_EDGE_CURRENCY_MAP[assetId]
console.log(`Creating Paybis payment`)
@@ -626,7 +668,7 @@ export const paybisProvider: FiatProviderFactory = {
}
const savedAction: EdgeTxActionFiat = {
actionType: 'fiat',
- orderId: invoice,
+ orderId: requestId,
orderUri: `${widgetUrl}?requestId=${requestId}`,
isEstimate: true,
fiatPlugin: {
@@ -694,7 +736,7 @@ export const paybisProvider: FiatProviderFactory = {
exchangeAmount: amount
}),
fiatProviderId: providerId,
- orderId: invoice
+ orderId: requestId
}
})
diff --git a/src/plugins/gui/providers/simplexProvider.ts b/src/plugins/gui/providers/simplexProvider.ts
index 83b499b162a..bfcd3c1b48d 100644
--- a/src/plugins/gui/providers/simplexProvider.ts
+++ b/src/plugins/gui/providers/simplexProvider.ts
@@ -108,7 +108,7 @@ const SIMPLEX_ID_MAP: { [pluginId: string]: { [currencyCode: string]: string } }
one: { ONE: 'ONE' },
optimism: { ETH: 'ETH-OPTIMISM', OP: 'OP' },
polkadot: { DOT: 'DOT' },
- polygon: { GMEE: 'GMEE', MATIC: 'MATIC', USDC: 'USDC-MATIC' },
+ polygon: { GMEE: 'GMEE', POL: 'POL', USDC: 'USDC-MATIC' },
qtum: { QTUM: 'QTUM' },
ravencoin: { RVN: 'RVN' },
ripple: { XRP: 'XRP' },
diff --git a/src/plugins/gui/scenes/AddressFormScene.tsx b/src/plugins/gui/scenes/AddressFormScene.tsx
index 55832cbcf4c..1f9bba8582e 100644
--- a/src/plugins/gui/scenes/AddressFormScene.tsx
+++ b/src/plugins/gui/scenes/AddressFormScene.tsx
@@ -23,6 +23,14 @@ import { getDiskletFormData, setDiskletForm } from '../../../util/formUtils'
import { makePeriodicTask } from '../../../util/PeriodicTask'
import { GuiFormField } from '../components/GuiFormField'
+export interface FiatPluginAddressFormParams {
+ countryCode: string
+ headerTitle: string
+ headerIconUri?: string
+ onSubmit: (homeAddress: HomeAddress) => Promise
+ onClose: () => void
+}
+
interface Props extends EdgeSceneProps<'guiPluginAddressForm'> {}
const FUZZY_SEARCH_INTERVAL = 2000
diff --git a/src/plugins/gui/scenes/InfoDisplayScene.tsx b/src/plugins/gui/scenes/InfoDisplayScene.tsx
index 67950112f80..e3c44313af0 100644
--- a/src/plugins/gui/scenes/InfoDisplayScene.tsx
+++ b/src/plugins/gui/scenes/InfoDisplayScene.tsx
@@ -3,15 +3,24 @@ import * as React from 'react'
import { View } from 'react-native'
import { Fontello } from '../../../assets/vector/index'
+import { SceneButtons } from '../../../components/buttons/SceneButtons'
import { EdgeTouchableOpacity } from '../../../components/common/EdgeTouchableOpacity'
import { SceneWrapper } from '../../../components/common/SceneWrapper'
import { cacheStyles, Theme, useTheme } from '../../../components/services/ThemeContext'
import { EdgeText } from '../../../components/themed/EdgeText'
-import { MainButton } from '../../../components/themed/MainButton'
-import { SceneHeader } from '../../../components/themed/SceneHeader'
+import { SceneHeaderUi4 } from '../../../components/themed/SceneHeaderUi4'
import { useHandler } from '../../../hooks/useHandler'
import { lstrings } from '../../../locales/strings'
import { EdgeSceneProps } from '../../../types/routerTypes'
+import { FiatPluginSepaTransferInfo } from '../fiatPluginTypes'
+
+export interface FiatPluginSepaTransferParams {
+ headerTitle: string
+ promptMessage: string
+ transferInfo: FiatPluginSepaTransferInfo
+ headerIconUri?: string
+ onDone: () => Promise
+}
interface InfoDisplayGroup {
groupTitle: string
@@ -123,13 +132,13 @@ export const InfoDisplayScene = React.memo((props: Props) => {
))
return (
-
-
+
+
{promptMessage}
{renderGroups()}
-
+
)
})
@@ -137,7 +146,7 @@ export const InfoDisplayScene = React.memo((props: Props) => {
const getStyles = cacheStyles((theme: Theme) => ({
groupContainer: {
marginTop: theme.rem(1),
- marginHorizontal: theme.rem(1),
+ marginHorizontal: theme.rem(0.5),
borderWidth: theme.thinLineWidth,
borderColor: theme.cardBorderColor,
borderRadius: theme.rem(0.5)
@@ -174,6 +183,6 @@ const getStyles = cacheStyles((theme: Theme) => ({
flexWrap: 'wrap'
},
promptContainer: {
- margin: theme.rem(1)
+ margin: theme.rem(0.5)
}
}))
diff --git a/src/plugins/gui/scenes/SepaFormScene.tsx b/src/plugins/gui/scenes/SepaFormScene.tsx
index b376aa22f0b..f147a5b06e7 100644
--- a/src/plugins/gui/scenes/SepaFormScene.tsx
+++ b/src/plugins/gui/scenes/SepaFormScene.tsx
@@ -16,6 +16,14 @@ import { EdgeSceneProps } from '../../../types/routerTypes'
import { getDiskletFormData, setDiskletForm } from '../../../util/formUtils'
import { GuiFormField } from '../components/GuiFormField'
+export interface FiatPluginSepaFormParams {
+ headerTitle: string
+ doneLabel: string
+ headerIconUri?: string
+ onDone: (sepaInfo: SepaInfo) => Promise
+ onClose: () => void
+}
+
interface Props extends EdgeSceneProps<'guiPluginSepaForm'> {}
export const SepaFormScene = React.memo((props: Props) => {
diff --git a/src/reducers/scenes/SettingsReducer.ts b/src/reducers/scenes/SettingsReducer.ts
index c39e2ac141e..7e1caa50cab 100644
--- a/src/reducers/scenes/SettingsReducer.ts
+++ b/src/reducers/scenes/SettingsReducer.ts
@@ -67,7 +67,7 @@ export const settingsLegacy = (state: SettingsState = initialState, action: Acti
case 'ACCOUNT_INIT_COMPLETE': {
const {
autoLogoutTimeInSeconds,
- contactsPermissionOn,
+ contactsPermissionShown,
countryCode,
defaultFiat,
defaultIsoFiat,
@@ -90,7 +90,7 @@ export const settingsLegacy = (state: SettingsState = initialState, action: Acti
const newState: SettingsState = {
...state,
autoLogoutTimeInSeconds,
- contactsPermissionOn,
+ contactsPermissionShown,
countryCode,
defaultFiat,
defaultIsoFiat,
@@ -160,11 +160,11 @@ export const settingsLegacy = (state: SettingsState = initialState, action: Acti
}
}
- case 'UI/SETTINGS/SET_CONTACTS_PERMISSION': {
- const { contactsPermissionOn } = action.data
+ case 'UI/SETTINGS/SET_CONTACTS_PERMISSION_SHOWN': {
+ const { contactsPermissionShown } = action.data
return {
...state,
- contactsPermissionOn
+ contactsPermissionShown
}
}
diff --git a/src/types/DeepLinkTypes.ts b/src/types/DeepLinkTypes.ts
index 60ebe0e354b..e0a00247609 100644
--- a/src/types/DeepLinkTypes.ts
+++ b/src/types/DeepLinkTypes.ts
@@ -5,6 +5,7 @@
* - edge:///...
* - airbitz:///...
* - https://deep.edge.app//...
+ * - https://dp.edge.app//...
*
* The `edge://` protocol supports the following link types:
*
@@ -71,6 +72,15 @@ export interface FiatPluginLink {
paymentType?: FiatPaymentType
}
+export interface FiatProviderLink {
+ type: 'fiatProvider'
+ direction: FiatDirection
+ providerId: string
+ path: string
+ query: { [key: string]: string | null }
+ uri: string
+}
+
export interface PromotionLink {
type: 'promotion'
installerId?: string
@@ -123,6 +133,7 @@ export type DeepLink =
| SceneLink
| EdgeLoginLink
| FiatPluginLink
+ | FiatProviderLink
| ModalLink
| NoopLink
| PasswordRecoveryLink
diff --git a/src/types/reduxActions.ts b/src/types/reduxActions.ts
index 32f9834f8fd..560e157cbb4 100644
--- a/src/types/reduxActions.ts
+++ b/src/types/reduxActions.ts
@@ -67,7 +67,7 @@ export type Action =
| { type: 'UI/SETTINGS/CHANGE_TOUCH_ID_SETTINGS'; data: { isTouchEnabled: boolean } }
| { type: 'UI/SETTINGS/SET_ACCOUNT_BALANCE_VISIBILITY'; data: { isAccountBalanceVisible: boolean } }
| { type: 'UI/SETTINGS/SET_AUTO_LOGOUT_TIME'; data: { autoLogoutTimeInSeconds: number } }
- | { type: 'UI/SETTINGS/SET_CONTACTS_PERMISSION'; data: { contactsPermissionOn: boolean } }
+ | { type: 'UI/SETTINGS/SET_CONTACTS_PERMISSION_SHOWN'; data: { contactsPermissionShown: boolean } }
| { type: 'UI/SETTINGS/SET_DEFAULT_FIAT'; data: { defaultFiat: string } }
| { type: 'UI/SETTINGS/SET_DENOMINATION_KEY'; data: { pluginId: string; currencyCode: string; denomination: EdgeDenomination } }
| { type: 'UI/SETTINGS/SET_MOST_RECENT_WALLETS'; data: { mostRecentWallets: MostRecentWallet[] } }
diff --git a/src/types/routerTypes.tsx b/src/types/routerTypes.tsx
index 423156005cb..4933bc38a5a 100644
--- a/src/types/routerTypes.tsx
+++ b/src/types/routerTypes.tsx
@@ -1,6 +1,6 @@
+import type { NavigatorScreenParams } from '@react-navigation/core'
import * as NavigationCore from '@react-navigation/core'
import type { StackActionHelpers } from '@react-navigation/native'
-import type { EdgeTokenId } from 'edge-core-js'
import type { ChangeMiningFeeParams } from '../components/scenes/ChangeMiningFeeScene'
import type { CoinRankingDetailsParams } from '../components/scenes/CoinRankingDetailsScene'
@@ -16,6 +16,8 @@ import type { CurrencyNotificationParams } from '../components/scenes/CurrencyNo
import type { CurrencySettingsParams } from '../components/scenes/CurrencySettingsScene'
import type { EdgeLoginParams } from '../components/scenes/EdgeLoginScene'
import type { EditTokenParams } from '../components/scenes/EditTokenScene'
+import type { FioAddressDetailsParams } from '../components/scenes/Fio/FioAddressDetailsScene'
+import type { FioAddressRegisterSuccessParams } from '../components/scenes/Fio/FioAddressRegisteredScene'
import type { FioAddressRegisterSelectWalletParams } from '../components/scenes/Fio/FioAddressRegisterSelectWalletScene'
import type { FioAddressSettingsParams } from '../components/scenes/Fio/FioAddressSettingsScene'
import type { FioConnectWalletConfirmParams } from '../components/scenes/Fio/FioConnectWalletConfirmScene'
@@ -24,7 +26,9 @@ import type { FioDomainRegisterSelectWalletParams } from '../components/scenes/F
import type { FioDomainSettingsParams } from '../components/scenes/Fio/FioDomainSettingsScene'
import type { FioNameConfirmParams } from '../components/scenes/Fio/FioNameConfirmScene'
import type { FioRequestConfirmationParams } from '../components/scenes/Fio/FioRequestConfirmationScene'
-import { FioStakingChangeParams } from '../components/scenes/Fio/FioStakingChangeScene'
+import type { FioSentRequestDetailsParams } from '../components/scenes/Fio/FioSentRequestDetailsScene'
+import type { FioStakingChangeParams } from '../components/scenes/Fio/FioStakingChangeScene'
+import type { FioStakingOverviewParams } from '../components/scenes/Fio/FioStakingOverviewScene'
import type { GettingStartedParams } from '../components/scenes/GettingStartedScene'
import type { GuiPluginListParams } from '../components/scenes/GuiPluginListScene'
import type { PluginViewParams } from '../components/scenes/GuiPluginViewScene'
@@ -59,32 +63,30 @@ import type { WcConnectionsParams } from '../components/scenes/WcConnectionsScen
import type { WcConnectParams } from '../components/scenes/WcConnectScene'
import type { WcDisconnectParams } from '../components/scenes/WcDisconnectScene'
import type { WebViewSceneParams } from '../components/scenes/WebViewScene'
-import type { FiatPluginAddressFormParams, FiatPluginSepaFormParams, FiatPluginSepaTransferParams } from '../plugins/gui/fiatPluginTypes'
+import type { FiatPluginAddressFormParams } from '../plugins/gui/scenes/AddressFormScene'
import type { FiatPluginEnterAmountParams } from '../plugins/gui/scenes/FiatPluginEnterAmountScene'
import type { FiatPluginOpenWebViewParams } from '../plugins/gui/scenes/FiatPluginWebView'
+import type { FiatPluginSepaTransferParams } from '../plugins/gui/scenes/InfoDisplayScene'
import type { RewardsCardDashboardParams } from '../plugins/gui/scenes/RewardsCardDashboardScene'
import type { RewardsCardWelcomeParams } from '../plugins/gui/scenes/RewardsCardWelcomeScene'
-import type { FioRequest } from './types'
+import type { FiatPluginSepaFormParams } from '../plugins/gui/scenes/SepaFormScene'
-/**
- * Defines the acceptable route parameters for each scene key.
- */
-export interface RouteParamList {
- // -------------------------------------------------------------------------
- // Tab router
- // -------------------------------------------------------------------------
+// -------------------------------------------------------------------------
+// Router types
+//
+// These must all be `type`, not `interface`, because of
+// https://reactnavigation.org/docs/typescript#type-checking-the-navigator
+// -------------------------------------------------------------------------
- // `homeTab`:
- home: {}
-
- // `walletsTab`:
- walletList: {}
+export type WalletsTabParamList = {} & {
+ walletList: undefined
transactionList: TransactionListParams
transactionDetails: TransactionDetailsParams
+}
- // `buyTab` / `sellTab`:
- pluginListBuy: GuiPluginListParams
- pluginListSell: GuiPluginListParams
+export type BuyTabParamList = {} & {
+ pluginListBuy: GuiPluginListParams | undefined
+ pluginListSell: GuiPluginListParams | undefined
pluginViewBuy: PluginViewParams
pluginViewSell: PluginViewParams
guiPluginAddressForm: FiatPluginAddressFormParams
@@ -94,135 +96,140 @@ export interface RouteParamList {
guiPluginWebView: FiatPluginOpenWebViewParams
rewardsCardDashboard: RewardsCardDashboardParams
rewardsCardWelcome: RewardsCardWelcomeParams
+}
- // `swapTab`:
- swapCreate: SwapCreateParams
+export type SwapTabParamList = {} & {
+ swapCreate: SwapCreateParams | undefined
swapConfirmation: SwapConfirmationParams
swapProcessing: SwapProcessingParams
+}
- // `edgeTabs`:
- homeTab: {}
- walletsTab: {}
- buyTab: {}
- sellTab: {}
- swapTab: {}
+export type EdgeTabsParamList = {} & {
+ home: undefined
+ walletsTab: NavigatorScreenParams | undefined
+ buyTab: NavigatorScreenParams | undefined
+ sellTab: NavigatorScreenParams | undefined
+ swapTab: NavigatorScreenParams | undefined
extraTab: undefined
devTab: undefined
+}
- // -------------------------------------------------------------------------
- // Main `edgeAppStack`
- // The tabs live inside this stack, as well as most app scenes.
- // -------------------------------------------------------------------------
+export type EdgeAppStackParamList = {} & {
+ // We nest the tabs inside this master stack:
+ edgeTabs: NavigatorScreenParams
- edgeTabs: {} // Tab navigator
- assetSettings: {}
+ assetSettings: undefined
changeMiningFee2: ChangeMiningFeeParams
- changePassword: {}
- changePin: {}
- coinRanking: {}
+ changePassword: undefined
+ changePin: undefined
+ coinRanking: undefined
coinRankingDetails: CoinRankingDetailsParams
confirmScene: ConfirmSceneParams
createWalletAccountSelect: CreateWalletAccountSelectParams
createWalletAccountSetup: CreateWalletAccountSetupParams
createWalletCompletion: CreateWalletCompletionParams
+ createWalletEditName: CreateWalletEditNameParams
createWalletImport: CreateWalletImportParams
createWalletImportOptions: CreateWalletImportOptionsParams
createWalletSelectCrypto: CreateWalletSelectCryptoParams
createWalletSelectCryptoNewAccount: CreateWalletSelectCryptoParams
- createWalletEditName: CreateWalletEditNameParams
currencyNotificationSettings: CurrencyNotificationParams
currencySettings: CurrencySettingsParams
- defaultFiatSetting: {}
+ defaultFiatSetting: undefined
edgeLogin: EdgeLoginParams
editToken: EditTokenParams
- fioCreateHandle: FioCreateHandleParams
- fioAddressDetails: {
- fioAddressName: string
- bundledTxs: number
- }
- fioAddressList: {}
- fioAddressRegister: {}
+ extraTab: undefined
+ fioAddressDetails: FioAddressDetailsParams
+ fioAddressList: undefined
+ fioAddressRegister: undefined
fioAddressRegisterSelectWallet: FioAddressRegisterSelectWalletParams
- fioAddressRegisterSuccess: {
- fioName: string
- expiration?: string
- }
+ fioAddressRegisterSuccess: FioAddressRegisterSuccessParams
fioAddressSettings: FioAddressSettingsParams
fioConnectToWalletsConfirm: FioConnectWalletConfirmParams
+ fioCreateHandle: FioCreateHandleParams
fioDomainConfirm: FioNameConfirmParams
- fioDomainRegister: {}
+ fioDomainRegister: undefined
fioDomainRegisterSelectWallet: FioDomainRegisterSelectWalletParams
fioDomainSettings: FioDomainSettingsParams
fioNameConfirm: FioNameConfirmParams
fioRequestConfirmation: FioRequestConfirmationParams
- fioRequestList: {}
- fioSentRequestDetails: {
- selectedFioSentRequest: FioRequest
- }
+ fioRequestList: undefined
+ fioSentRequestDetails: FioSentRequestDetailsParams
fioStakingChange: FioStakingChangeParams
- fioStakingOverview: {
- tokenId: EdgeTokenId
- walletId: string
- }
- loanDashboard: {}
- loanDetails: LoanDetailsParams
+ fioStakingOverview: FioStakingOverviewParams
+ loanClose: LoanCloseParams
loanCreate: LoanCreateParams
loanCreateConfirmation: LoanCreateConfirmationParams
- loanClose: LoanCloseParams
+ loanDashboard: undefined
+ loanDetails: LoanDetailsParams
loanManage: LoanManageParams
loanStatus: LoanStatusParams
manageTokens: ManageTokensParams
- migrateWalletCompletion: MigrateWalletCompletionParams
migrateWalletCalculateFee: MigrateWalletCalculateFeeParams
+ migrateWalletCompletion: MigrateWalletCompletionParams
migrateWalletSelectCrypto: MigrateWalletSelectCryptoParams
- notificationSettings: {}
+ notificationSettings: undefined
otpRepair: OtpRepairParams
- otpSetup: {}
- passwordRecovery: {}
- upgradeUsername: {}
+ otpSetup: undefined
+ passwordRecovery: undefined
pluginView: PluginViewParams
- promotionSettings: {}
+ promotionSettings: undefined
request: RequestParams
- securityAlerts: {}
+ securityAlerts: undefined
send2: SendScene2Params
- settingsOverview: {}
- settingsOverviewTab: {}
- spendingLimits: {}
+ settingsOverview: undefined
+ settingsOverviewTab: undefined
+ spendingLimits: undefined
stakeModify: StakeModifyParams
stakeOptions: StakeOptionsParams
stakeOverview: StakeOverviewParams
- swapSettings: {}
- swapSuccess: {}
- sweepPrivateKeyProcessing: SweepPrivateKeyProcessingParams
- sweepPrivateKeySelectCrypto: SweepPrivateKeySelectCryptoParams
+ swapSettings: undefined
+ swapSuccess: undefined
sweepPrivateKeyCalculateFee: SweepPrivateKeyCalculateFeeParams
sweepPrivateKeyCompletion: SweepPrivateKeyCompletionParams
- testScene: {}
- // transactionDetails is copied here
+ sweepPrivateKeyProcessing: SweepPrivateKeyProcessingParams
+ sweepPrivateKeySelectCrypto: SweepPrivateKeySelectCryptoParams
+ testScene: undefined
+ transactionDetails: TransactionDetailsParams
transactionsExport: TransactionsExportParams
- webView: WebViewSceneParams
+ upgradeUsername: undefined
+ wcConnect: WcConnectParams
wcConnections: WcConnectionsParams
wcDisconnect: WcDisconnectParams
- wcConnect: WcConnectParams
-
- // -------------------------------------------------------------------------
- // Root router
- // -------------------------------------------------------------------------
+ webView: WebViewSceneParams
+}
- // `edgeApp`:
- edgeAppStack: {}
+// A drawer router that contains the main `edgeAppStack`
+export type DrawerParamList = {} & {
+ edgeAppStack: NavigatorScreenParams | undefined
+}
- // Root routes:
- edgeApp: {} // A drawer router that contains the main `edgeAppStack`
+export type RootParamList = {} & {
+ edgeApp: NavigatorScreenParams | undefined
gettingStarted: GettingStartedParams
login: LoginParams
}
-export type RouteSceneKey = keyof RouteParamList
+// -------------------------------------------------------------------------
+// Legacy types
+//
+// These are a giant hack to smooth away the differences
+// between different navigation objects.
+// They pretend that any navigator to visit any scene,
+// as if the whole app were flat. That's not how react-navigation works,
+// but it's "close enough" until we can utilize the proper types
+// defined above.
+// -------------------------------------------------------------------------
-export type AppParamList = {
- [key in RouteSceneKey]: RouteParamList[key]
-}
+export type AppParamList = RootParamList &
+ DrawerParamList &
+ EdgeAppStackParamList &
+ EdgeTabsParamList &
+ SwapTabParamList &
+ BuyTabParamList &
+ WalletsTabParamList
+
+export type RouteSceneKey = keyof AppParamList
/**
* The of the `navigation` prop passed to each scene,
diff --git a/src/types/types.ts b/src/types/types.ts
index 66fe19d0822..2cb41b46906 100644
--- a/src/types/types.ts
+++ b/src/types/types.ts
@@ -130,7 +130,7 @@ export type AccountNotifDismissInfo = ReturnType asPasswordReminder({})),
isAccountBalanceVisible: asMaybe(asBoolean, true),
diff --git a/src/util/DeepLinkParser.ts b/src/util/DeepLinkParser.ts
index f9ada6afb49..7d0162d8ba7 100644
--- a/src/util/DeepLinkParser.ts
+++ b/src/util/DeepLinkParser.ts
@@ -5,7 +5,7 @@ import { guiPlugins } from '../constants/plugins/GuiPlugins'
import { ENV } from '../env'
import { asFiatDirection, asFiatPaymentType } from '../plugins/gui/fiatPluginTypes'
import { asModalNames, DeepLink, PromotionLink } from '../types/DeepLinkTypes'
-import { RouteParamList } from '../types/routerTypes'
+import { AppParamList } from '../types/routerTypes'
import { parseQuery, stringifyQuery } from './WebUtils'
/**
@@ -100,6 +100,20 @@ function parseEdgeProtocol(url: URL): DeepLink {
return { type: 'other', uri, protocol }
}
+ case 'fiatprovider': {
+ const [directionString, providerId, ...deepPath] = pathParts
+ const direction = asFiatDirection(directionString)
+
+ return {
+ type: 'fiatProvider',
+ direction,
+ path: stringifyPath(deepPath),
+ providerId,
+ query: parseQuery(url.query),
+ uri: url.href
+ }
+ }
+
case 'plugin': {
const [pluginId, ...deepPath] = pathParts
@@ -146,7 +160,7 @@ function parseEdgeProtocol(url: URL): DeepLink {
case 'scene': {
const sceneName = url.pathname.replace('/', '')
- return { type: 'scene', sceneName: sceneName as keyof RouteParamList, query: parseQuery(url.query) }
+ return { type: 'scene', sceneName: sceneName as keyof AppParamList, query: parseQuery(url.query) }
}
case 'swap': {
@@ -237,6 +251,7 @@ const prefixes: Array<[string, string]> = [
// Alternative schemes:
['https://deep.edge.app/', 'edge://'],
+ ['https://return.edge.app/', 'edge://'],
['airbitz://', 'edge://'],
['reqaddr://', 'edge://reqaddr']
]
diff --git a/src/util/corePlugins.ts b/src/util/corePlugins.ts
index 5b0fe0b06f4..09b9027e50b 100644
--- a/src/util/corePlugins.ts
+++ b/src/util/corePlugins.ts
@@ -88,8 +88,9 @@ export const swapPlugins = {
// Defi Swaps
rango: ENV.RANGO_INIT,
spookySwap: false,
+ mayaprotocol: ENV.MAYA_PROTOCOL_INIT,
thorchain: ENV.THORCHAIN_INIT,
- thorchainda: ENV.THORCHAIN_INIT,
+ thorchainda: ENV.THORCHAIN_DA_INIT,
tombSwap: ENV.TOMB_SWAP_INIT,
velodrome: true,
xrpdex: ENV.XRPDEX_INIT,
diff --git a/src/util/tracking.ts b/src/util/tracking.ts
index b07d00b3837..30781cc479d 100644
--- a/src/util/tracking.ts
+++ b/src/util/tracking.ts
@@ -21,6 +21,7 @@ export type TrackingEventName =
| 'Buy_Quote'
| 'Buy_Quote_Change_Provider'
| 'Buy_Quote_Next'
+ | 'Buy_Success'
| 'Create_Wallet_Failed'
| 'Create_Wallet_From_Search_Failed'
| 'Create_Wallet_From_Search_Success'
@@ -93,6 +94,22 @@ export interface SellConversionValues {
orderId?: string // Unique order identifier provided by fiat provider
}
+/**
+ * Analytics: Buy from fiat
+ */
+export interface BuyConversionValues {
+ conversionType: 'buy'
+
+ // The quoted fiat amounts resulting from this sale
+ sourceFiatAmount: string
+ sourceFiatCurrencyCode: string
+
+ destAmount: CryptoAmount
+
+ fiatProviderId: string // Fiat provider that provided the conversion
+ orderId?: string // Unique order identifier provided by fiat provider
+}
+
/**
* Culmination of defined tracking value types, including those defined in
* LoginUi.
@@ -106,7 +123,7 @@ export interface TrackingValues extends LoginTrackingValues {
surveyResponse?: string // User's answer to a survey
// Conversion values
- conversionValues?: DollarConversionValues | CryptoConversionValues | SellConversionValues
+ conversionValues?: DollarConversionValues | CryptoConversionValues | SellConversionValues | BuyConversionValues
}
// Set up the global Posthog analytics instance at boot
@@ -189,12 +206,26 @@ export function logEvent(event: TrackingEventName, values: TrackingValues = {}):
if (conversionType === 'dollar') {
params.currency = 'USD'
params.dollarRevenue = Math.abs(Number(conversionValues.dollarRevenue.toFixed(2)))
+ } else if (conversionType === 'buy') {
+ const { destAmount, sourceFiatAmount, sourceFiatCurrencyCode, orderId, fiatProviderId } = conversionValues
+
+ params.destDollarValue = Math.abs(Number(destAmount.displayDollarValue(exchangeRates)))
+ params.destCryptoAmount = Math.abs(Number(destAmount.exchangeAmount))
+ params.destCurrencyCode = destAmount.currencyCode
+ params.dollarValue = params.destDollarValue
+
+ params.sourceFiatValue = Math.abs(Number(sourceFiatAmount)).toFixed(2)
+ params.sourceFiatCurrencyCode = sourceFiatCurrencyCode
+
+ if (orderId != null) params.orderId = orderId
+ if (fiatProviderId != null) params.fiatProviderId = fiatProviderId
} else if (conversionType === 'sell') {
const { sourceAmount, destFiatAmount, destFiatCurrencyCode, orderId, fiatProviderId } = conversionValues
params.sourceDollarValue = Math.abs(Number(sourceAmount.displayDollarValue(exchangeRates)))
params.sourceCryptoAmount = Math.abs(Number(sourceAmount.exchangeAmount))
params.sourceCurrencyCode = sourceAmount.currencyCode
+ params.dollarValue = params.sourceDollarValue
params.destFiatValue = Math.abs(Number(destFiatAmount)).toFixed(2)
params.destFiatCurrencyCode = destFiatCurrencyCode
@@ -243,12 +274,25 @@ async function logToPosthog(event: TrackingEventName, values: TrackingValues) {
* Send a tracking event to the util server.
*/
async function logToUtilServer(event: TrackingEventName, values: TrackingValues) {
- await fetchReferral(`api/v1/event`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- Accept: 'application/json'
- },
- body: JSON.stringify({ ...values, event })
- })
+ const body = JSON.stringify({ ...values, event })
+
+ try {
+ const response = await fetchReferral(`api/v1/event`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Accept: 'application/json'
+ },
+ body
+ })
+ if (!response.ok) {
+ const text = await response.text()
+ console.warn(`logToUtilServer:fetch ${event} ${text} body length: ${body.length}`)
+ captureException(new Error(`logToUtilServer:fetch !ok ${event} ${text}`), { event_id: 'logToUtilServer', data: body })
+ }
+ } catch (e) {
+ console.warn(`logToUtilServer:fetch ${event}`)
+ console.warn(e)
+ captureException(e, { event_id: 'logToUtilServer', data: body })
+ }
}
diff --git a/yarn.lock b/yarn.lock
index 49e26ccea80..34a5c4f7cc2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3921,87 +3921,92 @@
component-type "^1.2.1"
join-component "^1.1.0"
-"@sentry-internal/feedback@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.113.0.tgz#90a3c5493e289d589cfde79330fca549a24f41a4"
- integrity sha512-eEmL8QXauUnM3FXGv0GT29RpL0Jo0pkn/uMu3aqjhQo7JKNqUGVYIUxJxiGWbVMbDXqPQ7L66bjjMS3FR1GM2g==
- dependencies:
- "@sentry/core" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
-
-"@sentry-internal/replay-canvas@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.113.0.tgz#8a0165494b0a0ba7b1ae45166ca90a8749c38b7a"
- integrity sha512-K8uA42aobNF/BAXf14el15iSAi9fonLBUrjZi6nPDq7zaA8rPvfcTL797hwCbqkETz2zDf52Jz7I3WFCshDoUw==
- dependencies:
- "@sentry/core" "7.113.0"
- "@sentry/replay" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
-
-"@sentry-internal/tracing@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.113.0.tgz#936f23205ab53be62f1753b923eddc243cefde86"
- integrity sha512-8MDnYENRMnEfQjvN4gkFYFaaBSiMFSU/6SQZfY9pLI3V105z6JQ4D0PGMAUVowXilwNZVpKNYohE7XByuhEC7Q==
- dependencies:
- "@sentry/core" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
-
-"@sentry/browser@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.113.0.tgz#09b77812cbf476eacdccdc714ba4e4ba2c170a88"
- integrity sha512-PdyVHPOprwoxGfKGsP2dXDWO0MBDW1eyP7EZlfZvM1A4hjk6ZRNfCv30g+TrqX4hiZDKzyqN3+AdP7N/J2IX0Q==
- dependencies:
- "@sentry-internal/feedback" "7.113.0"
- "@sentry-internal/replay-canvas" "7.113.0"
- "@sentry-internal/tracing" "7.113.0"
- "@sentry/core" "7.113.0"
- "@sentry/integrations" "7.113.0"
- "@sentry/replay" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
-
-"@sentry/cli-darwin@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.30.4.tgz#1726461997cd78f01c5f005528683092419b1b57"
- integrity sha512-d61JxgtPvUtUZ58T4WgzFDsRODAQbKcRxhK9DY7Y/+q7fH1gWc6J8s8RwxxhYu/N/UuWnAcXNtIH9daUanKTjQ==
-
-"@sentry/cli-linux-arm64@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.30.4.tgz#edbcfde267abad123fe92ebd37151ab3e15dc575"
- integrity sha512-XxRBiZAj84umr+i4n6zNGkbdJIX76G6SFalv4466XZkbhPuAeSABFQ5PxRVc+j7pLyOBGao4q2yiO8wrBLsJug==
-
-"@sentry/cli-linux-arm@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.30.4.tgz#86961eaa16c731dd1ade5dfc728a001b1a6cefb8"
- integrity sha512-2+L8FVOc8XLD2k4rUklsIG8gCoawOZJv1TdlHcIvsHIt6e55vVil6JDBc7dOD/tzJlJPAs+LMOuHHe8e/F+Y5A==
-
-"@sentry/cli-linux-i686@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.30.4.tgz#b35c7bec0d6d7680bd0d53fa42676dc40031bc5a"
- integrity sha512-ruouCpmxJXumNxvZ4asQzz2gzAKeUhg9dofB9h5PEmemceTLKfOAyfplD5l1iLWL3+JfF88SNeuu2/sWHP7aBg==
-
-"@sentry/cli-linux-x64@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.30.4.tgz#77e77abf2b2356eb18ce386db07dbb6d786a566e"
- integrity sha512-Kcb1Fn5wNSQW5bKkF35MpJSATtvgzGAHDzJkuEXPfF9xQMhOaYPnMN/D0aLYZgTpQawL4CM7dcfLuaafGmiazQ==
-
-"@sentry/cli-win32-i686@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.30.4.tgz#714ec71dbe1e5ef98af3f5f37bd1adcc5dc9dbd7"
- integrity sha512-FJ6IS+N7CsacDiHrFbE4Ic9UmumsiaBSD4SiQMIG2wfM7Ig1hc7+F4xoMC3MjivAIM7F94ZdSt0aZDGwE+zYeg==
-
-"@sentry/cli-win32-x64@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.30.4.tgz#00bc0f765bfa0abdf327a9d56e2bb0f2277a9981"
- integrity sha512-wzvMpj+AVEaLKKLkN1vZxuEwQJa5s8qiasYMBJTXFtD7+LqrONerHCRqk79W+60IBXX7MQSRFF3IsjVJzJGEjA==
-
-"@sentry/cli@2.30.4":
- version "2.30.4"
- resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.30.4.tgz#29b3217165c923a2b64c99d8c1643fcc6d3205df"
- integrity sha512-5zYdNGK2sNiP0zbnzMWuwm71KlCWLISbiJDyFQk6YYTKLh2RIYBPLF5mNLBxE2Ns4/wuKuBZjqE2ESLS5FzoOw==
+"@sentry-internal/feedback@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.119.0.tgz#429b3ea0fd34e928d2e7de5dcbe9377272a3f221"
+ integrity sha512-om8TkAU5CQGO8nkmr7qsSBVkP+/vfeS4JgtW3sjoTK0fhj26+DljR6RlfCGWtYQdPSP6XV7atcPTjbSnsmG9FQ==
+ dependencies:
+ "@sentry/core" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
+
+"@sentry-internal/replay-canvas@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.119.0.tgz#85669d184ba79150e64d05de02f5e2b616e68371"
+ integrity sha512-NL02VQx6ekPxtVRcsdp1bp5Tb5w6vnfBKSIfMKuDRBy5A10Uc3GSoy/c3mPyHjOxB84452A+xZSx6bliEzAnuA==
+ dependencies:
+ "@sentry/core" "7.119.0"
+ "@sentry/replay" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
+
+"@sentry-internal/tracing@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.119.0.tgz#201561af2a4ad1837333287c26050a5e688537ca"
+ integrity sha512-oKdFJnn+56f0DHUADlL8o9l8jTib3VDLbWQBVkjD9EprxfaCwt2m8L5ACRBdQ8hmpxCEo4I8/6traZ7qAdBUqA==
+ dependencies:
+ "@sentry/core" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
+
+"@sentry/babel-plugin-component-annotate@2.20.1":
+ version "2.20.1"
+ resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.20.1.tgz#204c63ed006a048f48f633876e1b8bacf87a9722"
+ integrity sha512-4mhEwYTK00bIb5Y9UWIELVUfru587Vaeg0DQGswv4aIRHIiMKLyNqCEejaaybQ/fNChIZOKmvyqXk430YVd7Qg==
+
+"@sentry/browser@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.119.0.tgz#65004015c107be5d2f49a852ebcffc5d19d90e0d"
+ integrity sha512-WwmW1Y4D764kVGeKmdsNvQESZiAn9t8LmCWO0ucBksrjL2zw9gBPtOpRcO6l064sCLeSxxzCN+kIxhRm1gDFEA==
+ dependencies:
+ "@sentry-internal/feedback" "7.119.0"
+ "@sentry-internal/replay-canvas" "7.119.0"
+ "@sentry-internal/tracing" "7.119.0"
+ "@sentry/core" "7.119.0"
+ "@sentry/integrations" "7.119.0"
+ "@sentry/replay" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
+
+"@sentry/cli-darwin@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.36.1.tgz#786adf6984dbe3c6fb7dac51b625c314117b807d"
+ integrity sha512-JOHQjVD8Kqxm1jUKioAP5ohLOITf+Dh6+DBz4gQjCNdotsvNW5m63TKROwq2oB811p+Jzv5304ujmN4cAqW1Ww==
+
+"@sentry/cli-linux-arm64@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.36.1.tgz#ff449d7e7e715166257998c02cf635ca02acbadd"
+ integrity sha512-R//3ZEkbzvoStr3IA7nxBZNiBYyxOljOqAhgiTnejXHmnuwDzM3TBA2n5vKPE/kBFxboEBEw0UTzTIRb1T0bgw==
+
+"@sentry/cli-linux-arm@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.36.1.tgz#1ae5d335a1b4cd217a34c2bd6c6f5e0670136eb3"
+ integrity sha512-gvEOKN0fWL2AVqUBKHNXPRZfJNvKTs8kQhS8cQqahZGgZHiPCI4BqW45cKMq+ZTt1UUbLmt6khx5Dz7wi+0i5A==
+
+"@sentry/cli-linux-i686@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.36.1.tgz#112b9e26357e918cbbba918114ec8cdab07cdf60"
+ integrity sha512-R7sW5Vk/HacVy2YgQoQB+PwccvFYf2CZVPSFSFm2z7MEfNe77UYHWUq+sjJ4vxWG6HDWGVmaX0fjxyDkE01JRA==
+
+"@sentry/cli-linux-x64@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.36.1.tgz#c3e5bdb0c9a4bb44c83927c62a3cd7e006709bf7"
+ integrity sha512-UMr3ik8ksA7zQfbzsfwCb+ztenLnaeAbX94Gp+bzANZwPfi/vVHf2bLyqsBs4OyVt9SPlN1bbM/RTGfMjZ3JOw==
+
+"@sentry/cli-win32-i686@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.36.1.tgz#819573320e885e1dbf59b0a01d3bd370c84c1708"
+ integrity sha512-CflvhnvxPEs5GWQuuDtYSLqPrBaPbcSJFlBuUIb+8WNzRxvVfjgw1qzfZmkQqABqiy/YEsEekllOoMFZAvCcVA==
+
+"@sentry/cli-win32-x64@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.36.1.tgz#80779b4bffb4e2e32944eae72c60e6f40151b4dc"
+ integrity sha512-wWqht2xghcK3TGnooHZSzA3WSjdtno/xFjZLvWmw38rblGwgKMxLZnlxV6uDyS+OJ6CbfDTlCRay/0TIqA0N8g==
+
+"@sentry/cli@2.36.1":
+ version "2.36.1"
+ resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.36.1.tgz#a9146b798cb6d2f782a7a48d74633ddcd88dc8d3"
+ integrity sha512-gzK5uQKDWKhyH5udoB5+oaUNrS//urWyaXgKvHKz4gFfl744HuKY9dpLPP2nMnf0zLGmGM6xJnMXLqILq0mtxw==
dependencies:
https-proxy-agent "^5.0.0"
node-fetch "^2.6.7"
@@ -4009,87 +4014,88 @@
proxy-from-env "^1.1.0"
which "^2.0.2"
optionalDependencies:
- "@sentry/cli-darwin" "2.30.4"
- "@sentry/cli-linux-arm" "2.30.4"
- "@sentry/cli-linux-arm64" "2.30.4"
- "@sentry/cli-linux-i686" "2.30.4"
- "@sentry/cli-linux-x64" "2.30.4"
- "@sentry/cli-win32-i686" "2.30.4"
- "@sentry/cli-win32-x64" "2.30.4"
-
-"@sentry/core@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.113.0.tgz#84307eabf03ece9304894ad24ee15581a220c5c7"
- integrity sha512-pg75y3C5PG2+ur27A0Re37YTCEnX0liiEU7EOxWDGutH17x3ySwlYqLQmZsFZTSnvzv7t3MGsNZ8nT5O0746YA==
- dependencies:
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
-
-"@sentry/hub@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-7.113.0.tgz#12f14071f43e657cd36174ba8b06cc955da5492f"
- integrity sha512-aoerhlAw3vnY9a27eKAoK862oMXFbyMFWbaZuCeR5gfg7sHsOkVQkCl3yiYfF5hfw9MbwbbY6GqWbCrA89Ci/A==
- dependencies:
- "@sentry/core" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
-
-"@sentry/integrations@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.113.0.tgz#cce71e07cf90c4bf9b22f85c3ce22d9ba926ae5a"
- integrity sha512-w0sspGBQ+6+V/9bgCkpuM3CGwTYoQEVeTW6iNebFKbtN7MrM3XsGAM9I2cW1jVxFZROqCBPFtd2cs5n0j14aAg==
- dependencies:
- "@sentry/core" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
+ "@sentry/cli-darwin" "2.36.1"
+ "@sentry/cli-linux-arm" "2.36.1"
+ "@sentry/cli-linux-arm64" "2.36.1"
+ "@sentry/cli-linux-i686" "2.36.1"
+ "@sentry/cli-linux-x64" "2.36.1"
+ "@sentry/cli-win32-i686" "2.36.1"
+ "@sentry/cli-win32-x64" "2.36.1"
+
+"@sentry/core@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.119.0.tgz#a6e41119bb03ec27689f9ad04e79d1fba5b7fc37"
+ integrity sha512-CS2kUv9rAJJEjiRat6wle3JATHypB0SyD7pt4cpX5y0dN5dZ1JrF57oLHRMnga9fxRivydHz7tMTuBhSSwhzjw==
+ dependencies:
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
+
+"@sentry/hub@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-7.119.0.tgz#a94d657b9d3cfd4cc061c5c238f86faefb55d5d8"
+ integrity sha512-183h5B/rZosLxpB+ZYOvFdHk0rwZbKskxqKFtcyPbDAfpCUgCass41UTqyxF6aH1qLgCRxX8GcLRF7frIa/SOg==
+ dependencies:
+ "@sentry/core" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
+
+"@sentry/integrations@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.119.0.tgz#5b25c603026dbacfe1ae7bb8d768506a129149fb"
+ integrity sha512-OHShvtsRW0A+ZL/ZbMnMqDEtJddPasndjq+1aQXw40mN+zeP7At/V1yPZyFaURy86iX7Ucxw5BtmzuNy7hLyTA==
+ dependencies:
+ "@sentry/core" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
localforage "^1.8.1"
-"@sentry/react-native@^5.22.3":
- version "5.22.3"
- resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-5.22.3.tgz#89f451361bfaf37966ddba5aa42839eeee5e6344"
- integrity sha512-CjMHCpsrMGwplna+ILSr+SN97LY5Ggw/JDTrsnhijpiKVMO8bDpeOdwfprAhX8DzaNHPkqKBXRTdbsr620WzZQ==
- dependencies:
- "@sentry/browser" "7.113.0"
- "@sentry/cli" "2.30.4"
- "@sentry/core" "7.113.0"
- "@sentry/hub" "7.113.0"
- "@sentry/integrations" "7.113.0"
- "@sentry/react" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
-
-"@sentry/react@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.113.0.tgz#8e21c92e9691ea881639596d7e60a996b23ba229"
- integrity sha512-+zVPz+h5Wydq4ntekw3/dXq5jeHIpZoQ2iqhB96PA9Y94JIq178i/xIP204S1h6rN7cmWAqtR93vnPKdxnlUbQ==
- dependencies:
- "@sentry/browser" "7.113.0"
- "@sentry/core" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
+"@sentry/react-native@^5.33.1":
+ version "5.33.1"
+ resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-5.33.1.tgz#5427bb71205443c7fe0f5ea001bbe2ff724a686e"
+ integrity sha512-k463M0wC+5FNJrKvzsE6uq7cjMKOrzT+hNm79sFjxqbw6vXgMHOjOcYsji7jFr5Nqr0jEOHm2niwsVlYEXGVAg==
+ dependencies:
+ "@sentry/babel-plugin-component-annotate" "2.20.1"
+ "@sentry/browser" "7.119.0"
+ "@sentry/cli" "2.36.1"
+ "@sentry/core" "7.119.0"
+ "@sentry/hub" "7.119.0"
+ "@sentry/integrations" "7.119.0"
+ "@sentry/react" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
+
+"@sentry/react@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.119.0.tgz#79f2c9d94322a3afbfa8af9f5b872f7c2e9b0820"
+ integrity sha512-cf8Cei+qdSA26gx+IMAuc/k44PeBImNzIpXi3930SLhUe44ypT5OZ/44L6xTODHZzTIyMSJPduf59vT2+eW9yg==
+ dependencies:
+ "@sentry/browser" "7.119.0"
+ "@sentry/core" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
hoist-non-react-statics "^3.3.2"
-"@sentry/replay@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.113.0.tgz#db41b792e5d9966a9b1ca4eb1695ad7100f39b50"
- integrity sha512-UD2IaphOWKFdeGR+ZiaNAQ+wFsnwbJK6PNwcW6cHmWKv9COlKufpFt06lviaqFZ8jmNrM4H+r+R8YVTrqCuxgg==
+"@sentry/replay@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.119.0.tgz#50881079d013c77f87a994331d8bcad1d49e0960"
+ integrity sha512-BnNsYL+X5I4WCH6wOpY6HQtp4MgVt0NVlhLUsEyrvMUiTs0bPkDBrulsgZQBUKJsbOr3l9nHrFoNVB/0i6WNLA==
dependencies:
- "@sentry-internal/tracing" "7.113.0"
- "@sentry/core" "7.113.0"
- "@sentry/types" "7.113.0"
- "@sentry/utils" "7.113.0"
+ "@sentry-internal/tracing" "7.119.0"
+ "@sentry/core" "7.119.0"
+ "@sentry/types" "7.119.0"
+ "@sentry/utils" "7.119.0"
-"@sentry/types@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.113.0.tgz#2193c9933838302c82814771b03a8647fa684ffb"
- integrity sha512-PJbTbvkcPu/LuRwwXB1He8m+GjDDLKBtu3lWg5xOZaF5IRdXQU2xwtdXXsjge4PZR00tF7MO7X8ZynTgWbYaew==
+"@sentry/types@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.119.0.tgz#8b3d7a1405c362e75cd900d46089df4e70919d2a"
+ integrity sha512-27qQbutDBPKGbuJHROxhIWc1i0HJaGLA90tjMu11wt0E4UNxXRX+UQl4Twu68v4EV3CPvQcEpQfgsViYcXmq+w==
-"@sentry/utils@7.113.0":
- version "7.113.0"
- resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.113.0.tgz#1e6e790c9d84e4809b2bb529bbd33a506b6db7bd"
- integrity sha512-nzKsErwmze1mmEsbW2AwL2oB+I5v6cDEJY4sdfLekA4qZbYZ8pV5iWza6IRl4XfzGTE1qpkZmEjPU9eyo0yvYw==
+"@sentry/utils@7.119.0":
+ version "7.119.0"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.119.0.tgz#debe29020f6ef3786a5bd855cf1b97116b7be826"
+ integrity sha512-ZwyXexWn2ZIe2bBoYnXJVPc2esCSbKpdc6+0WJa8eutXfHq3FRKg4ohkfCBpfxljQGEfP1+kfin945lA21Ka+A==
dependencies:
- "@sentry/types" "7.113.0"
+ "@sentry/types" "7.119.0"
"@sideway/address@^4.1.0":
version "4.1.2"
@@ -9126,10 +9132,10 @@ edge-core-js@^2.18.0:
yaob "^0.3.12"
yavent "^0.1.3"
-edge-currency-accountbased@^4.24.6:
- version "4.24.6"
- resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.6.tgz#a2201ce550c2361d93c8f30dca04885e12e05287"
- integrity sha512-q0I00j2WMGj5xX3lMWLqZi6FiNatiSNiHL7nAulrygfgnrQbGKKxkR0HPR3kE4wL10aJugAxjak38brUCuAdFQ==
+edge-currency-accountbased@^4.26.0:
+ version "4.26.0"
+ resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.26.0.tgz#c9e0da595f424c8ba3f5c516c82c96151c2afe43"
+ integrity sha512-en8KTBHQPhbFBd3f/4HF8MTXDdkOGbjlGMaxl0S5Zv5VqjIWS72FiWoEkVXKV/teQPffisGLRTQk+P86xT6vPQ==
dependencies:
"@binance-chain/javascript-sdk" "^4.2.0"
"@chain-registry/client" "^1.15.0"
@@ -9183,10 +9189,10 @@ edge-currency-monero@^1.3.1:
buffer "^5.0.6"
uri-js "^3.0.2"
-edge-currency-plugins@^3.3.2:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/edge-currency-plugins/-/edge-currency-plugins-3.3.2.tgz#6622c2c76a7eeff65b9d82a0b432cd08baac0cc1"
- integrity sha512-MNuHrEfX6ytsPJGrRq39lrGfVV8YM5l5x0J+2lqGMcH7FKQpuDWomcdGXC+Pbe7595xG5uAwcI8FaeGhoyxU0g==
+edge-currency-plugins@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/edge-currency-plugins/-/edge-currency-plugins-3.4.0.tgz#337f345d61c77df0650367d7ad3cc7104657d81a"
+ integrity sha512-p4gluQVZS0y0hIUBdnuF/alhNwx2n9rQuuyfZVsnDpUxNYTAZBtONsFdcAccXDHVJgoJNsRnaMUCTAQ/Jz9vaA==
dependencies:
"@bitcoin-js/tiny-secp256k1-asmjs" "^2.2.3"
altcoin-js "^1.0.0"
@@ -9213,10 +9219,10 @@ edge-currency-plugins@^3.3.2:
wifgrs "^2.0.6"
ws "^7.4.6"
-edge-exchange-plugins@^2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/edge-exchange-plugins/-/edge-exchange-plugins-2.8.1.tgz#83c4be61487142ab65af2b2f6f0bd58f01b88ddf"
- integrity sha512-yM2SMQ5kcP2/RF6xSv78tTTItOGu+lK7NuSbU8SRNlaXHEGAHTANCS9oZBRiYLKOMvksThNgV6n4EDwlr+qovw==
+edge-exchange-plugins@^2.12.0:
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/edge-exchange-plugins/-/edge-exchange-plugins-2.12.0.tgz#b3ad57c3b0d32e15d024108250081606929fde68"
+ integrity sha512-P7979bvJbMKG6lAKT/3aQ2IrncN++4x8VxAgG7N+lspoDRAnq9anBRGGGbemT3F/yMbtpGd5dBWadQ9AEGDmoA==
dependencies:
"@cosmjs/encoding" "^0.32.2"
biggystring "^4.1.3"
@@ -9225,17 +9231,17 @@ edge-exchange-plugins@^2.8.1:
regenerator-runtime "0.13.11"
xrpl "^2.10.0"
-edge-info-server@^2.7.0:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/edge-info-server/-/edge-info-server-2.7.0.tgz#dd59760a779b922285a3bb6108331f25d87395d0"
- integrity sha512-6FecnV0nm1tufSZlai4nd0mRslrquTNMicQf9VTNOR0GJmXD55AZgm28GSjeQx/VIJdnwh+620BNfidQeqGc0w==
+edge-info-server@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/edge-info-server/-/edge-info-server-3.0.1.tgz#0c3e085c8fd4d18e7d00370e46b209e0339e4c45"
+ integrity sha512-PFKdssUH4HPIp7lHCrU15YqM3SDp7t9lUi1C5GRlYNKyE1oVs+rSS2zCR5hyfvNXL4piHGnePUNYNGzLkjljHA==
dependencies:
cleaners "^0.3.16"
-edge-login-ui-rn@^3.22.3:
- version "3.22.3"
- resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.22.3.tgz#e8f56e415b84e6e51c876bce2288d0bac49d158c"
- integrity sha512-EZb18kdRQsOazHJh0nF1n9YetkDV1Hcf8Qx7/IQimFfn1Dllt2uyZU1+NXJPRwMu11MubaQk3aWMUsHad/Q5yA==
+edge-login-ui-rn@^3.22.4:
+ version "3.22.4"
+ resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.22.4.tgz#6ec456e71a37bde287a9841a970553493234228f"
+ integrity sha512-0DvlOiRJ68vhmzJxutP4DgA48qQBkpJyVHt7Wbhc4+vBacquYd4pVg2pYTQV42Tuqzak1aX/jX5ehu7CTeHt1w==
dependencies:
base-x "^4.0.0"
cleaners "^0.3.12"
@@ -16264,13 +16270,18 @@ react-native-permissions@^4.1.5:
resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-4.1.5.tgz#db4d1ddbf076570043f4fd4168f54bb6020aec92"
integrity sha512-r6VMRacASmtRHS+GZ+5HQCp9p9kiE+UU9magHOZCXZLTJitdTuVHWZRrb4v4oqZGU+zAp3mZhTQftuMMv+WLUg==
-react-native-piratechain@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/react-native-piratechain/-/react-native-piratechain-0.5.1.tgz#c7acf6f258b67bdaea0bf232c177022df99dcdfb"
- integrity sha512-IJAcg44LVzggXhXK/BSVMFPP/71Qv0Dlq1+1R2feaRCT4ljJrJBsDLLxJKjnfu4OWuz2oEWohCy9kmmZMO4wuQ==
+react-native-piratechain@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/react-native-piratechain/-/react-native-piratechain-0.5.3.tgz#50ca724808e43a562658de3d3191dfe8db0190af"
+ integrity sha512-ijyVNy/6woSe4ZLujxU+NzfAGJD6qhlJxMYIbh/NQGS6JOvFbs9N52iTbUL0DhtYuJCgztmhqakRLrDcLpV9hw==
dependencies:
rfc4648 "^1.3.0"
+react-native-power-saving-mode@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/react-native-power-saving-mode/-/react-native-power-saving-mode-0.1.1.tgz#8ec758971979f11c81410751a6ea228abfce269d"
+ integrity sha512-aWRtlpW55fqjLQDTb/dEw6LqlG0iWx8NZxlhu6QWp5DcvQMzx3EDxCX7RC1h/ofrISCoNisd8Lb7YSa+9SY5VQ==
+
react-native-reanimated@^3.14.0:
version "3.14.0"
resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.14.0.tgz#2118265f3a5cad8c142633e36d76d0f0cc8cc9e8"
@@ -16374,10 +16385,10 @@ react-native-webview@^13.8.4:
escape-string-regexp "2.0.0"
invariant "2.2.4"
-react-native-zcash@^0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/react-native-zcash/-/react-native-zcash-0.8.1.tgz#04c1ce86134558a8563c3d7258ae703bf060c6ee"
- integrity sha512-5eH1jbOH/2he+UZn0BbbYOSRfs+9g9kjZBXXU2ozZ0giS1rZCBc0oUIEVYEnQOPw38BJpbeAjlqYz2EuRl/8hg==
+react-native-zcash@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/react-native-zcash/-/react-native-zcash-0.9.1.tgz#6fc881eeaf13ed80aa4c93ced0391b2477ecb9ad"
+ integrity sha512-yqFwHd6YgQezgLDprdM+Nj6ZPjuxc6VyQJ/MmDS8pFBpejEApswBPAMfvEfEQ810xDua9PByMk0mWQpwHrWfmQ==
dependencies:
biggystring "^4.1.3"
rfc4648 "^1.3.0"