diff --git a/CHANGELOG.md b/CHANGELOG.md index 8500f453220..946a7d3dbb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,40 @@ and this project adheres to [Semantic Versioning](http://semver.org/) ### Fixed +## [1.9.50] (https://github.com/rainbow-me/rainbow/releases/tag/v1.9.50) + +### Fixed + +- Fixed an issue with unlocking app icons (#6342, #6345) + +## [1.9.49] (https://github.com/rainbow-me/rainbow/releases/tag/v1.9.49) + +### Added + +- Claim as X (#6193) +- NFT checker 2.0 (#6293) +- Added support for inkchain (#6323) + +### Changed + +- Improved nonce management logic for private mempool handling (#6277) +- Split e2e into parallel and serial flows to improve CI runs (#6317) +- Browser animation code cleanup (#6306) +- Converted network accessors to functions (#6219) +- Bumped nanoid from 3.3.7 to 3.3.8 in /src/design-system/docs (#6320) +- Updated default currentNonce value to -1 (#6324) +- Updated trending tokens query to support backend changes (#6312) +- Replaced node ack retires with a small delay (#6326) +- Updated swaps sdk (#6327) + +### Fixed + +- Fixed an issue with SignTransactionSheet not disabling button on authorization (#6242) +- Fixed an issue where the sticky header on the wallet screen couldn’t be tapped when scrolled down the page (#6309) +- Fixed a duplicate wallet initialization issue where initializeWallet was being called multiple times (#6310) +- Fixed an issue where the wallet height calculation caused a break in the wallet switcher list with wallets up to two accounts (#6315) +- Fixed a crash on develop regarding TextShadow (#6329) + ## [1.9.48] (https://github.com/rainbow-me/rainbow/releases/tag/v1.9.48) ### Fixed diff --git a/android/app/build.gradle b/android/app/build.gradle index ea1651d53a5..9007b06bd09 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -135,8 +135,8 @@ android { applicationId "me.rainbow" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 242 - versionName "1.9.49" + versionCode 244 + versionName "1.9.51" missingDimensionStrategy 'react-native-camera', 'general' renderscriptTargetApi 23 renderscriptSupportModeEnabled true diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5fa3c8649c4..0554e98e1eb 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -259,6 +259,19 @@ + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/redacted.xml b/android/app/src/main/res/mipmap-anydpi-v26/redacted.xml new file mode 100644 index 00000000000..082c50eb1c0 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/redacted.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/redacted_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/redacted_round.xml new file mode 100644 index 00000000000..082c50eb1c0 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/redacted_round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/legacy_redacted.png b/android/app/src/main/res/mipmap-hdpi/legacy_redacted.png new file mode 100644 index 00000000000..b8048596a84 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/legacy_redacted.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/redacted_background.png b/android/app/src/main/res/mipmap-hdpi/redacted_background.png new file mode 100644 index 00000000000..6b5cf4349b3 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/redacted_background.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/redacted_foreground.png b/android/app/src/main/res/mipmap-hdpi/redacted_foreground.png new file mode 100644 index 00000000000..72e2d9110e4 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/redacted_foreground.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/redacted_round.png b/android/app/src/main/res/mipmap-hdpi/redacted_round.png new file mode 100644 index 00000000000..adce5be0ad0 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/redacted_round.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/legacy_redacted.png b/android/app/src/main/res/mipmap-ldpi/legacy_redacted.png new file mode 100644 index 00000000000..42cb39db7ba Binary files /dev/null and b/android/app/src/main/res/mipmap-ldpi/legacy_redacted.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/redacted_background.png b/android/app/src/main/res/mipmap-ldpi/redacted_background.png new file mode 100644 index 00000000000..174edb0a17b Binary files /dev/null and b/android/app/src/main/res/mipmap-ldpi/redacted_background.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/redacted_foreground.png b/android/app/src/main/res/mipmap-ldpi/redacted_foreground.png new file mode 100644 index 00000000000..3c6bfca090f Binary files /dev/null and b/android/app/src/main/res/mipmap-ldpi/redacted_foreground.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/redacted_round.png b/android/app/src/main/res/mipmap-ldpi/redacted_round.png new file mode 100644 index 00000000000..c01d0478328 Binary files /dev/null and b/android/app/src/main/res/mipmap-ldpi/redacted_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/legacy_redacted.png b/android/app/src/main/res/mipmap-mdpi/legacy_redacted.png new file mode 100644 index 00000000000..31893c73a71 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/legacy_redacted.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/redacted_background.png b/android/app/src/main/res/mipmap-mdpi/redacted_background.png new file mode 100644 index 00000000000..45c7631665e Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/redacted_background.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/redacted_foreground.png b/android/app/src/main/res/mipmap-mdpi/redacted_foreground.png new file mode 100644 index 00000000000..72ea5c856d4 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/redacted_foreground.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/redacted_round.png b/android/app/src/main/res/mipmap-mdpi/redacted_round.png new file mode 100644 index 00000000000..d7974bd9c1d Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/redacted_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/legacy_redacted.png b/android/app/src/main/res/mipmap-xhdpi/legacy_redacted.png new file mode 100644 index 00000000000..a2e4a357bd2 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/legacy_redacted.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/redacted_background.png b/android/app/src/main/res/mipmap-xhdpi/redacted_background.png new file mode 100644 index 00000000000..4b95b041494 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/redacted_background.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/redacted_foreground.png b/android/app/src/main/res/mipmap-xhdpi/redacted_foreground.png new file mode 100644 index 00000000000..a7d739d8c9b Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/redacted_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/redacted_round.png b/android/app/src/main/res/mipmap-xhdpi/redacted_round.png new file mode 100644 index 00000000000..f3dd34ffc2c Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/redacted_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/legacy_redacted.png b/android/app/src/main/res/mipmap-xxhdpi/legacy_redacted.png new file mode 100644 index 00000000000..3c2a48017f2 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/legacy_redacted.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/redacted_background.png b/android/app/src/main/res/mipmap-xxhdpi/redacted_background.png new file mode 100644 index 00000000000..efa15fd8867 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/redacted_background.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/redacted_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/redacted_foreground.png new file mode 100644 index 00000000000..cc68ba7b6f6 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/redacted_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/redacted_round.png b/android/app/src/main/res/mipmap-xxhdpi/redacted_round.png new file mode 100644 index 00000000000..faee2f5b5df Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/redacted_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/legacy_redacted.png b/android/app/src/main/res/mipmap-xxxhdpi/legacy_redacted.png new file mode 100644 index 00000000000..eef48dad283 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/legacy_redacted.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/redacted_background.png b/android/app/src/main/res/mipmap-xxxhdpi/redacted_background.png new file mode 100644 index 00000000000..d5e58434b82 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/redacted_background.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/redacted_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/redacted_foreground.png new file mode 100644 index 00000000000..09470f24d99 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/redacted_foreground.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/redacted_round.png b/android/app/src/main/res/mipmap-xxxhdpi/redacted_round.png new file mode 100644 index 00000000000..4bab1eb329c Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/redacted_round.png differ diff --git a/ios/AppIcons/redacted@2x.png b/ios/AppIcons/redacted@2x.png new file mode 100644 index 00000000000..5117e475bdc Binary files /dev/null and b/ios/AppIcons/redacted@2x.png differ diff --git a/ios/AppIcons/redacted@3x.png b/ios/AppIcons/redacted@3x.png new file mode 100644 index 00000000000..3ae86298a84 Binary files /dev/null and b/ios/AppIcons/redacted@3x.png differ diff --git a/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge.png b/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge.png index a9c1e8c795a..b2e9d186af8 100644 Binary files a/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge.png and b/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge.png differ diff --git a/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@2x.png b/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@2x.png index bd647873044..4fd132ed1fb 100644 Binary files a/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@2x.png and b/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@2x.png differ diff --git a/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@3x.png b/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@3x.png index 06a7eeb07a8..33b686fb121 100644 Binary files a/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@3x.png and b/ios/Images.xcassets/badges/apechainBadge.imageset/apechainBadge@3x.png differ diff --git a/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge.png b/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge.png index bd647873044..b4261daba5e 100644 Binary files a/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge.png and b/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge.png differ diff --git a/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@2x.png b/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@2x.png index 3e39ee0e49f..c6576eb4e74 100644 Binary files a/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@2x.png and b/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@2x.png differ diff --git a/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@3x.png b/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@3x.png index 013d3a2d4b2..0e9b60470ff 100644 Binary files a/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@3x.png and b/ios/Images.xcassets/badges/apechainBadgeLarge.imageset/apechainBadgeLarge@3x.png differ diff --git a/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark.png b/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark.png index ced4dc053fd..30ddd73be15 100644 Binary files a/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark.png and b/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark.png differ diff --git a/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@2x.png b/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@2x.png index 3f3e8ecae55..faf0caafb64 100644 Binary files a/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@2x.png and b/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@2x.png differ diff --git a/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@3x.png b/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@3x.png index 240359855ce..46fb7f27973 100644 Binary files a/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@3x.png and b/ios/Images.xcassets/badges/apechainBadgeLargeDark.imageset/apechainBadgeLargeDark@3x.png differ diff --git a/ios/Images.xcassets/badges/ethereum.imageset/ethereum.png b/ios/Images.xcassets/badges/ethereum.imageset/ethereum.png index ce612bb3da8..90cd4377c61 100644 Binary files a/ios/Images.xcassets/badges/ethereum.imageset/ethereum.png and b/ios/Images.xcassets/badges/ethereum.imageset/ethereum.png differ diff --git a/ios/Images.xcassets/badges/ethereum.imageset/ethereum@2x.png b/ios/Images.xcassets/badges/ethereum.imageset/ethereum@2x.png index c3aa91dd13f..2f295c7eadf 100644 Binary files a/ios/Images.xcassets/badges/ethereum.imageset/ethereum@2x.png and b/ios/Images.xcassets/badges/ethereum.imageset/ethereum@2x.png differ diff --git a/ios/Images.xcassets/badges/ethereum.imageset/ethereum@3x.png b/ios/Images.xcassets/badges/ethereum.imageset/ethereum@3x.png index 237f8a091cd..5d46e46276b 100644 Binary files a/ios/Images.xcassets/badges/ethereum.imageset/ethereum@3x.png and b/ios/Images.xcassets/badges/ethereum.imageset/ethereum@3x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge.png b/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge.png index 5a23f3311ca..cbbfb144c7f 100644 Binary files a/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge.png and b/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@2x.png b/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@2x.png index 3ee02bb472f..2c72c8d698e 100644 Binary files a/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@2x.png and b/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@2x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@3x.png b/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@3x.png index 3a7be3d1771..fe08ca8285d 100644 Binary files a/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@3x.png and b/ios/Images.xcassets/badges/ethereumBadge.imageset/ethereumBadge@3x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/Contents.json b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/Contents.json index 7f313fd1f25..9c67fccf244 100644 --- a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/Contents.json +++ b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "ethereumBadgeDark-1.png", + "filename" : "ethereumBadgeDark.png", "idiom" : "universal", "scale" : "1x" }, diff --git a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark-1.png b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark-1.png deleted file mode 100644 index f612970c6b4..00000000000 Binary files a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark-1.png and /dev/null differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark.png b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark.png new file mode 100644 index 00000000000..e889ca02d99 Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@2x.png b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@2x.png index 4776b2c8ff8..bdb47515839 100644 Binary files a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@2x.png and b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@2x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@3x.png b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@3x.png index 5a44b01db81..d91696eb022 100644 Binary files a/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@3x.png and b/ios/Images.xcassets/badges/ethereumBadgeDark.imageset/ethereumBadgeDark@3x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/Contents.json b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/Contents.json new file mode 100644 index 00000000000..2ef9ec19944 --- /dev/null +++ b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ethereumBadgeLarge.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ethereumBadgeLarge@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ethereumBadgeLarge@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge.png b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge.png new file mode 100644 index 00000000000..2c72c8d698e Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge@2x.png b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge@2x.png new file mode 100644 index 00000000000..d8ba3c4fa41 Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge@2x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge@3x.png b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge@3x.png new file mode 100644 index 00000000000..74bb43b64f3 Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeLarge.imageset/ethereumBadgeLarge@3x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/Contents.json b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/Contents.json new file mode 100644 index 00000000000..45ba6d5cb52 --- /dev/null +++ b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ethereumBadgeLargeDark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ethereumBadgeLargeDark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ethereumBadgeLargeDark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark.png b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark.png new file mode 100644 index 00000000000..fd71fab44d4 Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark@2x.png b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark@2x.png new file mode 100644 index 00000000000..d1170b13f33 Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark@2x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark@3x.png b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark@3x.png new file mode 100644 index 00000000000..3b1c00facca Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeLargeDark.imageset/ethereumBadgeLargeDark@3x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/Contents.json b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/Contents.json new file mode 100644 index 00000000000..05efea382ea --- /dev/null +++ b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ethereumBadgeNoShadow.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ethereumBadgeNoShadow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ethereumBadgeNoShadow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow.png b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow.png new file mode 100644 index 00000000000..a41cc67b35a Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow@2x.png b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow@2x.png new file mode 100644 index 00000000000..3bcb9df909b Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow@2x.png differ diff --git a/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow@3x.png b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow@3x.png new file mode 100644 index 00000000000..d8365c7bf33 Binary files /dev/null and b/ios/Images.xcassets/badges/ethereumBadgeNoShadow.imageset/ethereumBadgeNoShadow@3x.png differ diff --git a/ios/Images.xcassets/badges/ink.imageset/Contents.json b/ios/Images.xcassets/badges/ink.imageset/Contents.json new file mode 100644 index 00000000000..5dc9f51ab33 --- /dev/null +++ b/ios/Images.xcassets/badges/ink.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ink.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ink@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ink@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/ink.imageset/ink.png b/ios/Images.xcassets/badges/ink.imageset/ink.png new file mode 100644 index 00000000000..f334bf407de Binary files /dev/null and b/ios/Images.xcassets/badges/ink.imageset/ink.png differ diff --git a/ios/Images.xcassets/badges/ink.imageset/ink@2x.png b/ios/Images.xcassets/badges/ink.imageset/ink@2x.png new file mode 100644 index 00000000000..44b4fa21fd1 Binary files /dev/null and b/ios/Images.xcassets/badges/ink.imageset/ink@2x.png differ diff --git a/ios/Images.xcassets/badges/ink.imageset/ink@3x.png b/ios/Images.xcassets/badges/ink.imageset/ink@3x.png new file mode 100644 index 00000000000..1c79e356b17 Binary files /dev/null and b/ios/Images.xcassets/badges/ink.imageset/ink@3x.png differ diff --git a/ios/Images.xcassets/badges/inkBadge.imageset/Contents.json b/ios/Images.xcassets/badges/inkBadge.imageset/Contents.json new file mode 100644 index 00000000000..3c57728eb0a --- /dev/null +++ b/ios/Images.xcassets/badges/inkBadge.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "inkBadge.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "inkBadge@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "inkBadge@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge.png b/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge.png new file mode 100644 index 00000000000..a3089636e54 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge.png differ diff --git a/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge@2x.png b/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge@2x.png new file mode 100644 index 00000000000..e4705d265a0 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge@2x.png differ diff --git a/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge@3x.png b/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge@3x.png new file mode 100644 index 00000000000..2a4937885c2 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadge.imageset/inkBadge@3x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeDark.imageset/Contents.json b/ios/Images.xcassets/badges/inkBadgeDark.imageset/Contents.json new file mode 100644 index 00000000000..25ef3960abd --- /dev/null +++ b/ios/Images.xcassets/badges/inkBadgeDark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "inkBadgeDark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "inkBadgeDark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "inkBadgeDark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark.png b/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark.png new file mode 100644 index 00000000000..68cd1fce628 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark@2x.png b/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark@2x.png new file mode 100644 index 00000000000..26ed12a11d4 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark@2x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark@3x.png b/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark@3x.png new file mode 100644 index 00000000000..70ff6b9dcb9 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeDark.imageset/inkBadgeDark@3x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeLarge.imageset/Contents.json b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/Contents.json new file mode 100644 index 00000000000..7438c2f684b --- /dev/null +++ b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "inkBadgeLarge.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "inkBadgeLarge@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "inkBadgeLarge@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge.png b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge.png new file mode 100644 index 00000000000..196dac3ddbe Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge@2x.png b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge@2x.png new file mode 100644 index 00000000000..1a67fdd1416 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge@2x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge@3x.png b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge@3x.png new file mode 100644 index 00000000000..b9daa7524b8 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeLarge.imageset/inkBadgeLarge@3x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/Contents.json b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/Contents.json new file mode 100644 index 00000000000..61c71a9c277 --- /dev/null +++ b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "inkBadgeLargeDark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "inkBadgeLargeDark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "inkBadgeLargeDark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark.png b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark.png new file mode 100644 index 00000000000..f10c9b647e0 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark@2x.png b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark@2x.png new file mode 100644 index 00000000000..9f11ef214f8 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark@2x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark@3x.png b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark@3x.png new file mode 100644 index 00000000000..f17fdb567a0 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeLargeDark.imageset/inkBadgeLargeDark@3x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/Contents.json b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/Contents.json new file mode 100644 index 00000000000..b8c02a36d51 --- /dev/null +++ b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "inkBadgeNoShadow.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "inkBadgeNoShadow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "inkBadgeNoShadow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow.png b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow.png new file mode 100644 index 00000000000..7bf5a6dffca Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow@2x.png b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow@2x.png new file mode 100644 index 00000000000..f41b166d389 Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow@2x.png differ diff --git a/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow@3x.png b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow@3x.png new file mode 100644 index 00000000000..bcbbcd0679d Binary files /dev/null and b/ios/Images.xcassets/badges/inkBadgeNoShadow.imageset/inkBadgeNoShadow@3x.png differ diff --git a/ios/Podfile.lock b/ios/Podfile.lock index abd321b5989..c32df149935 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2597,7 +2597,7 @@ SPEC CHECKSUMS: ToolTipMenu: 8ac61aded0fbc4acfe7e84a7d0c9479d15a9a382 TurboHaptics: 6381613d33ab97aeb30d9b15c3df94dc616a25e4 VisionCamera: 2af28201c3de77245f8c58b7a5274d5979df70df - Yoga: 88480008ccacea6301ff7bf58726e27a72931c8d + Yoga: 04f1db30bb810187397fa4c37dd1868a27af229c PODFILE CHECKSUM: 98c3fc206d7041ac7388693bb0753109d1884b57 diff --git a/ios/Rainbow.xcodeproj/project.pbxproj b/ios/Rainbow.xcodeproj/project.pbxproj index 9677b7cdd02..b1df86d0d36 100644 --- a/ios/Rainbow.xcodeproj/project.pbxproj +++ b/ios/Rainbow.xcodeproj/project.pbxproj @@ -9,10 +9,13 @@ /* Begin PBXBuildFile section */ 0299CE7B2886202800B5C7E7 /* NotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 0299CE7A2886202800B5C7E7 /* NotificationService.m */; }; 0299CE7F2886202800B5C7E7 /* ImageNotification.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 0299CE772886202800B5C7E7 /* ImageNotification.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 095ACD8141ED313410FB59B1 /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64F677089EAFF936BCD4BDC1 /* libPods-Rainbow.a */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 152643472B9AD97E004AC9AA /* InjectedJSBundle.js in Resources */ = {isa = PBXBuildFile; fileRef = 152643462B9AD97E004AC9AA /* InjectedJSBundle.js */; }; + 152A3A6B2D0BD28E00E70431 /* redacted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 152A3A692D0BD28E00E70431 /* redacted@2x.png */; }; + 152A3A6C2D0BD28E00E70431 /* redacted@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 152A3A6A2D0BD28E00E70431 /* redacted@3x.png */; }; 15C398812880EDFF006033AC /* og@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 15C3987D2880EDFF006033AC /* og@3x.png */; }; 15C398832880EDFF006033AC /* og@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 15C3987F2880EDFF006033AC /* og@2x.png */; }; 15CF49BC2889AF7C005F92C9 /* optimism@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 15CF49BA2889AF7C005F92C9 /* optimism@3x.png */; }; @@ -25,8 +28,6 @@ 15E531D5242B28EF00797B89 /* UIImageViewWithPersistentAnimations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15E531D4242B28EF00797B89 /* UIImageViewWithPersistentAnimations.swift */; }; 15E531DA242DAB7100797B89 /* NotificationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 15E531D9242DAB7100797B89 /* NotificationManager.m */; }; 24979E8920F84250007EB0DA /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 24979E7720F84004007EB0DA /* GoogleService-Info.plist */; }; - 2D28BB8F1ECF8D127306A3F1 /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 556FE6D2BA19BF19B2185138 /* libPods-Rainbow.a */; }; - 35F6F98CBC0BF1DA6049CF57 /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF5C675494B8453FBFF6274D /* libPods-ImageNotification.a */; }; 4D098C2F2811A9A5006A801A /* RNStartTime.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D098C2E2811A9A5006A801A /* RNStartTime.m */; }; 6630540924A38A1900E5B030 /* RainbowText.m in Sources */ = {isa = PBXBuildFile; fileRef = 6630540824A38A1900E5B030 /* RainbowText.m */; }; 6655FFB425BB2B0700642961 /* ThemeModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 6655FFB325BB2B0700642961 /* ThemeModule.m */; }; @@ -35,7 +36,7 @@ 66A1FEB624AB641100C3F539 /* RNCMScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 66A1FEB324AB641100C3F539 /* RNCMScreen.m */; }; 66A1FEBC24ACBBE600C3F539 /* RNCMPortal.m in Sources */ = {isa = PBXBuildFile; fileRef = 66A1FEBB24ACBBE600C3F539 /* RNCMPortal.m */; }; 66A28EB024CAF1B500410A88 /* TestFlight.m in Sources */ = {isa = PBXBuildFile; fileRef = 66A28EAF24CAF1B500410A88 /* TestFlight.m */; }; - 722CA40E2535AB7E254A42CF /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AEA6AA218AB3145D55FC87F /* libPods-SelectTokenIntent.a */; }; + 799153680FF5F26ADB27510B /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EFEE50A682DA6A72709EDA6A /* libPods-SelectTokenIntent.a */; }; A4277D9F23CBD1910042BAF4 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4277D9E23CBD1910042BAF4 /* Extensions.swift */; }; A4277DA323CFE85F0042BAF4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4277DA223CFE85F0042BAF4 /* Theme.swift */; }; A4D04BA923D12F99008C1DEC /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4D04BA823D12F99008C1DEC /* Button.swift */; }; @@ -48,7 +49,6 @@ AA6228F124272F510078BDAA /* SF-Pro-Rounded-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = AA6228ED24272B200078BDAA /* SF-Pro-Rounded-Medium.otf */; }; AA6228F224272F510078BDAA /* SF-Pro-Rounded-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = AA6228EE24272B200078BDAA /* SF-Pro-Rounded-Regular.otf */; }; AA6228F324272F510078BDAA /* SF-Pro-Rounded-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = AA6228EA24272B200078BDAA /* SF-Pro-Rounded-Semibold.otf */; }; - B1966F3C5FD8C13025CC777F /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D4CACE48DAEED3BC05B8AE6 /* libPods-PriceWidgetExtension.a */; }; B50C9AEB2A9D18DC00EB0019 /* adworld@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = B50C9AE92A9D18DC00EB0019 /* adworld@3x.png */; }; B50C9AEC2A9D18DC00EB0019 /* adworld@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B50C9AEA2A9D18DC00EB0019 /* adworld@2x.png */; }; B52242E628B1B11F0024D19D /* smol@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B52242E428B1B11F0024D19D /* smol@2x.png */; }; @@ -130,6 +130,7 @@ C1EB01302731B68400830E70 /* TokenDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EB012E2731B68400830E70 /* TokenDetails.swift */; }; C1EB01312731B68400830E70 /* TokenDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EB012E2731B68400830E70 /* TokenDetails.swift */; }; C72F456C99A646399192517D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 98AED33BAB4247CEBEF8464D /* libz.tbd */; }; + C94C08F8295B4F0D2373AAC4 /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 07DD828449891D462DBF02F3 /* libPods-ImageNotification.a */; }; C97EAD8D2BD6C6DF00322D53 /* RCTDeviceUUID.m in Sources */ = {isa = PBXBuildFile; fileRef = C97EAD8B2BD6C6DF00322D53 /* RCTDeviceUUID.m */; }; C9B378A22C5159880085E5D0 /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9B378A12C5159880085E5D0 /* UniformTypeIdentifiers.framework */; }; C9B378A52C5159880085E5D0 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C9B378A42C5159880085E5D0 /* Media.xcassets */; }; @@ -139,6 +140,7 @@ C9B378BB2C515A860085E5D0 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9B378BA2C515A860085E5D0 /* ShareViewController.swift */; }; C9B378BE2C515A860085E5D0 /* Base in Resources */ = {isa = PBXBuildFile; fileRef = C9B378BD2C515A860085E5D0 /* Base */; }; C9B378C22C515A860085E5D0 /* ShareWithRainbow.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C9B378B82C515A860085E5D0 /* ShareWithRainbow.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + D598564C424CC90F0453D806 /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C5ACD971838FD2125A011F4C /* libPods-PriceWidgetExtension.a */; }; E8D2945956C9619768A8D361 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C92E589571C27FFE89AB10 /* ExpoModulesProvider.swift */; }; ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; /* End PBXBuildFile section */ @@ -208,6 +210,8 @@ 0299CE7A2886202800B5C7E7 /* NotificationService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationService.m; sourceTree = ""; }; 0299CE7C2886202800B5C7E7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 0299CE852886246C00B5C7E7 /* libFirebaseCore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libFirebaseCore.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 07DD828449891D462DBF02F3 /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D80D26AF6184BE51600BCCA /* Pods-SelectTokenIntent.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.release.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.release.xcconfig"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* Rainbow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Rainbow.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Rainbow/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Rainbow/AppDelegate.mm; sourceTree = ""; }; @@ -215,6 +219,8 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Rainbow/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Rainbow/main.m; sourceTree = ""; }; 152643462B9AD97E004AC9AA /* InjectedJSBundle.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = InjectedJSBundle.js; path = ../InjectedJSBundle.js; sourceTree = ""; }; + 152A3A692D0BD28E00E70431 /* redacted@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "redacted@2x.png"; sourceTree = ""; }; + 152A3A6A2D0BD28E00E70431 /* redacted@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "redacted@3x.png"; sourceTree = ""; }; 157155032418733F009B698B /* RainbowRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RainbowRelease.entitlements; path = Rainbow/RainbowRelease.entitlements; sourceTree = ""; }; 157155042418734C009B698B /* RainbowDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RainbowDebug.entitlements; path = Rainbow/RainbowDebug.entitlements; sourceTree = ""; }; 15C3987D2880EDFF006033AC /* og@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "og@3x.png"; sourceTree = ""; }; @@ -233,6 +239,7 @@ 15E531D4242B28EF00797B89 /* UIImageViewWithPersistentAnimations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageViewWithPersistentAnimations.swift; sourceTree = ""; }; 15E531D8242DAB7100797B89 /* NotificationManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationManager.h; sourceTree = ""; }; 15E531D9242DAB7100797B89 /* NotificationManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationManager.m; sourceTree = ""; }; + 172E89B6BCF219DEA2DC70DD /* Pods-SelectTokenIntent.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.staging.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.staging.xcconfig"; sourceTree = ""; }; 24979E3620F84003007EB0DA /* Protobuf.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Protobuf.framework; path = Frameworks/Protobuf.framework; sourceTree = ""; }; 24979E7420F84004007EB0DA /* FirebaseAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseAnalytics.framework; path = Frameworks/FirebaseAnalytics.framework; sourceTree = ""; }; 24979E7520F84004007EB0DA /* FirebaseCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseCore.framework; path = Frameworks/FirebaseCore.framework; sourceTree = ""; }; @@ -245,19 +252,14 @@ 24979E7C20F84004007EB0DA /* FirebaseCoreDiagnostics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseCoreDiagnostics.framework; path = Frameworks/FirebaseCoreDiagnostics.framework; sourceTree = ""; }; 24979E7D20F84005007EB0DA /* module.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = Frameworks/module.modulemap; sourceTree = ""; }; 24979E7E20F84005007EB0DA /* nanopb.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = nanopb.framework; path = Frameworks/nanopb.framework; sourceTree = ""; }; - 28A977B84F9AEE8B8145111F /* Pods-SelectTokenIntent.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.staging.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.staging.xcconfig"; sourceTree = ""; }; - 37CD6BE2DF575F4B683F5BD7 /* Pods-ImageNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.debug.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"; sourceTree = ""; }; 3C379D5D20FD1F92009AF81F /* Rainbow.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Rainbow.entitlements; path = Rainbow/Rainbow.entitlements; sourceTree = ""; }; 3CBE29CB2381E43800BE05AC /* Rainbow-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Rainbow-Bridging-Header.h"; sourceTree = ""; }; 43C92E589571C27FFE89AB10 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Rainbow/ExpoModulesProvider.swift"; sourceTree = ""; }; - 497293F5BEE93B0A096E5C56 /* Pods-ImageNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.release.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"; sourceTree = ""; }; - 4CA6FC1DE5EB5ED82E7E1F54 /* Pods-Rainbow.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.localrelease.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.localrelease.xcconfig"; sourceTree = ""; }; + 490DB626157EF1282B571D3A /* Pods-ImageNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.release.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"; sourceTree = ""; }; 4D098C2D2811A979006A801A /* RNStartTime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNStartTime.h; sourceTree = ""; }; 4D098C2E2811A9A5006A801A /* RNStartTime.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNStartTime.m; sourceTree = ""; }; - 4F41B555E9F2BDC11F67C4B5 /* Pods-PriceWidgetExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.debug.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.debug.xcconfig"; sourceTree = ""; }; - 556FE6D2BA19BF19B2185138 /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 5AEA6AA218AB3145D55FC87F /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 5D4CACE48DAEED3BC05B8AE6 /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 62E9A228E49783C3BFA4B352 /* Pods-SelectTokenIntent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.debug.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.debug.xcconfig"; sourceTree = ""; }; + 64F677089EAFF936BCD4BDC1 /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6630540824A38A1900E5B030 /* RainbowText.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RainbowText.m; sourceTree = ""; }; 6635730524939991006ACFA6 /* SafeStoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SafeStoreReview.m; sourceTree = ""; }; 664612EC2748489B00B43F5A /* PriceWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PriceWidgetExtension.entitlements; sourceTree = ""; }; @@ -273,18 +275,17 @@ 66A1FEBB24ACBBE600C3F539 /* RNCMPortal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RNCMPortal.m; path = "../src/react-native-cool-modals/ios/RNCMPortal.m"; sourceTree = ""; }; 66A28EAF24CAF1B500410A88 /* TestFlight.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestFlight.m; sourceTree = ""; }; 66A29CCA2511074500481F4A /* ReaHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaHeader.h; sourceTree = SOURCE_ROOT; }; - 732C3F4923CF572688475536 /* Pods-SelectTokenIntent.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.localrelease.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.localrelease.xcconfig"; sourceTree = ""; }; - 86D738C44C2C571736190D2D /* Pods-Rainbow.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.staging.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.staging.xcconfig"; sourceTree = ""; }; - 9092BB627D60D1C7E65EAD39 /* Pods-PriceWidgetExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.release.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.release.xcconfig"; sourceTree = ""; }; - 928D80AC880326A5C93E8682 /* Pods-SelectTokenIntent.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.release.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.release.xcconfig"; sourceTree = ""; }; - 9787D6F106B2967888575DF6 /* Pods-SelectTokenIntent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.debug.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.debug.xcconfig"; sourceTree = ""; }; + 67A25917DD5232F64034E3B4 /* Pods-Rainbow.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.staging.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.staging.xcconfig"; sourceTree = ""; }; + 7DE47ABFDF7E323CDD99B363 /* Pods-PriceWidgetExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.debug.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.debug.xcconfig"; sourceTree = ""; }; + 91EBD5E70DFF3982B3402D48 /* Pods-SelectTokenIntent.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SelectTokenIntent.localrelease.xcconfig"; path = "Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent.localrelease.xcconfig"; sourceTree = ""; }; 98AED33BAB4247CEBEF8464D /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 9CA7949CEE60CCE0017734F3 /* Pods-PriceWidgetExtension.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.staging.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.staging.xcconfig"; sourceTree = ""; }; 9DEADFA4826D4D0BAA950D21 /* libRNFIRMessaging.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFIRMessaging.a; sourceTree = ""; }; - A019C130957DC7A038F8059E /* Pods-Rainbow.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.debug.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.debug.xcconfig"; sourceTree = ""; }; A4277D9E23CBD1910042BAF4 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; A4277DA223CFE85F0042BAF4 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; A4D04BA823D12F99008C1DEC /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; A4D04BAB23D12FD5008C1DEC /* ButtonManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ButtonManager.m; sourceTree = ""; }; + A6A70072FC6F5FE7A65B17B3 /* Pods-Rainbow.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.debug.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.debug.xcconfig"; sourceTree = ""; }; AA0B1CB82B00C5E100EAF77D /* SF-Mono-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SF-Mono-Semibold.otf"; path = "../src/assets/fonts/SF-Mono-Semibold.otf"; sourceTree = ""; }; AA0B1CB92B00C5E100EAF77D /* SF-Mono-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SF-Mono-Bold.otf"; path = "../src/assets/fonts/SF-Mono-Bold.otf"; sourceTree = ""; }; AA0B1CBA2B00C5E100EAF77D /* SF-Pro-Rounded-Black.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SF-Pro-Rounded-Black.otf"; path = "../src/assets/fonts/SF-Pro-Rounded-Black.otf"; sourceTree = ""; }; @@ -295,7 +296,6 @@ AA6228EE24272B200078BDAA /* SF-Pro-Rounded-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SF-Pro-Rounded-Regular.otf"; path = "../src/assets/fonts/SF-Pro-Rounded-Regular.otf"; sourceTree = ""; }; AAA0EF342BF5A4AD00A19A53 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; B0C692B061D7430D8194DC98 /* ToolTipMenuTests.xctest */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = ToolTipMenuTests.xctest; sourceTree = ""; }; - B3A1BB88E4834A09CEE6A23C /* Pods-ImageNotification.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.staging.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.staging.xcconfig"; sourceTree = ""; }; B50C9AE92A9D18DC00EB0019 /* adworld@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "adworld@3x.png"; sourceTree = ""; }; B50C9AEA2A9D18DC00EB0019 /* adworld@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "adworld@2x.png"; sourceTree = ""; }; B52242E428B1B11F0024D19D /* smol@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "smol@2x.png"; sourceTree = ""; }; @@ -316,7 +316,7 @@ B5CE8FFD29A5758100EB1EFA /* pooly@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pooly@3x.png"; sourceTree = ""; }; B5D7F2EE29E8D41D003D6A54 /* finiliar@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "finiliar@3x.png"; sourceTree = ""; }; B5D7F2EF29E8D41E003D6A54 /* finiliar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "finiliar@2x.png"; sourceTree = ""; }; - BF5C675494B8453FBFF6274D /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + BF858DCD121F0A234F7394E8 /* Pods-ImageNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.debug.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"; sourceTree = ""; }; C04D10EF25AFC8C1003BEF7A /* Extras.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = Extras.json; sourceTree = ""; }; C11640E7274DC10B00C9120A /* UIColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = ""; }; C1272389274EBBB6006AC743 /* CurrencyDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyDetails.swift; sourceTree = ""; }; @@ -344,6 +344,7 @@ C1C61A81272CBDA100E5C0B3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; C1C61A902731A05700E5C0B3 /* RainbowTokenList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RainbowTokenList.swift; sourceTree = ""; }; C1EB012E2731B68400830E70 /* TokenDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenDetails.swift; sourceTree = ""; }; + C5ACD971838FD2125A011F4C /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; C97EAD8B2BD6C6DF00322D53 /* RCTDeviceUUID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTDeviceUUID.m; sourceTree = ""; }; C97EAD8C2BD6C6DF00322D53 /* RCTDeviceUUID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTDeviceUUID.h; sourceTree = ""; }; C9B378A02C5159880085E5D0 /* OpenInRainbow.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OpenInRainbow.appex; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -356,13 +357,16 @@ C9B378BA2C515A860085E5D0 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; }; C9B378BD2C515A860085E5D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; C9B378BF2C515A860085E5D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C9E717AA3432239165B5A6F5 /* Pods-PriceWidgetExtension.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.localrelease.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.localrelease.xcconfig"; sourceTree = ""; }; + CB3296A0DF7B72C16106658C /* Pods-Rainbow.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.release.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.release.xcconfig"; sourceTree = ""; }; D755E71324B04FEE9C691D14 /* libRNFirebase.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFirebase.a; sourceTree = ""; }; - D8909C8CDF72D43F8537B004 /* Pods-PriceWidgetExtension.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.staging.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.staging.xcconfig"; sourceTree = ""; }; - DE432693F1E564C16827671F /* Pods-Rainbow.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.release.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.release.xcconfig"; sourceTree = ""; }; + ECCF54D1E19E399B6E17A4A2 /* Pods-ImageNotification.staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.staging.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.staging.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - F265EA2D4A622F9E493BCA9A /* Pods-ImageNotification.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.localrelease.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.localrelease.xcconfig"; sourceTree = ""; }; - FC4825CCDBA2CACA5A469C41 /* Pods-PriceWidgetExtension.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.localrelease.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.localrelease.xcconfig"; sourceTree = ""; }; + EDEA45847B1CEC3922B21246 /* Pods-Rainbow.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Rainbow.localrelease.xcconfig"; path = "Target Support Files/Pods-Rainbow/Pods-Rainbow.localrelease.xcconfig"; sourceTree = ""; }; + EFEE50A682DA6A72709EDA6A /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + F0D118BB50B13F435AE36548 /* Pods-PriceWidgetExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PriceWidgetExtension.release.xcconfig"; path = "Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension.release.xcconfig"; sourceTree = ""; }; + FF9C48D2954348597BE2BBB4 /* Pods-ImageNotification.localrelease.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.localrelease.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.localrelease.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -370,7 +374,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 35F6F98CBC0BF1DA6049CF57 /* libPods-ImageNotification.a in Frameworks */, + C94C08F8295B4F0D2373AAC4 /* libPods-ImageNotification.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -380,7 +384,7 @@ files = ( ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, C72F456C99A646399192517D /* libz.tbd in Frameworks */, - 2D28BB8F1ECF8D127306A3F1 /* libPods-Rainbow.a in Frameworks */, + 095ACD8141ED313410FB59B1 /* libPods-Rainbow.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -390,7 +394,7 @@ files = ( C16DCF60272BA6EF00FF5C78 /* SwiftUI.framework in Frameworks */, C16DCF5E272BA6EF00FF5C78 /* WidgetKit.framework in Frameworks */, - B1966F3C5FD8C13025CC777F /* libPods-PriceWidgetExtension.a in Frameworks */, + D598564C424CC90F0453D806 /* libPods-PriceWidgetExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -399,7 +403,7 @@ buildActionMask = 2147483647; files = ( C16DCF81272BAB9500FF5C78 /* Intents.framework in Frameworks */, - 722CA40E2535AB7E254A42CF /* libPods-SelectTokenIntent.a in Frameworks */, + 799153680FF5F26ADB27510B /* libPods-SelectTokenIntent.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -500,6 +504,8 @@ B54C1D0D29358945007560D9 /* golddoge@2x.png */, B54C1D0C29358945007560D9 /* golddoge@3x.png */, B54C1D0F29358946007560D9 /* raindoge@2x.png */, + 152A3A692D0BD28E00E70431 /* redacted@2x.png */, + 152A3A6A2D0BD28E00E70431 /* redacted@3x.png */, B54C1D0E29358946007560D9 /* raindoge@3x.png */, B5CC6D372A78732A0037D5A3 /* poolboy@2x.png */, B54C1D152935A54F007560D9 /* zora@2x.png */, @@ -576,10 +582,10 @@ C16DCF80272BAB9500FF5C78 /* Intents.framework */, C16DCF8B272BAB9600FF5C78 /* IntentsUI.framework */, C9B378A12C5159880085E5D0 /* UniformTypeIdentifiers.framework */, - BF5C675494B8453FBFF6274D /* libPods-ImageNotification.a */, - 5D4CACE48DAEED3BC05B8AE6 /* libPods-PriceWidgetExtension.a */, - 556FE6D2BA19BF19B2185138 /* libPods-Rainbow.a */, - 5AEA6AA218AB3145D55FC87F /* libPods-SelectTokenIntent.a */, + 07DD828449891D462DBF02F3 /* libPods-ImageNotification.a */, + C5ACD971838FD2125A011F4C /* libPods-PriceWidgetExtension.a */, + 64F677089EAFF936BCD4BDC1 /* libPods-Rainbow.a */, + EFEE50A682DA6A72709EDA6A /* libPods-SelectTokenIntent.a */, ); name = Frameworks; sourceTree = ""; @@ -743,22 +749,22 @@ C640359C0E6575CE0A7ECD73 /* Pods */ = { isa = PBXGroup; children = ( - 37CD6BE2DF575F4B683F5BD7 /* Pods-ImageNotification.debug.xcconfig */, - 497293F5BEE93B0A096E5C56 /* Pods-ImageNotification.release.xcconfig */, - F265EA2D4A622F9E493BCA9A /* Pods-ImageNotification.localrelease.xcconfig */, - B3A1BB88E4834A09CEE6A23C /* Pods-ImageNotification.staging.xcconfig */, - 4F41B555E9F2BDC11F67C4B5 /* Pods-PriceWidgetExtension.debug.xcconfig */, - 9092BB627D60D1C7E65EAD39 /* Pods-PriceWidgetExtension.release.xcconfig */, - FC4825CCDBA2CACA5A469C41 /* Pods-PriceWidgetExtension.localrelease.xcconfig */, - D8909C8CDF72D43F8537B004 /* Pods-PriceWidgetExtension.staging.xcconfig */, - A019C130957DC7A038F8059E /* Pods-Rainbow.debug.xcconfig */, - DE432693F1E564C16827671F /* Pods-Rainbow.release.xcconfig */, - 4CA6FC1DE5EB5ED82E7E1F54 /* Pods-Rainbow.localrelease.xcconfig */, - 86D738C44C2C571736190D2D /* Pods-Rainbow.staging.xcconfig */, - 9787D6F106B2967888575DF6 /* Pods-SelectTokenIntent.debug.xcconfig */, - 928D80AC880326A5C93E8682 /* Pods-SelectTokenIntent.release.xcconfig */, - 732C3F4923CF572688475536 /* Pods-SelectTokenIntent.localrelease.xcconfig */, - 28A977B84F9AEE8B8145111F /* Pods-SelectTokenIntent.staging.xcconfig */, + BF858DCD121F0A234F7394E8 /* Pods-ImageNotification.debug.xcconfig */, + 490DB626157EF1282B571D3A /* Pods-ImageNotification.release.xcconfig */, + FF9C48D2954348597BE2BBB4 /* Pods-ImageNotification.localrelease.xcconfig */, + ECCF54D1E19E399B6E17A4A2 /* Pods-ImageNotification.staging.xcconfig */, + 7DE47ABFDF7E323CDD99B363 /* Pods-PriceWidgetExtension.debug.xcconfig */, + F0D118BB50B13F435AE36548 /* Pods-PriceWidgetExtension.release.xcconfig */, + C9E717AA3432239165B5A6F5 /* Pods-PriceWidgetExtension.localrelease.xcconfig */, + 9CA7949CEE60CCE0017734F3 /* Pods-PriceWidgetExtension.staging.xcconfig */, + A6A70072FC6F5FE7A65B17B3 /* Pods-Rainbow.debug.xcconfig */, + CB3296A0DF7B72C16106658C /* Pods-Rainbow.release.xcconfig */, + EDEA45847B1CEC3922B21246 /* Pods-Rainbow.localrelease.xcconfig */, + 67A25917DD5232F64034E3B4 /* Pods-Rainbow.staging.xcconfig */, + 62E9A228E49783C3BFA4B352 /* Pods-SelectTokenIntent.debug.xcconfig */, + 0D80D26AF6184BE51600BCCA /* Pods-SelectTokenIntent.release.xcconfig */, + 91EBD5E70DFF3982B3402D48 /* Pods-SelectTokenIntent.localrelease.xcconfig */, + 172E89B6BCF219DEA2DC70DD /* Pods-SelectTokenIntent.staging.xcconfig */, ); path = Pods; sourceTree = ""; @@ -814,11 +820,11 @@ isa = PBXNativeTarget; buildConfigurationList = 0299CE842886202800B5C7E7 /* Build configuration list for PBXNativeTarget "ImageNotification" */; buildPhases = ( - A335CA8DADB34A6C700490B1 /* [CP] Check Pods Manifest.lock */, + 4869B0361119ED20B818AC14 /* [CP] Check Pods Manifest.lock */, 0299CE732886202800B5C7E7 /* Sources */, 0299CE742886202800B5C7E7 /* Frameworks */, 0299CE752886202800B5C7E7 /* Resources */, - D0878465338E9D74C411A233 /* [CP] Copy Pods Resources */, + 2ABC66B67D1B820C5996A2E4 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -833,16 +839,16 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Rainbow" */; buildPhases = ( - CA41397D34D37C4E04486001 /* [CP] Check Pods Manifest.lock */, + 1DBB0A76247227F0447A6110 /* [CP] Check Pods Manifest.lock */, AEAD56A917FF4051986EE3E6 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 668ADB3225A4E3A40050859D /* Embed App Extensions */, - 4861C25B22213AF9D7850D7C /* [CP] Embed Pods Frameworks */, - 27FA39EAC393B792409D4238 /* [CP] Copy Pods Resources */, - 0BB7B26C270F1595DD2B55CA /* [CP-User] [RNFB] Core Configuration */, + 814FB0AF3D8143D640801344 /* [CP] Embed Pods Frameworks */, + 494F25E933A363769841462C /* [CP] Copy Pods Resources */, + D82F9EF543B5A9AD6D9F7FDC /* [CP-User] [RNFB] Core Configuration */, ); buildRules = ( ); @@ -862,11 +868,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF6E272BA6F100FF5C78 /* Build configuration list for PBXNativeTarget "PriceWidgetExtension" */; buildPhases = ( - 42E8FB19BDC53811720095AA /* [CP] Check Pods Manifest.lock */, + 75BD781A16B7D088E1E59E47 /* [CP] Check Pods Manifest.lock */, C16DCF58272BA6EF00FF5C78 /* Sources */, C16DCF59272BA6EF00FF5C78 /* Frameworks */, C16DCF5A272BA6EF00FF5C78 /* Resources */, - CDE2538FAA43DCC2AC2E0DD2 /* [CP] Copy Pods Resources */, + 0D76B7992410B84417343930 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -881,11 +887,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF9F272BAB9600FF5C78 /* Build configuration list for PBXNativeTarget "SelectTokenIntent" */; buildPhases = ( - 44B37C36592E1F9E0233D347 /* [CP] Check Pods Manifest.lock */, + B2EE0E59E3BCF1282EB2726B /* [CP] Check Pods Manifest.lock */, C16DCF7B272BAB9500FF5C78 /* Sources */, C16DCF7C272BAB9500FF5C78 /* Frameworks */, C16DCF7D272BAB9500FF5C78 /* Resources */, - 4887D3B9132AE790C8FB5047 /* [CP] Copy Pods Resources */, + E2CDED5258A06C4C7E7AB328 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1013,6 +1019,8 @@ AA0B1CBD2B00C5E100EAF77D /* SF-Mono-Bold.otf in Resources */, 24979E8920F84250007EB0DA /* GoogleService-Info.plist in Resources */, B54C1D162935A54F007560D9 /* zora@3x.png in Resources */, + 152A3A6B2D0BD28E00E70431 /* redacted@2x.png in Resources */, + 152A3A6C2D0BD28E00E70431 /* redacted@3x.png in Resources */, B5CE8FFE29A5758100EB1EFA /* pooly@2x.png in Resources */, B5C070C72A4A387400D854BA /* zorb@2x.png in Resources */, B5CC6D382A78732A0037D5A3 /* poolboy@2x.png in Resources */, @@ -1104,26 +1112,13 @@ shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli')\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n"; showEnvVarsInLog = 0; }; - 0BB7B26C270F1595DD2B55CA /* [CP-User] [RNFB] Core Configuration */ = { + 0D76B7992410B84417343930 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", - ); - name = "[CP-User] [RNFB] Core Configuration"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; - }; - 27FA39EAC393B792409D4238 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh", + "${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", @@ -1134,19 +1129,6 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/RNImageCropPickerPrivacyInfo.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Rudder/Rudder.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/react-native-cameraroll/RNCameraRollPrivacyInfo.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -1160,26 +1142,13 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNImageCropPickerPrivacyInfo.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Rudder.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCameraRollPrivacyInfo.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 42E8FB19BDC53811720095AA /* [CP] Check Pods Manifest.lock */ = { + 1DBB0A76247227F0447A6110 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1194,60 +1163,80 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-PriceWidgetExtension-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Rainbow-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 44B37C36592E1F9E0233D347 /* [CP] Check Pods Manifest.lock */ = { + 2ABC66B67D1B820C5996A2E4 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ImageNotification/Pods-ImageNotification-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", ); + name = "[CP] Copy Pods Resources"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-SelectTokenIntent-checkManifestLockResult.txt", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseABTesting_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseRemoteConfig_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ImageNotification/Pods-ImageNotification-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 4861C25B22213AF9D7850D7C /* [CP] Embed Pods Frameworks */ = { + 4869B0361119ED20B818AC14 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + "$(DERIVED_FILE_DIR)/Pods-ImageNotification-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 4887D3B9132AE790C8FB5047 /* [CP] Copy Pods Resources */ = { + 494F25E933A363769841462C /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh", + "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", @@ -1258,6 +1247,19 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/RNImageCropPickerPrivacyInfo.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Rudder/Rudder.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/react-native-cameraroll/RNCameraRollPrivacyInfo.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -1271,13 +1273,26 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNImageCropPickerPrivacyInfo.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Rudder.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCameraRollPrivacyInfo.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh\"\n"; showEnvVarsInLog = 0; }; - A335CA8DADB34A6C700490B1 /* [CP] Check Pods Manifest.lock */ = { + 75BD781A16B7D088E1E59E47 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1292,13 +1307,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-ImageNotification-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-PriceWidgetExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 814FB0AF3D8143D640801344 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; AEAD56A917FF4051986EE3E6 /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -1318,7 +1351,7 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Rainbow/expo-configure-project.sh\"\n"; }; - CA41397D34D37C4E04486001 /* [CP] Check Pods Manifest.lock */ = { + B2EE0E59E3BCF1282EB2726B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1333,56 +1366,33 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Rainbow-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-SelectTokenIntent-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - CDE2538FAA43DCC2AC2E0DD2 /* [CP] Copy Pods Resources */ = { + D82F9EF543B5A9AD6D9F7FDC /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseABTesting_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseRemoteConfig_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", ); + name = "[CP-User] [RNFB] Core Configuration"; runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; }; - D0878465338E9D74C411A233 /* [CP] Copy Pods Resources */ = { + E2CDED5258A06C4C7E7AB328 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-ImageNotification/Pods-ImageNotification-resources.sh", + "${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", @@ -1393,7 +1403,6 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -1407,11 +1416,10 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ImageNotification/Pods-ImageNotification-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -1599,7 +1607,7 @@ /* Begin XCBuildConfiguration section */ 0299CE802886202800B5C7E7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 37CD6BE2DF575F4B683F5BD7 /* Pods-ImageNotification.debug.xcconfig */; + baseConfigurationReference = BF858DCD121F0A234F7394E8 /* Pods-ImageNotification.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1654,7 +1662,7 @@ }; 0299CE812886202800B5C7E7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 497293F5BEE93B0A096E5C56 /* Pods-ImageNotification.release.xcconfig */; + baseConfigurationReference = 490DB626157EF1282B571D3A /* Pods-ImageNotification.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1710,7 +1718,7 @@ }; 0299CE822886202800B5C7E7 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F265EA2D4A622F9E493BCA9A /* Pods-ImageNotification.localrelease.xcconfig */; + baseConfigurationReference = FF9C48D2954348597BE2BBB4 /* Pods-ImageNotification.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1763,7 +1771,7 @@ }; 0299CE832886202800B5C7E7 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B3A1BB88E4834A09CEE6A23C /* Pods-ImageNotification.staging.xcconfig */; + baseConfigurationReference = ECCF54D1E19E399B6E17A4A2 /* Pods-ImageNotification.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1816,7 +1824,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A019C130957DC7A038F8059E /* Pods-Rainbow.debug.xcconfig */; + baseConfigurationReference = A6A70072FC6F5FE7A65B17B3 /* Pods-Rainbow.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1875,7 +1883,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.49; + MARKETING_VERSION = 1.9.51; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -1897,7 +1905,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DE432693F1E564C16827671F /* Pods-Rainbow.release.xcconfig */; + baseConfigurationReference = CB3296A0DF7B72C16106658C /* Pods-Rainbow.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1943,7 +1951,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.49; + MARKETING_VERSION = 1.9.51; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -2021,7 +2029,7 @@ }; 2C6A799821127ED9003AFB37 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86D738C44C2C571736190D2D /* Pods-Rainbow.staging.xcconfig */; + baseConfigurationReference = 67A25917DD5232F64034E3B4 /* Pods-Rainbow.staging.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2064,7 +2072,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.49; + MARKETING_VERSION = 1.9.51; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -2141,7 +2149,7 @@ }; 2C87B79A2197FA1900682EC4 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4CA6FC1DE5EB5ED82E7E1F54 /* Pods-Rainbow.localrelease.xcconfig */; + baseConfigurationReference = EDEA45847B1CEC3922B21246 /* Pods-Rainbow.localrelease.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2184,7 +2192,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.49; + MARKETING_VERSION = 1.9.51; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -2318,7 +2326,7 @@ }; C16DCF6A272BA6F100FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4F41B555E9F2BDC11F67C4B5 /* Pods-PriceWidgetExtension.debug.xcconfig */; + baseConfigurationReference = 7DE47ABFDF7E323CDD99B363 /* Pods-PriceWidgetExtension.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2372,7 +2380,7 @@ }; C16DCF6B272BA6F100FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9092BB627D60D1C7E65EAD39 /* Pods-PriceWidgetExtension.release.xcconfig */; + baseConfigurationReference = F0D118BB50B13F435AE36548 /* Pods-PriceWidgetExtension.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2428,7 +2436,7 @@ }; C16DCF6C272BA6F100FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FC4825CCDBA2CACA5A469C41 /* Pods-PriceWidgetExtension.localrelease.xcconfig */; + baseConfigurationReference = C9E717AA3432239165B5A6F5 /* Pods-PriceWidgetExtension.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2481,7 +2489,7 @@ }; C16DCF6D272BA6F100FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D8909C8CDF72D43F8537B004 /* Pods-PriceWidgetExtension.staging.xcconfig */; + baseConfigurationReference = 9CA7949CEE60CCE0017734F3 /* Pods-PriceWidgetExtension.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2534,7 +2542,7 @@ }; C16DCFA0272BAB9600FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9787D6F106B2967888575DF6 /* Pods-SelectTokenIntent.debug.xcconfig */; + baseConfigurationReference = 62E9A228E49783C3BFA4B352 /* Pods-SelectTokenIntent.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2586,7 +2594,7 @@ }; C16DCFA1272BAB9600FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 928D80AC880326A5C93E8682 /* Pods-SelectTokenIntent.release.xcconfig */; + baseConfigurationReference = 0D80D26AF6184BE51600BCCA /* Pods-SelectTokenIntent.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2640,7 +2648,7 @@ }; C16DCFA2272BAB9600FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 732C3F4923CF572688475536 /* Pods-SelectTokenIntent.localrelease.xcconfig */; + baseConfigurationReference = 91EBD5E70DFF3982B3402D48 /* Pods-SelectTokenIntent.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2691,7 +2699,7 @@ }; C16DCFA3272BAB9600FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28A977B84F9AEE8B8145111F /* Pods-SelectTokenIntent.staging.xcconfig */; + baseConfigurationReference = 172E89B6BCF219DEA2DC70DD /* Pods-SelectTokenIntent.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; diff --git a/ios/Rainbow/Info.plist b/ios/Rainbow/Info.plist index 8273cab6e66..fc28d3604bf 100644 --- a/ios/Rainbow/Info.plist +++ b/ios/Rainbow/Info.plist @@ -131,6 +131,15 @@ UIPrerenderedIcon + redacted + + CFBundleIconFiles + + redacted + + UIPrerenderedIcon + + CFBundlePrimaryIcon diff --git a/package.json b/package.json index 20c652428f4..c7bd68d69cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Rainbow", - "version": "1.9.49-1", + "version": "1.9.51-1", "private": true, "scripts": { "setup": "yarn graphql-codegen:install && yarn ds:install && yarn allow-scripts && yarn graphql-codegen && yarn fetch:networks", @@ -108,7 +108,7 @@ "@notifee/react-native": "7.8.2", "@rainbow-me/provider": "0.1.1", "@rainbow-me/react-native-animated-number": "0.0.2", - "@rainbow-me/swaps": "0.28.0", + "@rainbow-me/swaps": "0.30.1", "@react-native-async-storage/async-storage": "1.23.1", "@react-native-camera-roll/camera-roll": "7.7.0", "@react-native-clipboard/clipboard": "1.13.2", @@ -309,7 +309,7 @@ "use-deep-compare": "1.1.0", "use-memo-one": "1.1.1", "util": "0.10.4", - "viem": "2.9.16", + "viem": "2.21.54", "vm-browserify": "0.0.4", "w2t": "3.0.2", "zeego": "1.10.0", diff --git a/scripts/add_network.sh b/scripts/add_network.sh new file mode 100755 index 00000000000..6750607038f --- /dev/null +++ b/scripts/add_network.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# Prompt for network details +read -p "Enter the network name (case sensitive): " networkName +read -p "Enter the chain ID (number): " chainId +read -p "Enter the light mode color (hex): " lightColor +read -p "Enter the dark mode color (hex): " darkColor + +# Create imagesets +mkdir -p "ios/Images.xcassets/badges/${networkName}.imageset" +mkdir -p "ios/Images.xcassets/badges/${networkName}Badge.imageset" +mkdir -p "ios/Images.xcassets/badges/${networkName}BadgeDark.imageset" +mkdir -p "ios/Images.xcassets/badges/${networkName}BadgeLarge.imageset" +mkdir -p "ios/Images.xcassets/badges/${networkName}BadgeLargeDark.imageset" +mkdir -p "ios/Images.xcassets/badges/${networkName}BadgeNoShadow.imageset" + +# Create Contents.json for each imageset +for suffix in "" "Badge" "BadgeDark" "BadgeLarge" "BadgeLargeDark" "BadgeNoShadow"; do + cat > "ios/Images.xcassets/badges/${networkName}${suffix}.imageset/Contents.json" << EOF +{ + "images" : [ + { + "filename" : "${networkName}${suffix}.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "${networkName}${suffix}@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "${networkName}${suffix}@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} +EOF +done + +# Update en_US.json +# Using perl for more precise JSON manipulation +perl -i -0pe 's/("explain":\s*{)/$1\n "'$networkName'": {\n "text": "",\n "title": "What'\''s '$networkName'?"\n },/m' src/languages/en_US.json + +# Update types.ts +# Add to Network enum +sed -i '' "/export enum Network {/a\\ + ${networkName} = '${networkName}', +" src/chains/types.ts + +# Add to ChainId enum +sed -i '' "/export enum ChainId {/a\\ + ${networkName} = ${chainId}, +" src/chains/types.ts + +# Update colors.ts for light mode - look for the first networkColors declaration +sed -i '' "/^ let networkColors = {/a\\ + [ChainId.${networkName}]: '${lightColor}', +" src/styles/colors.ts + +# Update colors.ts for dark mode - look specifically in the darkMode if block +sed -i '' "/if (darkMode) {/,/^ }/ { + /networkColors = {/a\\ + [ChainId.${networkName}]: '${darkColor}', +}" src/styles/colors.ts + +echo "Network ${networkName} has been added!" +echo "Note: You'll need to add the actual badge images to the imageset directories" +echo "Don't forget to run prettier to format the modified files" \ No newline at end of file diff --git a/src/__swaps__/screens/Swap/components/AnimatedChainImage.android.tsx b/src/__swaps__/screens/Swap/components/AnimatedChainImage.android.tsx index 19f39bac85c..fef6de976fd 100644 --- a/src/__swaps__/screens/Swap/components/AnimatedChainImage.android.tsx +++ b/src/__swaps__/screens/Swap/components/AnimatedChainImage.android.tsx @@ -10,8 +10,15 @@ const BlastBadge = require('@/assets/badges/blast.png'); const BscBadge = require('@/assets/badges/bsc.png'); const DegenBadge = require('@/assets/badges/degen.png'); const EthereumBadge = require('@/assets/badges/ethereum.png'); +// const GnosisBadge = require('@/assets/badges/gnosis.png'); +// const GravityBadge = require('@/assets/badges/gravity.png'); +const InkBadge = require('@/assets/badges/ink.png'); +// const LineaBadge = require('@/assets/badges/linea.png'); const OptimismBadge = require('@/assets/badges/optimism.png'); const PolygonBadge = require('@/assets/badges/polygon.png'); +// const SankoBadge = require('@/assets/badges/sanko.png'); +// const ScrollBadge = require('@/assets/badges/scroll.png'); +// const ZksyncBadge = require('@/assets/badges/zksync.png'); const ZoraBadge = require('@/assets/badges/zora.png'); import { ChainId } from '@/state/backendNetworks/types'; @@ -32,13 +39,20 @@ const networkBadges = { [ChainId.bsc]: BscBadge, [ChainId.bscTestnet]: BscBadge, [ChainId.degen]: DegenBadge, + // [ChainId.gnosis]: GnosisBadge, + // [ChainId.gravity]: GravityBadge, [ChainId.holesky]: EthereumBadge, + [ChainId.ink]: InkBadge, + // [ChainId.linea]: LineaBadge, [ChainId.mainnet]: EthereumBadge, [ChainId.optimism]: OptimismBadge, [ChainId.optimismSepolia]: OptimismBadge, [ChainId.polygon]: PolygonBadge, [ChainId.polygonAmoy]: PolygonBadge, + // [ChainId.sanko]: SankoBadge, + // [ChainId.scroll]: ScrollBadge, [ChainId.sepolia]: EthereumBadge, + // [ChainId.zksync]: ZksyncBadge, [ChainId.zora]: ZoraBadge, [ChainId.zoraSepolia]: ZoraBadge, }; diff --git a/src/__swaps__/screens/Swap/components/AnimatedChainImage.ios.tsx b/src/__swaps__/screens/Swap/components/AnimatedChainImage.ios.tsx index af14fd783e8..bf382327e4e 100644 --- a/src/__swaps__/screens/Swap/components/AnimatedChainImage.ios.tsx +++ b/src/__swaps__/screens/Swap/components/AnimatedChainImage.ios.tsx @@ -17,8 +17,15 @@ import BlastBadge from '@/assets/badges/blast.png'; import BscBadge from '@/assets/badges/bsc.png'; import DegenBadge from '@/assets/badges/degen.png'; import EthereumBadge from '@/assets/badges/ethereum.png'; +// import GnosisBadge from '@/assets/badges/gnosis.png'; +// import GravityBadge from '@/assets/badges/gravity.png'; +import InkBadge from '@/assets/badges/ink.png'; +// import LineaBadge from '@/assets/badges/linea.png'; import OptimismBadge from '@/assets/badges/optimism.png'; import PolygonBadge from '@/assets/badges/polygon.png'; +// import SankoBadge from '@/assets/badges/sanko.png'; +// import ScrollBadge from '@/assets/badges/scroll.png'; +// import ZksyncBadge from '@/assets/badges/zksync.png'; import ZoraBadge from '@/assets/badges/zora.png'; const networkBadges = { @@ -34,13 +41,20 @@ const networkBadges = { [ChainId.bsc]: Image.resolveAssetSource(BscBadge).uri, [ChainId.bscTestnet]: Image.resolveAssetSource(BscBadge).uri, [ChainId.degen]: Image.resolveAssetSource(DegenBadge).uri, + // [ChainId.gnosis]: Image.resolveAssetSource(GnosisBadge).uri, + // [ChainId.gravity]: Image.resolveAssetSource(GravityBadge).uri, [ChainId.holesky]: Image.resolveAssetSource(EthereumBadge).uri, + [ChainId.ink]: Image.resolveAssetSource(InkBadge).uri, + // [ChainId.linea]: Image.resolveAssetSource(LineaBadge).uri, [ChainId.mainnet]: Image.resolveAssetSource(EthereumBadge).uri, [ChainId.optimism]: Image.resolveAssetSource(OptimismBadge).uri, [ChainId.optimismSepolia]: Image.resolveAssetSource(OptimismBadge).uri, [ChainId.polygon]: Image.resolveAssetSource(PolygonBadge).uri, [ChainId.polygonAmoy]: Image.resolveAssetSource(PolygonBadge).uri, + // [ChainId.sanko]: Image.resolveAssetSource(SankoBadge).uri, + // [ChainId.scroll]: Image.resolveAssetSource(ScrollBadge).uri, [ChainId.sepolia]: Image.resolveAssetSource(EthereumBadge).uri, + // [ChainId.zksync]: Image.resolveAssetSource(ZksyncBadge).uri, [ChainId.zora]: Image.resolveAssetSource(ZoraBadge).uri, [ChainId.zoraSepolia]: Image.resolveAssetSource(ZoraBadge).uri, }; diff --git a/src/__swaps__/screens/Swap/providers/SyncSwapStateAndSharedValues.tsx b/src/__swaps__/screens/Swap/providers/SyncSwapStateAndSharedValues.tsx index beee83e8b3e..715ff149768 100644 --- a/src/__swaps__/screens/Swap/providers/SyncSwapStateAndSharedValues.tsx +++ b/src/__swaps__/screens/Swap/providers/SyncSwapStateAndSharedValues.tsx @@ -15,7 +15,6 @@ import { import { ExtendedAnimatedAssetWithColors } from '@/__swaps__/types/assets'; import { ChainId } from '@/state/backendNetworks/types'; import { ParsedAddressAsset } from '@/entities'; -import { useUserNativeNetworkAsset } from '@/resources/assets/useUserAsset'; import { CrosschainQuote, Quote, QuoteError } from '@rainbow-me/swaps'; import { deepEqualWorklet } from '@/worklets/comparisons'; import { debounce } from 'lodash'; @@ -26,7 +25,10 @@ import { GasSettings } from '../hooks/useCustomGas'; import { useSelectedGas } from '../hooks/useSelectedGas'; import { useSwapEstimatedGasLimit } from '../hooks/useSwapEstimatedGasLimit'; import { useSwapContext } from './swap-provider'; +import { useUserAssetsStore } from '@/state/assets/userAssets'; +import { getUniqueId } from '@/utils/ethereumUtils'; import { useSwapsStore } from '@/state/swaps/swapsStore'; +import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; const BUFFER_RATIO = 0.5; @@ -143,7 +145,12 @@ export function SyncGasStateToSharedValues() { const { assetToSell, chainId = initialChainId, quote } = useSyncedSwapQuoteStore(); const gasSettings = useSelectedGas(chainId); - const { data: userNativeNetworkAsset, isLoading: isLoadingNativeNetworkAsset } = useUserNativeNetworkAsset(chainId); + + const { userNativeNetworkAsset, isLoadingNativeNetworkAsset } = useUserAssetsStore(state => { + const { address: nativeCurrencyAddress } = useBackendNetworksStore.getState().getChainsNativeAsset()[chainId]; + const uniqueId = getUniqueId(nativeCurrencyAddress, chainId); + return { userNativeNetworkAsset: state.getLegacyUserAsset(uniqueId), isLoadingNativeNetworkAsset: state.isLoadingUserAssets }; + }); const { data: estimatedGasLimit } = useSwapEstimatedGasLimit({ chainId, assetToSell, quote }); const gasFeeRange = useSharedValue<[string, string] | null>(null); diff --git a/src/__swaps__/screens/Swap/providers/swap-provider.tsx b/src/__swaps__/screens/Swap/providers/swap-provider.tsx index da16527c726..4d1f66ae1c4 100644 --- a/src/__swaps__/screens/Swap/providers/swap-provider.tsx +++ b/src/__swaps__/screens/Swap/providers/swap-provider.tsx @@ -22,7 +22,7 @@ import { NavigationSteps, useSwapNavigation } from '@/__swaps__/screens/Swap/hoo import { useSwapSettings } from '@/__swaps__/screens/Swap/hooks/useSwapSettings'; import { useSwapTextStyles } from '@/__swaps__/screens/Swap/hooks/useSwapTextStyles'; import { SwapWarningType, useSwapWarning } from '@/__swaps__/screens/Swap/hooks/useSwapWarning'; -import { userAssetsQueryKey as swapsUserAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; +import { userAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; import { AddressOrEth, ExtendedAnimatedAssetWithColors, ParsedSearchAsset } from '@/__swaps__/types/assets'; import { ChainId } from '@/state/backendNetworks/types'; import { SwapAssetType, inputKeys } from '@/__swaps__/types/swap'; @@ -41,7 +41,6 @@ import Routes from '@/navigation/routesNames'; import { walletExecuteRap } from '@/raps/execute'; import { QuoteTypeMap, RapSwapActionParameters } from '@/raps/references'; import { queryClient } from '@/react-query'; -import { userAssetsQueryKey } from '@/resources/assets/UserAssetsQuery'; import { userAssetsStore } from '@/state/assets/userAssets'; import { swapsStore } from '@/state/swaps/swapsStore'; import { getNextNonce } from '@/state/nonces'; @@ -342,14 +341,7 @@ export const SwapProvider = ({ children }: SwapProviderProps) => { userAssetsQueryKey({ address: parameters.quote.from, currency: nativeCurrency, - connectedToHardhat, - }) - ); - queryClient.invalidateQueries( - swapsUserAssetsQueryKey({ - address: parameters.quote.from as Address, - currency: nativeCurrency, - testnetMode: !!connectedToHardhat, + testnetMode: connectedToHardhat, }) ); diff --git a/src/__swaps__/screens/Swap/resources/assets/userAssets.ts b/src/__swaps__/screens/Swap/resources/assets/userAssets.ts index 76e685a1545..6c2e0611f70 100644 --- a/src/__swaps__/screens/Swap/resources/assets/userAssets.ts +++ b/src/__swaps__/screens/Swap/resources/assets/userAssets.ts @@ -17,6 +17,8 @@ import { fetchUserAssetsByChain } from './userAssetsByChain'; import { fetchHardhatBalancesByChainId } from '@/resources/assets/hardhatAssets'; import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; +import { staleBalancesStore } from '@/state/staleBalances'; +import { IS_TEST } from '@/env'; import store from '@/redux/store'; const addysHttp = new RainbowFetchClient({ @@ -28,7 +30,7 @@ const addysHttp = new RainbowFetchClient({ const USER_ASSETS_REFETCH_INTERVAL = 60000; const USER_ASSETS_TIMEOUT_DURATION = 20000; -export const USER_ASSETS_STALE_INTERVAL = 30000; +const USER_ASSETS_STALE_INTERVAL = 30000; // /////////////////////////////////////////////// // Query Types @@ -123,20 +125,23 @@ async function userAssetsQueryFunction({ return parsedAssetsDict; } + const cache = queryClient.getQueryCache(); const cachedUserAssets = (cache.find(userAssetsQueryKey({ address, currency, testnetMode }))?.state?.data || {}) as ParsedAssetsDictByChain; try { - const url = `/${useBackendNetworksStore.getState().getSupportedChainIds().join(',')}/${address}/assets`; + staleBalancesStore.getState().clearExpiredData(address); + const staleBalanceParam = staleBalancesStore.getState().getStaleBalancesQueryParam(address); + let url = `/${useBackendNetworksStore.getState().getSupportedChainIds().join(',')}/${address}/assets?currency=${currency.toLowerCase()}`; + if (staleBalanceParam) { + url += staleBalanceParam; + } const res = await addysHttp.get(url, { - params: { - currency: currency.toLowerCase(), - }, timeout: USER_ASSETS_TIMEOUT_DURATION, }); const chainIdsInResponse = res?.data?.meta?.chain_ids || []; const chainIdsWithErrorsInResponse = res?.data?.meta?.chain_ids_with_errors || []; - const assets = res?.data?.payload?.assets || []; + const assets = res?.data?.payload?.assets?.filter(asset => !asset.asset.defi_position) || []; if (address) { if (chainIdsWithErrorsInResponse.length) { userAssetsQueryFunctionRetryByChain({ @@ -170,7 +175,7 @@ async function userAssetsQueryFunction({ } } -type UserAssetsResult = QueryFunctionResult; +export type UserAssetsResult = QueryFunctionResult; async function userAssetsQueryFunctionRetryByChain({ address, @@ -258,6 +263,6 @@ export function useUserAssets( ...config, enabled: !!address && !!currency, refetchInterval: USER_ASSETS_REFETCH_INTERVAL, - staleTime: process.env.IS_TESTING === 'true' ? 0 : 1000, + staleTime: IS_TEST ? 0 : USER_ASSETS_STALE_INTERVAL, }); } diff --git a/src/__swaps__/screens/Swap/resources/assets/userAssetsByChain.ts b/src/__swaps__/screens/Swap/resources/assets/userAssetsByChain.ts index 723334cce51..032b5ef2eff 100644 --- a/src/__swaps__/screens/Swap/resources/assets/userAssetsByChain.ts +++ b/src/__swaps__/screens/Swap/resources/assets/userAssetsByChain.ts @@ -70,7 +70,7 @@ async function userAssetsByChainQueryFunction({ }, }); const chainIdsInResponse = res?.data?.meta?.chain_ids || []; - const assets = res?.data?.payload?.assets || []; + const assets = res?.data?.payload?.assets?.filter(asset => !asset.asset.defi_position) || []; if (assets.length && chainIdsInResponse.length) { const parsedAssetsDict = await parseUserAssets({ assets, diff --git a/src/__swaps__/types/assets.ts b/src/__swaps__/types/assets.ts index c6f7bcd84a5..f473d907900 100644 --- a/src/__swaps__/types/assets.ts +++ b/src/__swaps__/types/assets.ts @@ -140,6 +140,7 @@ export interface ZerionAsset { bridgeable: boolean; networks: { [id in ChainId]?: { bridgeable: boolean } }; }; + defi_position?: boolean; } // protocols https://github.com/rainbow-me/go-utils-lib/blob/master/pkg/enums/token_type.go#L44 diff --git a/src/__swaps__/utils/assets.ts b/src/__swaps__/utils/assets.ts index c2fa5dfd935..8c87ad572bb 100644 --- a/src/__swaps__/utils/assets.ts +++ b/src/__swaps__/utils/assets.ts @@ -234,37 +234,6 @@ export function parseUserAssetBalances({ }; } -export function parseParsedUserAsset({ - parsedAsset, - currency, - quantity, -}: { - parsedAsset: ParsedUserAsset; - currency: SupportedCurrencyKey; - quantity: string; -}): ParsedUserAsset { - const amount = convertRawAmountToDecimalFormat(quantity, parsedAsset?.decimals); - return { - ...parsedAsset, - balance: { - amount, - display: convertAmountToBalanceDisplay(amount, { - decimals: parsedAsset?.decimals, - symbol: parsedAsset?.symbol, - }), - }, - native: { - ...parsedAsset.native, - balance: getNativeAssetBalance({ - currency, - decimals: parsedAsset?.decimals, - priceUnit: parsedAsset?.price?.value || 0, - value: amount, - }), - }, - }; -} - export const parseSearchAsset = ({ assetWithPrice, searchAsset, diff --git a/src/appIcons/appIcons.ts b/src/appIcons/appIcons.ts index 97ae364095a..aef2cbf0307 100644 --- a/src/appIcons/appIcons.ts +++ b/src/appIcons/appIcons.ts @@ -13,7 +13,8 @@ import AppIconZorb from '@/assets/appIconZorb.png'; import AppIconPoolboy from '@/assets/appIconPoolboy.png'; import AppIconAdworld from '@/assets/appIconAdworld.png'; import AppIconFarcaster from '@/assets/appIconFarcaster.png'; -import { TokenGateCheckerNetwork } from '@/featuresToUnlock/tokenGatedUtils'; +import AppIconRedacted from '@/assets/appIconRedacted.png'; +import { TokenGateCheckerNetwork, TokenInfo } from '@/featuresToUnlock/tokenGatedUtils'; import { Network } from '@/state/backendNetworks/types'; // optimism app icon unlocking NFTs @@ -57,6 +58,9 @@ const ADWORLD_NFT_ADDRESS: EthereumAddress = '0x6171f829e107f70b58d67594c6b62a7d // farcaster app icon unlocking NFTs const FARCASTER_NFT_ADDRESS: EthereumAddress = '0x76843c8f8a369d29c719141a065ff561abe2420b'; +// redacted app icon unlocking NFTs +const REDACTED_NFT_ADDRESS: EthereumAddress = '0x8C3f001A893f3B561dBCaa80f075ecc7A5B92690'; + export interface AppIcon { accentColor: string; displayName: string; @@ -64,7 +68,7 @@ export interface AppIcon { } export interface UnlockableAppIcon extends AppIcon { - unlockingNFTs: Partial>; + unlockingNFTs: Partial>; } export type FreeAppIconKey = 'og' | 'pixel'; @@ -80,7 +84,8 @@ export type UnlockableAppIconKey = | 'zorb' | 'poolboy' | 'adworld' - | 'farcaster'; + | 'farcaster' + | 'redacted'; export type AppIconKey = FreeAppIconKey | UnlockableAppIconKey; @@ -173,4 +178,18 @@ export const unlockableAppIcons: Record image: AppIconFarcaster, unlockingNFTs: { [Network.base]: [FARCASTER_NFT_ADDRESS] }, }, + redacted: { + accentColor: '#001E59', + displayName: 'Redacted Rainbow', + image: AppIconRedacted, + unlockingNFTs: { [Network.base]: [REDACTED_NFT_ADDRESS] }, + }, + + // This is an example of how to add a new test app icon with an ERC-1155 NFT + // newTest_1155: { + // accentColor: '#FF0000', + // displayName: 'NewTest1155', + // image: AppIconTest1155, + // unlockingNFTs: { [Network.base]: [{ account: '0xae2e09aAB7a190664E36daB48c576230E19a0B44', id: 2 }] }, + // } }; diff --git a/src/assets/appIconRedacted.png b/src/assets/appIconRedacted.png new file mode 100644 index 00000000000..a0ea183c4ef Binary files /dev/null and b/src/assets/appIconRedacted.png differ diff --git a/src/assets/appIconRedacted@2x.png b/src/assets/appIconRedacted@2x.png new file mode 100644 index 00000000000..e392c230859 Binary files /dev/null and b/src/assets/appIconRedacted@2x.png differ diff --git a/src/assets/appIconRedacted@3x.png b/src/assets/appIconRedacted@3x.png new file mode 100644 index 00000000000..0be44ec561d Binary files /dev/null and b/src/assets/appIconRedacted@3x.png differ diff --git a/src/assets/badges/apechainBadge.png b/src/assets/badges/apechainBadge.png index a9c1e8c795a..b2e9d186af8 100644 Binary files a/src/assets/badges/apechainBadge.png and b/src/assets/badges/apechainBadge.png differ diff --git a/src/assets/badges/apechainBadge@2x.png b/src/assets/badges/apechainBadge@2x.png index bd647873044..4fd132ed1fb 100644 Binary files a/src/assets/badges/apechainBadge@2x.png and b/src/assets/badges/apechainBadge@2x.png differ diff --git a/src/assets/badges/apechainBadge@3x.png b/src/assets/badges/apechainBadge@3x.png index 06a7eeb07a8..33b686fb121 100644 Binary files a/src/assets/badges/apechainBadge@3x.png and b/src/assets/badges/apechainBadge@3x.png differ diff --git a/src/assets/badges/apechainBadgeLarge.png b/src/assets/badges/apechainBadgeLarge.png index bd647873044..b4261daba5e 100644 Binary files a/src/assets/badges/apechainBadgeLarge.png and b/src/assets/badges/apechainBadgeLarge.png differ diff --git a/src/assets/badges/apechainBadgeLarge@2x.png b/src/assets/badges/apechainBadgeLarge@2x.png index 3e39ee0e49f..c6576eb4e74 100644 Binary files a/src/assets/badges/apechainBadgeLarge@2x.png and b/src/assets/badges/apechainBadgeLarge@2x.png differ diff --git a/src/assets/badges/apechainBadgeLarge@3x.png b/src/assets/badges/apechainBadgeLarge@3x.png index 013d3a2d4b2..0e9b60470ff 100644 Binary files a/src/assets/badges/apechainBadgeLarge@3x.png and b/src/assets/badges/apechainBadgeLarge@3x.png differ diff --git a/src/assets/badges/apechainBadgeLargeDark.png b/src/assets/badges/apechainBadgeLargeDark.png index ced4dc053fd..30ddd73be15 100644 Binary files a/src/assets/badges/apechainBadgeLargeDark.png and b/src/assets/badges/apechainBadgeLargeDark.png differ diff --git a/src/assets/badges/apechainBadgeLargeDark@2x.png b/src/assets/badges/apechainBadgeLargeDark@2x.png index 3f3e8ecae55..faf0caafb64 100644 Binary files a/src/assets/badges/apechainBadgeLargeDark@2x.png and b/src/assets/badges/apechainBadgeLargeDark@2x.png differ diff --git a/src/assets/badges/apechainBadgeLargeDark@3x.png b/src/assets/badges/apechainBadgeLargeDark@3x.png index 240359855ce..46fb7f27973 100644 Binary files a/src/assets/badges/apechainBadgeLargeDark@3x.png and b/src/assets/badges/apechainBadgeLargeDark@3x.png differ diff --git a/src/assets/badges/ethereum.png b/src/assets/badges/ethereum.png index ce612bb3da8..90cd4377c61 100644 Binary files a/src/assets/badges/ethereum.png and b/src/assets/badges/ethereum.png differ diff --git a/src/assets/badges/ethereum@2x.png b/src/assets/badges/ethereum@2x.png index c3aa91dd13f..2f295c7eadf 100644 Binary files a/src/assets/badges/ethereum@2x.png and b/src/assets/badges/ethereum@2x.png differ diff --git a/src/assets/badges/ethereum@3x.png b/src/assets/badges/ethereum@3x.png index 237f8a091cd..5d46e46276b 100644 Binary files a/src/assets/badges/ethereum@3x.png and b/src/assets/badges/ethereum@3x.png differ diff --git a/src/assets/badges/ethereumBadge.png b/src/assets/badges/ethereumBadge.png index f612970c6b4..cbbfb144c7f 100644 Binary files a/src/assets/badges/ethereumBadge.png and b/src/assets/badges/ethereumBadge.png differ diff --git a/src/assets/badges/ethereumBadge@2x.png b/src/assets/badges/ethereumBadge@2x.png index 4776b2c8ff8..2c72c8d698e 100644 Binary files a/src/assets/badges/ethereumBadge@2x.png and b/src/assets/badges/ethereumBadge@2x.png differ diff --git a/src/assets/badges/ethereumBadge@3x.png b/src/assets/badges/ethereumBadge@3x.png index 5a44b01db81..fe08ca8285d 100644 Binary files a/src/assets/badges/ethereumBadge@3x.png and b/src/assets/badges/ethereumBadge@3x.png differ diff --git a/src/assets/badges/ethereumBadgeDark.png b/src/assets/badges/ethereumBadgeDark.png index f612970c6b4..e889ca02d99 100644 Binary files a/src/assets/badges/ethereumBadgeDark.png and b/src/assets/badges/ethereumBadgeDark.png differ diff --git a/src/assets/badges/ethereumBadgeDark@2x.png b/src/assets/badges/ethereumBadgeDark@2x.png index 4776b2c8ff8..bdb47515839 100644 Binary files a/src/assets/badges/ethereumBadgeDark@2x.png and b/src/assets/badges/ethereumBadgeDark@2x.png differ diff --git a/src/assets/badges/ethereumBadgeDark@3x.png b/src/assets/badges/ethereumBadgeDark@3x.png index 5a44b01db81..d91696eb022 100644 Binary files a/src/assets/badges/ethereumBadgeDark@3x.png and b/src/assets/badges/ethereumBadgeDark@3x.png differ diff --git a/src/assets/badges/ethereumBadgeLarge.png b/src/assets/badges/ethereumBadgeLarge.png new file mode 100644 index 00000000000..2c72c8d698e Binary files /dev/null and b/src/assets/badges/ethereumBadgeLarge.png differ diff --git a/src/assets/badges/ethereumBadgeLarge@2x.png b/src/assets/badges/ethereumBadgeLarge@2x.png new file mode 100644 index 00000000000..d8ba3c4fa41 Binary files /dev/null and b/src/assets/badges/ethereumBadgeLarge@2x.png differ diff --git a/src/assets/badges/ethereumBadgeLarge@3x.png b/src/assets/badges/ethereumBadgeLarge@3x.png new file mode 100644 index 00000000000..74bb43b64f3 Binary files /dev/null and b/src/assets/badges/ethereumBadgeLarge@3x.png differ diff --git a/src/assets/badges/ethereumBadgeLargeDark.png b/src/assets/badges/ethereumBadgeLargeDark.png new file mode 100644 index 00000000000..fd71fab44d4 Binary files /dev/null and b/src/assets/badges/ethereumBadgeLargeDark.png differ diff --git a/src/assets/badges/ethereumBadgeLargeDark@2x.png b/src/assets/badges/ethereumBadgeLargeDark@2x.png new file mode 100644 index 00000000000..d1170b13f33 Binary files /dev/null and b/src/assets/badges/ethereumBadgeLargeDark@2x.png differ diff --git a/src/assets/badges/ethereumBadgeLargeDark@3x.png b/src/assets/badges/ethereumBadgeLargeDark@3x.png new file mode 100644 index 00000000000..3b1c00facca Binary files /dev/null and b/src/assets/badges/ethereumBadgeLargeDark@3x.png differ diff --git a/src/assets/badges/ethereumBadgeNoShadow.png b/src/assets/badges/ethereumBadgeNoShadow.png new file mode 100644 index 00000000000..a41cc67b35a Binary files /dev/null and b/src/assets/badges/ethereumBadgeNoShadow.png differ diff --git a/src/assets/badges/ethereumBadgeNoShadow@2x.png b/src/assets/badges/ethereumBadgeNoShadow@2x.png new file mode 100644 index 00000000000..3bcb9df909b Binary files /dev/null and b/src/assets/badges/ethereumBadgeNoShadow@2x.png differ diff --git a/src/assets/badges/ethereumBadgeNoShadow@3x.png b/src/assets/badges/ethereumBadgeNoShadow@3x.png new file mode 100644 index 00000000000..d8365c7bf33 Binary files /dev/null and b/src/assets/badges/ethereumBadgeNoShadow@3x.png differ diff --git a/src/assets/badges/ink.png b/src/assets/badges/ink.png new file mode 100644 index 00000000000..f334bf407de Binary files /dev/null and b/src/assets/badges/ink.png differ diff --git a/src/assets/badges/ink@2x.png b/src/assets/badges/ink@2x.png new file mode 100644 index 00000000000..44b4fa21fd1 Binary files /dev/null and b/src/assets/badges/ink@2x.png differ diff --git a/src/assets/badges/ink@3x.png b/src/assets/badges/ink@3x.png new file mode 100644 index 00000000000..1c79e356b17 Binary files /dev/null and b/src/assets/badges/ink@3x.png differ diff --git a/src/assets/badges/inkBadge.png b/src/assets/badges/inkBadge.png new file mode 100644 index 00000000000..a3089636e54 Binary files /dev/null and b/src/assets/badges/inkBadge.png differ diff --git a/src/assets/badges/inkBadge@2x.png b/src/assets/badges/inkBadge@2x.png new file mode 100644 index 00000000000..e4705d265a0 Binary files /dev/null and b/src/assets/badges/inkBadge@2x.png differ diff --git a/src/assets/badges/inkBadge@3x.png b/src/assets/badges/inkBadge@3x.png new file mode 100644 index 00000000000..2a4937885c2 Binary files /dev/null and b/src/assets/badges/inkBadge@3x.png differ diff --git a/src/assets/badges/inkBadgeDark.png b/src/assets/badges/inkBadgeDark.png new file mode 100644 index 00000000000..68cd1fce628 Binary files /dev/null and b/src/assets/badges/inkBadgeDark.png differ diff --git a/src/assets/badges/inkBadgeDark@2x.png b/src/assets/badges/inkBadgeDark@2x.png new file mode 100644 index 00000000000..26ed12a11d4 Binary files /dev/null and b/src/assets/badges/inkBadgeDark@2x.png differ diff --git a/src/assets/badges/inkBadgeDark@3x.png b/src/assets/badges/inkBadgeDark@3x.png new file mode 100644 index 00000000000..70ff6b9dcb9 Binary files /dev/null and b/src/assets/badges/inkBadgeDark@3x.png differ diff --git a/src/assets/badges/inkBadgeLarge.png b/src/assets/badges/inkBadgeLarge.png new file mode 100644 index 00000000000..196dac3ddbe Binary files /dev/null and b/src/assets/badges/inkBadgeLarge.png differ diff --git a/src/assets/badges/inkBadgeLarge@2x.png b/src/assets/badges/inkBadgeLarge@2x.png new file mode 100644 index 00000000000..1a67fdd1416 Binary files /dev/null and b/src/assets/badges/inkBadgeLarge@2x.png differ diff --git a/src/assets/badges/inkBadgeLarge@3x.png b/src/assets/badges/inkBadgeLarge@3x.png new file mode 100644 index 00000000000..b9daa7524b8 Binary files /dev/null and b/src/assets/badges/inkBadgeLarge@3x.png differ diff --git a/src/assets/badges/inkBadgeLargeDark.png b/src/assets/badges/inkBadgeLargeDark.png new file mode 100644 index 00000000000..f10c9b647e0 Binary files /dev/null and b/src/assets/badges/inkBadgeLargeDark.png differ diff --git a/src/assets/badges/inkBadgeLargeDark@2x.png b/src/assets/badges/inkBadgeLargeDark@2x.png new file mode 100644 index 00000000000..9f11ef214f8 Binary files /dev/null and b/src/assets/badges/inkBadgeLargeDark@2x.png differ diff --git a/src/assets/badges/inkBadgeLargeDark@3x.png b/src/assets/badges/inkBadgeLargeDark@3x.png new file mode 100644 index 00000000000..f17fdb567a0 Binary files /dev/null and b/src/assets/badges/inkBadgeLargeDark@3x.png differ diff --git a/src/assets/badges/inkBadgeNoShadow.png b/src/assets/badges/inkBadgeNoShadow.png new file mode 100644 index 00000000000..7bf5a6dffca Binary files /dev/null and b/src/assets/badges/inkBadgeNoShadow.png differ diff --git a/src/assets/badges/inkBadgeNoShadow@2x.png b/src/assets/badges/inkBadgeNoShadow@2x.png new file mode 100644 index 00000000000..f41b166d389 Binary files /dev/null and b/src/assets/badges/inkBadgeNoShadow@2x.png differ diff --git a/src/assets/badges/inkBadgeNoShadow@3x.png b/src/assets/badges/inkBadgeNoShadow@3x.png new file mode 100644 index 00000000000..bcbbcd0679d Binary files /dev/null and b/src/assets/badges/inkBadgeNoShadow@3x.png differ diff --git a/src/components/asset-list/AssetListHeader.js b/src/components/asset-list/AssetListHeader.js index d35ee0bd3a8..7e1013861be 100644 --- a/src/components/asset-list/AssetListHeader.js +++ b/src/components/asset-list/AssetListHeader.js @@ -12,11 +12,11 @@ import { StickyHeader } from './RecyclerAssetList2/core/StickyHeaders'; import { useAccountProfile, useDimensions } from '@/hooks'; import { useNavigation } from '@/navigation'; import Routes from '@/navigation/routesNames'; -import { useUserAssetCount } from '@/resources/assets/useUserAssetCount'; import styled from '@/styled-thing'; import { fonts, position } from '@/styles'; import { useTheme } from '@/theme'; import * as lang from '@/languages'; +import { useUserAssetsStore } from '@/state/assets/userAssets'; export const AssetListHeaderHeight = ListHeaderHeight; @@ -104,7 +104,7 @@ const AssetListHeader = ({ contextMenuOptions, isCoinListEdited, title, totalVal const { width: deviceWidth } = useDimensions(); const { accountName } = useAccountProfile(); const { navigate } = useNavigation(); - const { isLoading: isLoadingUserAssets } = useUserAssetCount(); + const { isLoadingUserAssets } = useUserAssetsStore(state => state.isLoadingUserAssets); const onChangeWallet = useCallback(() => { navigate(Routes.CHANGE_WALLET_SHEET); diff --git a/src/components/asset-list/RecyclerAssetList2/FastComponents/FastCoinBadge.tsx b/src/components/asset-list/RecyclerAssetList2/FastComponents/FastCoinBadge.tsx index dd948ecd527..4ea959efb7c 100644 --- a/src/components/asset-list/RecyclerAssetList2/FastComponents/FastCoinBadge.tsx +++ b/src/components/asset-list/RecyclerAssetList2/FastComponents/FastCoinBadge.tsx @@ -1,26 +1,41 @@ import React from 'react'; import { Image, ImageSourcePropType, View, ViewStyle } from 'react-native'; +import { ChainId } from '@/state/backendNetworks/types'; + +import ApechainBadge from '@/assets/badges/apechainBadge.png'; +import ApechainBadgeDark from '@/assets/badges/apechainBadgeDark.png'; import ArbitrumBadge from '@/assets/badges/arbitrumBadge.png'; import ArbitrumBadgeDark from '@/assets/badges/arbitrumBadgeDark.png'; -import OptimismBadge from '@/assets/badges/optimismBadge.png'; -import OptimismBadgeDark from '@/assets/badges/optimismBadgeDark.png'; -import PolygonBadge from '@/assets/badges/polygonBadge.png'; -import PolygonBadgeDark from '@/assets/badges/polygonBadgeDark.png'; -import BscBadge from '@/assets/badges/bscBadge.png'; -import BscBadgeDark from '@/assets/badges/bscBadgeDark.png'; -import ZoraBadge from '@/assets/badges/zoraBadge.png'; -import ZoraBadgeDark from '@/assets/badges/zoraBadgeDark.png'; -import BaseBadge from '@/assets/badges/baseBadge.png'; -import BaseBadgeDark from '@/assets/badges/baseBadgeDark.png'; import AvalancheBadge from '@/assets/badges/avalancheBadge.png'; import AvalancheBadgeDark from '@/assets/badges/avalancheBadgeDark.png'; +import BaseBadge from '@/assets/badges/baseBadge.png'; +import BaseBadgeDark from '@/assets/badges/baseBadgeDark.png'; import BlastBadge from '@/assets/badges/blastBadge.png'; import BlastBadgeDark from '@/assets/badges/blastBadgeDark.png'; +import BscBadge from '@/assets/badges/bscBadge.png'; +import BscBadgeDark from '@/assets/badges/bscBadgeDark.png'; import DegenBadge from '@/assets/badges/degenBadge.png'; import DegenBadgeDark from '@/assets/badges/degenBadgeDark.png'; -import ApechainBadge from '@/assets/badges/apechainBadge.png'; -import ApechainBadgeDark from '@/assets/badges/apechainBadgeDark.png'; -import { ChainId } from '@/state/backendNetworks/types'; +// import GnosisBadge from '@/assets/badges/gnosisBadge.png'; +// import GnosisBadgeDark from '@/assets/badges/gnosisBadgeDark.png'; +// import GravityBadge from '@/assets/badges/gravityBadge.png'; +// import GravityBadgeDark from '@/assets/badges/gravityBadgeDark.png'; +import InkBadge from '@/assets/badges/inkBadge.png'; +import InkBadgeDark from '@/assets/badges/inkBadgeDark.png'; +// import LineaBadge from '@/assets/badges/lineaBadge.png'; +// import LineaBadgeDark from '@/assets/badges/lineaBadgeDark.png'; +import OptimismBadge from '@/assets/badges/optimismBadge.png'; +import OptimismBadgeDark from '@/assets/badges/optimismBadgeDark.png'; +import PolygonBadge from '@/assets/badges/polygonBadge.png'; +import PolygonBadgeDark from '@/assets/badges/polygonBadgeDark.png'; +// import SankoBadge from '@/assets/badges/sankoBadge.png'; +// import SankoBadgeDark from '@/assets/badges/sankoBadgeDark.png'; +// import ScrollBadge from '@/assets/badges/scrollBadge.png'; +// import ScrollBadgeDark from '@/assets/badges/scrollBadgeDark.png'; +// import ZksyncBadge from '@/assets/badges/zksyncBadge.png'; +// import ZksyncBadgeDark from '@/assets/badges/zksyncBadgeDark.png'; +import ZoraBadge from '@/assets/badges/zoraBadge.png'; +import ZoraBadgeDark from '@/assets/badges/zoraBadgeDark.png'; interface FastChainBadgeProps { chainId: ChainId; @@ -41,38 +56,66 @@ const AssetIconsByTheme: { dark: ArbitrumBadgeDark, light: ArbitrumBadge, }, - [ChainId.optimism]: { - dark: OptimismBadgeDark, - light: OptimismBadge, - }, - [ChainId.polygon]: { - dark: PolygonBadgeDark, - light: PolygonBadge, - }, - [ChainId.bsc]: { - dark: BscBadgeDark, - light: BscBadge, - }, - [ChainId.zora]: { - dark: ZoraBadgeDark, - light: ZoraBadge, + [ChainId.avalanche]: { + dark: AvalancheBadgeDark, + light: AvalancheBadge, }, [ChainId.base]: { dark: BaseBadgeDark, light: BaseBadge, }, - [ChainId.avalanche]: { - dark: AvalancheBadgeDark, - light: AvalancheBadge, - }, [ChainId.blast]: { dark: BlastBadgeDark, light: BlastBadge, }, + [ChainId.bsc]: { + dark: BscBadgeDark, + light: BscBadge, + }, [ChainId.degen]: { dark: DegenBadgeDark, light: DegenBadge, }, + // [ChainId.gnosis]: { + // dark: GnosisBadgeDark, + // light: GnosisBadge, + // }, + // [ChainId.gravity]: { + // dark: GravityBadgeDark, + // light: GravityBadge, + // }, + [ChainId.ink]: { + dark: InkBadgeDark, + light: InkBadge, + }, + // [ChainId.linea]: { + // dark: LineaBadgeDark, + // light: LineaBadge, + // }, + [ChainId.optimism]: { + dark: OptimismBadgeDark, + light: OptimismBadge, + }, + [ChainId.polygon]: { + dark: PolygonBadgeDark, + light: PolygonBadge, + }, + // [ChainId.sanko]: { + // dark: SankoBadgeDark, + // light: SankoBadge, + // }, + // [ChainId.scroll]: { + // dark: ScrollBadgeDark, + // light: ScrollBadge, + // }, + // [ChainId.zksync]: { + // dark: ZksyncBadgeDark, + // light: ZksyncBadge, + // }, + [ChainId.zora]: { + dark: ZoraBadgeDark, + light: ZoraBadge, + }, }; export const FastChainBadge = React.memo(function FastChainBadge({ chainId, theme }: FastChainBadgeProps) { diff --git a/src/components/coin-icon/ChainBadge.js b/src/components/coin-icon/ChainBadge.js index 0eafa651841..8babe5015a6 100644 --- a/src/components/coin-icon/ChainBadge.js +++ b/src/components/coin-icon/ChainBadge.js @@ -1,45 +1,75 @@ import React from 'react'; import FastImage from 'react-native-fast-image'; -import ArbitrumBadge from '../../assets/badges/arbitrumBadge.png'; -import ArbitrumBadgeDark from '../../assets/badges/arbitrumBadgeDark.png'; -import ArbitrumBadgeLarge from '../../assets/badges/arbitrumBadgeLarge.png'; -import ArbitrumBadgeLargeDark from '../../assets/badges/arbitrumBadgeLargeDark.png'; -import OptimismBadge from '../../assets/badges/optimismBadge.png'; -import OptimismBadgeDark from '../../assets/badges/optimismBadgeDark.png'; -import OptimismBadgeLarge from '../../assets/badges/optimismBadgeLarge.png'; -import OptimismBadgeLargeDark from '../../assets/badges/optimismBadgeLargeDark.png'; -import PolygonBadge from '../../assets/badges/polygonBadge.png'; -import PolygonBadgeDark from '../../assets/badges/polygonBadgeDark.png'; -import PolygonBadgeLarge from '../../assets/badges/polygonBadgeLarge.png'; -import PolygonBadgeLargeDark from '../../assets/badges/polygonBadgeLargeDark.png'; -import BscBadge from '../../assets/badges/bscBadge.png'; -import BscBadgeDark from '../../assets/badges/bscBadgeDark.png'; -import BscBadgeLarge from '../../assets/badges/bscBadgeLarge.png'; -import BscBadgeLargeDark from '../../assets/badges/bscBadgeLargeDark.png'; -import ZoraBadge from '../../assets/badges/zoraBadge.png'; -import ZoraBadgeDark from '../../assets/badges/zoraBadgeDark.png'; -import ZoraBadgeLarge from '../../assets/badges/zoraBadgeLarge.png'; -import ZoraBadgeLargeDark from '../../assets/badges/zoraBadgeLargeDark.png'; -import BaseBadge from '../../assets/badges/baseBadge.png'; -import BaseBadgeDark from '../../assets/badges/baseBadgeDark.png'; -import BaseBadgeLarge from '../../assets/badges/baseBadgeLarge.png'; -import BaseBadgeLargeDark from '../../assets/badges/baseBadgeLargeDark.png'; -import AvalancheBadge from '../../assets/badges/avalancheBadge.png'; -import AvalancheBadgeDark from '../../assets/badges/avalancheBadgeDark.png'; -import AvalancheBadgeLarge from '../../assets/badges/avalancheBadgeLarge.png'; -import AvalancheBadgeLargeDark from '../../assets/badges/avalancheBadgeLargeDark.png'; -import BlastBadge from '../../assets/badges/blastBadge.png'; -import BlastBadgeDark from '../../assets/badges/blastBadgeDark.png'; -import BlastBadgeLarge from '../../assets/badges/blastBadgeLarge.png'; -import BlastBadgeLargeDark from '../../assets/badges/blastBadgeLargeDark.png'; -import DegenBadge from '../../assets/badges/degenBadge.png'; -import DegenBadgeDark from '../../assets/badges/degenBadgeDark.png'; -import DegenBadgeLarge from '../../assets/badges/degenBadgeLarge.png'; -import DegenBadgeLargeDark from '../../assets/badges/degenBadgeLargeDark.png'; -import ApechainBadge from '../../assets/badges/apechainBadge.png'; -import ApechainBadgeDark from '../../assets/badges/apechainBadgeDark.png'; -import ApechainBadgeLarge from '../../assets/badges/apechainBadgeLarge.png'; -import ApechainBadgeLargeDark from '../../assets/badges/apechainBadgeLargeDark.png'; + +import ApechainBadge from '@/assets/badges/apechainBadge.png'; +import ApechainBadgeDark from '@/assets/badges/apechainBadgeDark.png'; +import ApechainBadgeLarge from '@/assets/badges/apechainBadgeLarge.png'; +import ApechainBadgeLargeDark from '@/assets/badges/apechainBadgeLargeDark.png'; +import ArbitrumBadge from '@/assets/badges/arbitrumBadge.png'; +import ArbitrumBadgeDark from '@/assets/badges/arbitrumBadgeDark.png'; +import ArbitrumBadgeLarge from '@/assets/badges/arbitrumBadgeLarge.png'; +import ArbitrumBadgeLargeDark from '@/assets/badges/arbitrumBadgeLargeDark.png'; +import AvalancheBadge from '@/assets/badges/avalancheBadge.png'; +import AvalancheBadgeDark from '@/assets/badges/avalancheBadgeDark.png'; +import AvalancheBadgeLarge from '@/assets/badges/avalancheBadgeLarge.png'; +import AvalancheBadgeLargeDark from '@/assets/badges/avalancheBadgeLargeDark.png'; +import BaseBadge from '@/assets/badges/baseBadge.png'; +import BaseBadgeDark from '@/assets/badges/baseBadgeDark.png'; +import BaseBadgeLarge from '@/assets/badges/baseBadgeLarge.png'; +import BaseBadgeLargeDark from '@/assets/badges/baseBadgeLargeDark.png'; +import BlastBadge from '@/assets/badges/blastBadge.png'; +import BlastBadgeDark from '@/assets/badges/blastBadgeDark.png'; +import BlastBadgeLarge from '@/assets/badges/blastBadgeLarge.png'; +import BlastBadgeLargeDark from '@/assets/badges/blastBadgeLargeDark.png'; +import BscBadge from '@/assets/badges/bscBadge.png'; +import BscBadgeDark from '@/assets/badges/bscBadgeDark.png'; +import BscBadgeLarge from '@/assets/badges/bscBadgeLarge.png'; +import BscBadgeLargeDark from '@/assets/badges/bscBadgeLargeDark.png'; +import DegenBadge from '@/assets/badges/degenBadge.png'; +import DegenBadgeDark from '@/assets/badges/degenBadgeDark.png'; +import DegenBadgeLarge from '@/assets/badges/degenBadgeLarge.png'; +import DegenBadgeLargeDark from '@/assets/badges/degenBadgeLargeDark.png'; +// import GnosisBadge from '@/assets/badges/gnosisBadge.png'; +// import GnosisBadgeDark from '@/assets/badges/gnosisBadgeDark.png'; +// import GnosisBadgeLarge from '@/assets/badges/gnosisBadgeLarge.png'; +// import GnosisBadgeLargeDark from '@/assets/badges/gnosisBadgeLargeDark.png'; +// import GravityBadge from '@/assets/badges/gravityBadge.png'; +// import GravityBadgeDark from '@/assets/badges/gravityBadgeDark.png'; +// import GravityBadgeLarge from '@/assets/badges/gravityBadgeLarge.png'; +// import GravityBadgeLargeDark from '@/assets/badges/gravityBadgeLargeDark.png'; +import InkBadge from '@/assets/badges/inkBadge.png'; +import InkBadgeDark from '@/assets/badges/inkBadgeDark.png'; +import InkBadgeLarge from '@/assets/badges/inkBadgeLarge.png'; +import InkBadgeLargeDark from '@/assets/badges/inkBadgeLargeDark.png'; +// import LineaBadge from '@/assets/badges/lineaBadge.png'; +// import LineaBadgeDark from '@/assets/badges/lineaBadgeDark.png'; +// import LineaBadgeLarge from '@/assets/badges/lineaBadgeLarge.png'; +// import LineaBadgeLargeDark from '@/assets/badges/lineaBadgeLargeDark.png'; +import OptimismBadge from '@/assets/badges/optimismBadge.png'; +import OptimismBadgeDark from '@/assets/badges/optimismBadgeDark.png'; +import OptimismBadgeLarge from '@/assets/badges/optimismBadgeLarge.png'; +import OptimismBadgeLargeDark from '@/assets/badges/optimismBadgeLargeDark.png'; +import PolygonBadge from '@/assets/badges/polygonBadge.png'; +import PolygonBadgeDark from '@/assets/badges/polygonBadgeDark.png'; +import PolygonBadgeLarge from '@/assets/badges/polygonBadgeLarge.png'; +import PolygonBadgeLargeDark from '@/assets/badges/polygonBadgeLargeDark.png'; +// import SankoBadge from '@/assets/badges/sankoBadge.png'; +// import SankoBadgeDark from '@/assets/badges/sankoBadgeDark.png'; +// import SankoBadgeLarge from '@/assets/badges/sankoBadgeLarge.png'; +// import SankoBadgeLargeDark from '@/assets/badges/sankoBadgeLargeDark.png'; +// import ScrollBadge from '@/assets/badges/scrollBadge.png'; +// import ScrollBadgeDark from '@/assets/badges/scrollBadgeDark.png'; +// import ScrollBadgeLarge from '@/assets/badges/scrollBadgeLarge.png'; +// import ScrollBadgeLargeDark from '@/assets/badges/scrollBadgeLargeDark.png'; +// import ZksyncBadge from '@/assets/badges/zksyncBadge.png'; +// import ZksyncBadgeDark from '@/assets/badges/zksyncBadgeDark.png'; +// import ZksyncBadgeLarge from '@/assets/badges/zksyncBadgeLarge.png'; +// import ZksyncBadgeLargeDark from '@/assets/badges/zksyncBadgeLargeDark.png'; +import ZoraBadge from '@/assets/badges/zoraBadge.png'; +import ZoraBadgeDark from '@/assets/badges/zoraBadgeDark.png'; +import ZoraBadgeLarge from '@/assets/badges/zoraBadgeLarge.png'; +import ZoraBadgeLargeDark from '@/assets/badges/zoraBadgeLargeDark.png'; + import { Centered } from '../layout'; import styled from '@/styled-thing'; import { position as positions } from '@/styles'; @@ -84,44 +114,72 @@ export default function ChainBadge({ val = isDarkMode ? ApechainBadgeLargeDark : ApechainBadgeLarge; } else if (chainId === ChainId.arbitrum) { val = isDarkMode ? ArbitrumBadgeLargeDark : ArbitrumBadgeLarge; - } else if (chainId === ChainId.optimism) { - val = isDarkMode ? OptimismBadgeLargeDark : OptimismBadgeLarge; - } else if (chainId === ChainId.polygon) { - val = isDarkMode ? PolygonBadgeLargeDark : PolygonBadgeLarge; - } else if (chainId === ChainId.bsc) { - val = isDarkMode ? BscBadgeLargeDark : BscBadgeLarge; - } else if (chainId === ChainId.zora) { - val = isDarkMode ? ZoraBadgeLargeDark : ZoraBadgeLarge; - } else if (chainId === ChainId.base) { - val = isDarkMode ? BaseBadgeLargeDark : BaseBadgeLarge; } else if (chainId === ChainId.avalanche) { val = isDarkMode ? AvalancheBadgeLargeDark : AvalancheBadgeLarge; + } else if (chainId === ChainId.base) { + val = isDarkMode ? BaseBadgeLargeDark : BaseBadgeLarge; } else if (chainId === ChainId.blast) { val = isDarkMode ? BlastBadgeLargeDark : BlastBadgeLarge; + } else if (chainId === ChainId.bsc) { + val = isDarkMode ? BscBadgeLargeDark : BscBadgeLarge; } else if (chainId === ChainId.degen) { val = isDarkMode ? DegenBadgeLargeDark : DegenBadgeLarge; + // } else if (chainId === ChainId.gnosis) { + // val = isDarkMode ? GnosisBadgeLargeDark : GnosisBadgeLarge; + // } else if (chainId === ChainId.gravity) { + // val = isDarkMode ? GravityBadgeLargeDark : GravityBadgeLarge; + } else if (chainId === ChainId.ink) { + val = isDarkMode ? InkBadgeLargeDark : InkBadgeLarge; + // } else if (chainId === ChainId.linea) { + // val = isDarkMode ? LineaBadgeLargeDark : LineaBadgeLarge; + } else if (chainId === ChainId.optimism) { + val = isDarkMode ? OptimismBadgeLargeDark : OptimismBadgeLarge; + } else if (chainId === ChainId.polygon) { + val = isDarkMode ? PolygonBadgeLargeDark : PolygonBadgeLarge; + // } else if (chainId === ChainId.sanko) { + // val = isDarkMode ? SankoBadgeLargeDark : SankoBadgeLarge; + // } else if (chainId === ChainId.scroll) { + // val = isDarkMode ? ScrollBadgeLargeDark : ScrollBadgeLarge; + // } else if (chainId === ChainId.zksync) { + // val = isDarkMode ? ZksyncBadgeLargeDark : ZksyncBadgeLarge; + } else if (chainId === ChainId.zora) { + val = isDarkMode ? ZoraBadgeLargeDark : ZoraBadgeLarge; } } else { if (chainId === ChainId.apechain) { val = isDarkMode ? ApechainBadgeDark : ApechainBadge; } else if (chainId === ChainId.arbitrum) { val = isDarkMode ? ArbitrumBadgeDark : ArbitrumBadge; - } else if (chainId === ChainId.optimism) { - val = isDarkMode ? OptimismBadgeDark : OptimismBadge; - } else if (chainId === ChainId.polygon) { - val = isDarkMode ? PolygonBadgeDark : PolygonBadge; - } else if (chainId === ChainId.bsc) { - val = isDarkMode ? BscBadgeDark : BscBadge; - } else if (chainId === ChainId.zora) { - val = isDarkMode ? ZoraBadgeDark : ZoraBadge; - } else if (chainId === ChainId.base) { - val = isDarkMode ? BaseBadgeDark : BaseBadge; } else if (chainId === ChainId.avalanche) { val = isDarkMode ? AvalancheBadgeDark : AvalancheBadge; + } else if (chainId === ChainId.base) { + val = isDarkMode ? BaseBadgeDark : BaseBadge; } else if (chainId === ChainId.blast) { val = isDarkMode ? BlastBadgeDark : BlastBadge; + } else if (chainId === ChainId.bsc) { + val = isDarkMode ? BscBadgeDark : BscBadge; } else if (chainId === ChainId.degen) { val = isDarkMode ? DegenBadgeDark : DegenBadge; + // } else if (chainId === ChainId.gnosis) { + // val = isDarkMode ? GnosisBadgeDark : GnosisBadge; + // } else if (chainId === ChainId.gravity) { + // val = isDarkMode ? GravityBadgeDark : GravityBadge; + } else if (chainId === ChainId.ink) { + val = isDarkMode ? InkBadgeDark : InkBadge; + // } else if (chainId === ChainId.linea) { + // val = isDarkMode ? LineaBadgeDark : LineaBadge; + } else if (chainId === ChainId.optimism) { + val = isDarkMode ? OptimismBadgeDark : OptimismBadge; + } else if (chainId === ChainId.polygon) { + val = isDarkMode ? PolygonBadgeDark : PolygonBadge; + // } else if (chainId === ChainId.sanko) { + // val = isDarkMode ? SankoBadgeDark : SankoBadge; + // } else if (chainId === ChainId.scroll) { + // val = isDarkMode ? ScrollBadgeDark : ScrollBadge; + // } else if (chainId === ChainId.zksync) { + // val = isDarkMode ? ZksyncBadgeDark : ZksyncBadge; + } else if (chainId === ChainId.zora) { + val = isDarkMode ? ZoraBadgeDark : ZoraBadge; } } return val; diff --git a/src/components/coin-icon/ChainImage.tsx b/src/components/coin-icon/ChainImage.tsx index 0be5f993fa5..1aa5c479b8e 100644 --- a/src/components/coin-icon/ChainImage.tsx +++ b/src/components/coin-icon/ChainImage.tsx @@ -1,17 +1,25 @@ import React, { useMemo } from 'react'; import { ChainId } from '@/state/backendNetworks/types'; +import ApechainBadge from '@/assets/badges/apechain.png'; import ArbitrumBadge from '@/assets/badges/arbitrum.png'; +import AvalancheBadge from '@/assets/badges/avalanche.png'; import BaseBadge from '@/assets/badges/base.png'; +import BlastBadge from '@/assets/badges/blast.png'; import BscBadge from '@/assets/badges/bsc.png'; +import DegenBadge from '@/assets/badges/degen.png'; import EthereumBadge from '@/assets/badges/ethereum.png'; +// import GnosisBadge from '@/assets/badges/gnosis.png'; +// import GravityBadge from '@/assets/badges/gravity.png'; +import InkBadge from '@/assets/badges/ink.png'; +// import LineaBadge from '@/assets/badges/linea.png'; import OptimismBadge from '@/assets/badges/optimism.png'; import PolygonBadge from '@/assets/badges/polygon.png'; +// import SankoBadge from '@/assets/badges/sanko.png'; +// import ScrollBadge from '@/assets/badges/scroll.png'; +// import ZksyncBadge from '@/assets/badges/zksync.png'; import ZoraBadge from '@/assets/badges/zora.png'; -import AvalancheBadge from '@/assets/badges/avalanche.png'; -import BlastBadge from '@/assets/badges/blast.png'; -import DegenBadge from '@/assets/badges/degen.png'; -import ApechainBadge from '@/assets/badges/apechain.png'; + import FastImage, { Source } from 'react-native-fast-image'; export function ChainImage({ chainId, size = 20 }: { chainId: ChainId | null | undefined; size?: number }) { @@ -21,24 +29,38 @@ export function ChainImage({ chainId, size = 20 }: { chainId: ChainId | null | u return ApechainBadge; case ChainId.arbitrum: return ArbitrumBadge; + case ChainId.avalanche: + return AvalancheBadge; case ChainId.base: return BaseBadge; + case ChainId.blast: + return BlastBadge; case ChainId.bsc: return BscBadge; + case ChainId.degen: + return DegenBadge; + // case ChainId.gnosis: + // return GnosisBadge; + // case ChainId.gravity: + // return GravityBadge; + case ChainId.ink: + return InkBadge; + // case ChainId.linea: + // return LineaBadge; case ChainId.mainnet: return EthereumBadge; case ChainId.optimism: return OptimismBadge; case ChainId.polygon: return PolygonBadge; + // case ChainId.sanko: + // return SankoBadge; + // case ChainId.scroll: + // return ScrollBadge; + // case ChainId.zksync: + // return ZksyncBadge; case ChainId.zora: return ZoraBadge; - case ChainId.avalanche: - return AvalancheBadge; - case ChainId.blast: - return BlastBadge; - case ChainId.degen: - return DegenBadge; default: return { uri: '' }; } diff --git a/src/components/list/NoResults.tsx b/src/components/list/NoResults.tsx index ef610f7b36e..ff9b3789bd7 100644 --- a/src/components/list/NoResults.tsx +++ b/src/components/list/NoResults.tsx @@ -4,7 +4,7 @@ import { neverRerender } from '@/utils'; import { Inset, Stack, Text } from '@/design-system'; import { useTheme } from '@/theme'; import { logger } from '@/logger'; -import { useUserAssetCount } from '@/resources/assets/useUserAssetCount'; +import { useUserAssetsStore } from '@/state/assets/userAssets'; export enum NoResultsType { Discover = 'discover', @@ -14,7 +14,7 @@ export enum NoResultsType { export const NoResults = ({ onL2, type }: { onL2?: boolean; type: NoResultsType }) => { const { colors } = useTheme(); - const { data: assetCount } = useUserAssetCount(); + const assetCount = useUserAssetsStore(state => state.userAssets.size); let title; let description; diff --git a/src/components/remote-promo-sheet/check-fns/hasNonZeroTotalBalance.ts b/src/components/remote-promo-sheet/check-fns/hasNonZeroTotalBalance.ts index 2d0976b21df..e2f68b89723 100644 --- a/src/components/remote-promo-sheet/check-fns/hasNonZeroTotalBalance.ts +++ b/src/components/remote-promo-sheet/check-fns/hasNonZeroTotalBalance.ts @@ -1,16 +1,20 @@ +import { selectorFilterByUserChains, selectUserAssetsList } from '@/__swaps__/screens/Swap/resources/_selectors/assets'; +import { userAssetsFetchQuery } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; import store from '@/redux/store'; -import { fetchUserAssets } from '@/resources/assets/UserAssetsQuery'; +import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; export const hasNonZeroTotalBalance = async (): Promise => { const { accountAddress, nativeCurrency } = store.getState().settings; - const assets = await fetchUserAssets({ + const userAssetsDictByChain = await userAssetsFetchQuery({ address: accountAddress, currency: nativeCurrency, - connectedToHardhat: false, + testnetMode: useConnectedToHardhatStore.getState().connectedToHardhat, }); - if (!assets || Object.keys(assets).length === 0) return false; + const assets = selectorFilterByUserChains({ data: userAssetsDictByChain, selector: selectUserAssetsList }); - return Object.values(assets).some(asset => Number(asset.balance?.amount) > 0); + if (!assets?.length) return false; + + return assets.some(asset => Number(asset.balance?.amount) > 0); }; diff --git a/src/design-system/docs/yarn.lock b/src/design-system/docs/yarn.lock index f300bad06e2..c135098c36e 100644 --- a/src/design-system/docs/yarn.lock +++ b/src/design-system/docs/yarn.lock @@ -7333,11 +7333,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.4, nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 languageName: node linkType: hard diff --git a/src/featuresToUnlock/tokenGatedUtils.ts b/src/featuresToUnlock/tokenGatedUtils.ts index 2b4b532ff8b..52085c56724 100644 --- a/src/featuresToUnlock/tokenGatedUtils.ts +++ b/src/featuresToUnlock/tokenGatedUtils.ts @@ -1,9 +1,9 @@ -import { Contract } from '@ethersproject/contracts'; import { EthereumAddress } from '@/entities'; import { getProvider } from '@/handlers/web3'; import { tokenGateCheckerAbi } from '@/references'; import { Network } from '@/state/backendNetworks/types'; import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; +import { Interface } from '@ethersproject/abi'; export type TokenGateCheckerNetwork = | Network.arbitrum @@ -12,30 +12,70 @@ export type TokenGateCheckerNetwork = | Network.mainnet | Network.polygon | Network.bsc - | Network.base; - + | Network.base + | Network.gnosis + | Network.avalanche; const TOKEN_GATE_CHECKER_ADDRESS: Record = { - [Network.arbitrum]: '0x2a0332e28913a06fa924d40a3e2160f763010417', - [Network.mainnet]: '0x47c9c137fc9aa5ccdbea707b0b27d52780565476', - [Network.optimism]: '0x400a9f1bb1db80643c33710c2232a0d74ef5cff1', - [Network.polygon]: '0x400a9f1bb1db80643c33710c2232a0d74ef5cff1', - [Network.zora]: '0x12a39421c23f4d3f788c33f0f9281652ac4f909a', - [Network.bsc]: '0x5a9d9ffbd5a22f2790af726550920b845c3a6b35', - [Network.base]: '0x7edddf0b8e7471e0ebf0df67ad179598c0bef695', + [Network.arbitrum]: '0x5A9D9FFBd5a22f2790AF726550920B845c3A6B35', + [Network.mainnet]: '0xc4A8619B3980d84F6d59d416d415007A1217fEc8', + [Network.optimism]: '0x5A9D9FFBd5a22f2790AF726550920B845c3A6B35', + [Network.polygon]: '0x3e3937C119BD854059844D3D03A8116a18Afa409', + [Network.zora]: '0x75efed6B8AF6B0490c2899e489c58EF26E3D0898', + [Network.bsc]: '0x50a42aB85A09e24229e42dAd31Cb44B42E83b2De', + [Network.base]: '0xa5d7b264ad7039F54A670c27Fe5A64CAd0FE0cCe', + [Network.gnosis]: '0x2488F7B6FD1A0949391fE6a533D7E5c4704173E2', + [Network.avalanche]: '0x2a0332E28913A06Fa924d40A3E2160f763010417', }; +/*** + * Check if wallets own NFTs of type ERC-721 + * We only need the NFT address to check for ownership + */ + export const checkIfWalletsOwnNft = async ( - tokenAddress: EthereumAddress[], + tokenAddresses: EthereumAddress[], network: TokenGateCheckerNetwork, walletsToCheck: EthereumAddress[] ) => { - const p = getProvider({ chainId: useBackendNetworksStore.getState().getChainsIdByName()[network] }); + try { + const p = getProvider({ chainId: useBackendNetworksStore.getState().getChainsIdByName()[network] }); + const iface = new Interface(tokenGateCheckerAbi); + + const data = iface.encodeFunctionData('areOwners(address[], address[])', [tokenAddresses, walletsToCheck]); + const found = await p.call({ to: TOKEN_GATE_CHECKER_ADDRESS[network], data }); + if (found === '0x0000000000000000000000000000000000000000000000000000000000000000') { + return false; + } + return true; + } catch (e) { + return false; + } +}; + +export interface TokenInfo { + account: EthereumAddress; + id: number; +} - const contractInstance = new Contract(TOKEN_GATE_CHECKER_ADDRESS[network], tokenGateCheckerAbi, p); +/*** + * Check if wallets own NFTs of type ERC-1155 + * In this case we need to also check the id of the NFTs + */ +export const checkIfWalletsOwnNft1155 = async ( + tokenInfo: TokenInfo[], + network: TokenGateCheckerNetwork, + walletsToCheck: EthereumAddress[] +) => { try { - const found = contractInstance.areOwners(tokenAddress, walletsToCheck); - return found; + const p = getProvider({ chainId: useBackendNetworksStore.getState().getChainsIdByName()[network] }); + const iface = new Interface(tokenGateCheckerAbi); + const data = iface.encodeFunctionData('areOwners(TokenInfo[], address[])', [tokenInfo, walletsToCheck]); + const found = await p.call({ to: TOKEN_GATE_CHECKER_ADDRESS[network], data }); + if (found === '0x0000000000000000000000000000000000000000000000000000000000000000') { + return false; + } + return true; } catch (e) { return false; } diff --git a/src/featuresToUnlock/unlockableAppIconCheck.ts b/src/featuresToUnlock/unlockableAppIconCheck.ts index b2d87d261ae..0eaef6b9514 100644 --- a/src/featuresToUnlock/unlockableAppIconCheck.ts +++ b/src/featuresToUnlock/unlockableAppIconCheck.ts @@ -1,4 +1,4 @@ -import { TokenGateCheckerNetwork, checkIfWalletsOwnNft } from './tokenGatedUtils'; +import { TokenGateCheckerNetwork, TokenInfo, checkIfWalletsOwnNft, checkIfWalletsOwnNft1155 } from './tokenGatedUtils'; import { EthereumAddress } from '@/entities'; import { Navigation } from '@/navigation'; import { RainbowError, logger } from '@/logger'; @@ -22,21 +22,43 @@ export const unlockableAppIconCheck = async (appIconKey: UnlockableAppIconKey, w const handled = unlockableAppIconStorage.getBoolean(appIconKey); - logger.debug(`[unlockableAppIconCheck]: ${appIconKey} was handled? ${handled}`); - if (handled) return false; + logger.debug(`[unlockableAppIconCheck]: ${appIconKey} was handled? ${handled}`); + try { - const found = ( - await Promise.all( - (Object.keys(appIcon.unlockingNFTs) as TokenGateCheckerNetwork[]).map(async network => { - const nfts = appIcon.unlockingNFTs[network]; - if (!nfts) return; - logger.debug(`[unlockableAppIconCheck]: Checking ${appIconKey} on network ${network}`); - return await checkIfWalletsOwnNft(nfts, network, walletsToCheck); - }) - ) - ).some(result => !!result); + const promises = (Object.keys(appIcon.unlockingNFTs) as TokenGateCheckerNetwork[]).map(network => { + const nfts = appIcon.unlockingNFTs[network]; + if (!nfts) return; + logger.debug(`[unlockableAppIconCheck]: Checking ${appIconKey} on network ${network}`); + const non1155s: EthereumAddress[] = []; + const all1155s: TokenInfo[] = []; + + const values = Object.values(nfts); + values.forEach(value => { + if (typeof value === 'string') { + non1155s.push(value); + } else { + all1155s.push(value); + } + }); + const allChecks = []; + if (non1155s.length > 0) { + allChecks.push(checkIfWalletsOwnNft(non1155s, network, walletsToCheck)); + } + if (all1155s.length > 0) { + allChecks.push(checkIfWalletsOwnNft1155(all1155s, network, walletsToCheck)); + } + return allChecks; + }); + + const allPromises = promises.flat(); + const results = await Promise.all(allPromises); + + const found = results.some(result => !!result); + if (!found) { + unlockableAppIconStorage.set(appIconKey, false); + } logger.debug(`[unlockableAppIconCheck]: ${appIconKey} check result: ${found}`); @@ -47,6 +69,27 @@ export const unlockableAppIconCheck = async (appIconKey: UnlockableAppIconKey, w if (found) { unlockableAppIconStorage.set(appIconKey, true); logger.debug(`[unlockableAppIconCheck]: Feature check ${appIconKey} set to true. Wont show up anymore!`); + + // Temporarily ignore some icons + // We can get rid of this in 2025! + const iconsToIgnore = [ + 'optimism', + 'smol', + 'zora', + 'golddoge', + 'raindoge', + 'pooly', + 'finiliar', + 'zorb', + 'poolboy', + 'adworld', + 'farcaster', + ]; + + if (iconsToIgnore.includes(appIconKey)) { + return false; + } + Navigation.handleAction(Routes.APP_ICON_UNLOCK_SHEET, { appIconKey }); return true; } diff --git a/src/graphql/queries/arc.graphql b/src/graphql/queries/arc.graphql index 024b3973201..68e797864e5 100644 --- a/src/graphql/queries/arc.graphql +++ b/src/graphql/queries/arc.graphql @@ -514,8 +514,24 @@ mutation trackFeaturedResult( } } -query trendingTokens($chainId: Int) { - trendingTokens(chainId: $chainId) { +query trendingTokens( + $chainId: Int + $currency: String + $timeframe: Timeframe + $category: TrendingCategory + $sortBy: TrendingSort + $sortDirection: SortDirection + $walletAddress: String +) { + trendingTokens( + chainId: $chainId + currency: $currency + timeframe: $timeframe + category: $category + sortBy: $sortBy + sortDirection: $sortDirection + walletAddress: $walletAddress + ) { data { colors { primary @@ -564,6 +580,51 @@ query trendingTokens($chainId: Int) { } updated_at } + trending { + rank + trending_since + pool_data { + currency_used + reserve + m5_volume + h1_volume + h6_volume + h24_volume + m5_price_change + h1_price_change + h6_price_change + h24_price_change + } + swap_data { + currency_used + bought_stats { + unique_users + total_transactions + total_volume + farcaster_users { + fid + username + pfp_url + follower_count + following_count + power_badge + } + } + sold_stats { + unique_users + total_transactions + total_volume + farcaster_users { + fid + username + pfp_url + follower_count + following_count + power_badge + } + } + } + } bridging { bridgeable networks { diff --git a/src/helpers/buildWalletSections.tsx b/src/helpers/buildWalletSections.tsx index b498081c0f5..b7ad6089c6c 100644 --- a/src/helpers/buildWalletSections.tsx +++ b/src/helpers/buildWalletSections.tsx @@ -223,7 +223,7 @@ const withBriefBalanceSection = ( type: 'PROFILE_NAME_ROW_SPACE_AFTER', uid: 'profile-name-space-after', }, - ...(!hasTokens && !isLoadingUserAssets && !isLoadingBalance + ...(!hasTokens && !isLoadingBalance ? [] : [ { diff --git a/src/hooks/useAccountAsset.ts b/src/hooks/useAccountAsset.ts index 2d2bccc2699..0e5ba4a00e3 100644 --- a/src/hooks/useAccountAsset.ts +++ b/src/hooks/useAccountAsset.ts @@ -1,11 +1,11 @@ import { NativeCurrencyKey } from '@/entities'; import useAccountSettings from './useAccountSettings'; import { parseAssetNative } from '@/parsers'; -import { useUserAsset } from '@/resources/assets/useUserAsset'; +import { useUserAssetsStore } from '@/state/assets/userAssets'; // this is meant to be used for assets contained in the current wallet export default function useAccountAsset(uniqueId: string, nativeCurrency: NativeCurrencyKey | undefined = undefined) { - const { data: accountAsset } = useUserAsset(uniqueId); + const accountAsset = useUserAssetsStore(state => state.getLegacyUserAsset(uniqueId)); // this is temporary for FastBalanceCoinRow to make a tiny bit faster // we pass nativeCurrency only in that case diff --git a/src/hooks/useColorForAsset.ts b/src/hooks/useColorForAsset.ts index bfaf954e388..21eab85420b 100644 --- a/src/hooks/useColorForAsset.ts +++ b/src/hooks/useColorForAsset.ts @@ -19,6 +19,10 @@ export default function useColorForAsset( const isDarkMode = forceLightMode || isDarkModeTheme; const colorDerivedFromAddress = useMemo(() => { + if (!resolvedAddress) { + return undefined; + } + const color = isETH(resolvedAddress) ? isDarkMode ? forceETHColor diff --git a/src/hooks/useFarcasterAccountForWallets.ts b/src/hooks/useFarcasterAccountForWallets.ts new file mode 100644 index 00000000000..4c5702051b7 --- /dev/null +++ b/src/hooks/useFarcasterAccountForWallets.ts @@ -0,0 +1,64 @@ +import { queryClient } from '@/react-query'; +import useWallets from './useWallets'; +import { useEffect, useMemo, useState } from 'react'; +import { addysSummaryQueryKey, useAddysSummary } from '@/resources/summary/summary'; +import { Address } from 'viem'; +import useAccountSettings from './useAccountSettings'; +import store from '@/redux/store'; +import { isEmpty } from 'lodash'; +import walletTypes from '@/helpers/walletTypes'; +import { isLowerCaseMatch } from '@/utils'; +import { AllRainbowWallets } from '@/model/wallet'; + +type SummaryData = ReturnType['data']; + +const getWalletForAddress = (wallets: AllRainbowWallets, address: string) => { + return Object.values(wallets || {}).find(wallet => wallet.addresses.some(addr => isLowerCaseMatch(addr.address, address))); +}; + +export const useFarcasterWalletAddress = () => { + const [farcasterWalletAddress, setFarcasterWalletAddress] = useState(null); + const { accountAddress } = useAccountSettings(); + const { wallets } = useWallets(); + + const allAddresses = useMemo( + () => Object.values(wallets || {}).flatMap(wallet => (wallet.addresses || []).map(account => account.address as Address)), + [wallets] + ); + + useEffect(() => { + const summaryData = queryClient.getQueryData( + addysSummaryQueryKey({ + addresses: allAddresses, + currency: store.getState().settings.nativeCurrency, + }) + ); + if (isEmpty(summaryData?.data.addresses) || isEmpty(wallets)) { + setFarcasterWalletAddress(null); + return; + } + + const selectedAddressFid = summaryData?.data.addresses[accountAddress as Address]?.meta?.farcaster?.fid; + + if (selectedAddressFid && getWalletForAddress(wallets || {}, accountAddress)?.type !== walletTypes.readOnly) { + setFarcasterWalletAddress(accountAddress); + return; + } + + const farcasterWalletAddress = Object.keys(summaryData?.data.addresses || {}).find(addr => { + const address = addr as Address; + const faracsterId = summaryData?.data.addresses[address]?.meta?.farcaster?.fid; + if (faracsterId && getWalletForAddress(wallets || {}, address)?.type !== walletTypes.readOnly) { + return faracsterId; + } + }); + + if (farcasterWalletAddress) { + setFarcasterWalletAddress(farcasterWalletAddress); + return; + } + setFarcasterWalletAddress(null); + }, [wallets, allAddresses, accountAddress]); + + return farcasterWalletAddress; +}; diff --git a/src/hooks/useRefreshAccountData.ts b/src/hooks/useRefreshAccountData.ts index 388dfc2fcc3..fd2ffbb4b87 100644 --- a/src/hooks/useRefreshAccountData.ts +++ b/src/hooks/useRefreshAccountData.ts @@ -6,8 +6,7 @@ import useAccountSettings from './useAccountSettings'; import { PROFILES, useExperimentalFlag } from '@/config'; import { logger, RainbowError } from '@/logger'; import { queryClient } from '@/react-query'; -import { userAssetsQueryKey } from '@/resources/assets/UserAssetsQuery'; -import { userAssetsQueryKey as swapsUserAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; +import { userAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; import { invalidateAddressNftsQueries } from '@/resources/nfts'; import { positionsQueryKey } from '@/resources/defi/PositionsQuery'; import { Address } from 'viem'; @@ -35,9 +34,8 @@ export default function useRefreshAccountData() { queryClient.invalidateQueries(positionsQueryKey({ address: accountAddress as Address, currency: nativeCurrency })); queryClient.invalidateQueries(claimablesQueryKey({ address: accountAddress, currency: nativeCurrency })); queryClient.invalidateQueries(addysSummaryQueryKey({ addresses: allAddresses, currency: nativeCurrency })); - queryClient.invalidateQueries(userAssetsQueryKey({ address: accountAddress, currency: nativeCurrency, connectedToHardhat })); queryClient.invalidateQueries( - swapsUserAssetsQueryKey({ address: accountAddress as Address, currency: nativeCurrency, testnetMode: !!connectedToHardhat }) + userAssetsQueryKey({ address: accountAddress, currency: nativeCurrency, testnetMode: connectedToHardhat }) ); try { diff --git a/src/hooks/useSearchCurrencyList.ts b/src/hooks/useSearchCurrencyList.ts index 6c414079be7..f3dfca25865 100644 --- a/src/hooks/useSearchCurrencyList.ts +++ b/src/hooks/useSearchCurrencyList.ts @@ -87,15 +87,24 @@ const useSearchCurrencyList = (searchQuery: string, searchChainId = ChainId.main const [verifiedAssets, setVerifiedAssets] = useState([]); const [fetchingCrosschainAssets, setFetchingCrosschainAssets] = useState(false); const [crosschainVerifiedAssets, setCrosschainVerifiedAssets] = useState({ - [ChainId.mainnet]: [], - [ChainId.optimism]: [], - [ChainId.polygon]: [], - [ChainId.bsc]: [], + [ChainId.apechain]: [], [ChainId.arbitrum]: [], - [ChainId.base]: [], [ChainId.avalanche]: [], + [ChainId.base]: [], + [ChainId.bsc]: [], [ChainId.blast]: [], - [ChainId.apechain]: [], + [ChainId.degen]: [], + [ChainId.gnosis]: [], + [ChainId.gravity]: [], + [ChainId.ink]: [], + [ChainId.linea]: [], + [ChainId.mainnet]: [], + [ChainId.optimism]: [], + [ChainId.polygon]: [], + [ChainId.sanko]: [], + [ChainId.scroll]: [], + [ChainId.zksync]: [], + [ChainId.zora]: [], }); const crosschainSwapsEnabled = useExperimentalFlag(CROSSCHAIN_SWAPS); diff --git a/src/hooks/useWalletBalances.ts b/src/hooks/useWalletBalances.ts index ac16985a623..fbafc1c909e 100644 --- a/src/hooks/useWalletBalances.ts +++ b/src/hooks/useWalletBalances.ts @@ -6,7 +6,7 @@ import { useAddysSummary } from '@/resources/summary/summary'; import { useQueries } from '@tanstack/react-query'; import { fetchPositions, positionsQueryKey } from '@/resources/defi/PositionsQuery'; import { RainbowPositions } from '@/resources/defi/types'; -import { add, convertAmountToNativeDisplay, subtract } from '@/helpers/utilities'; +import { add, convertAmountToNativeDisplay } from '@/helpers/utilities'; import { queryClient } from '@/react-query'; const QUERY_CONFIG = { diff --git a/src/hooks/useWalletSectionsData.ts b/src/hooks/useWalletSectionsData.ts index db186edc714..a8f6072f1ea 100644 --- a/src/hooks/useWalletSectionsData.ts +++ b/src/hooks/useWalletSectionsData.ts @@ -9,14 +9,13 @@ import useSendableUniqueTokens from './useSendableUniqueTokens'; import useShowcaseTokens from './useShowcaseTokens'; import useWallets from './useWallets'; import { buildBriefWalletSectionsSelector } from '@/helpers/buildWalletSections'; -import { useSortedUserAssets } from '@/resources/assets/useSortedUserAssets'; import { useLegacyNFTs } from '@/resources/nfts'; import useWalletsWithBalancesAndNames from './useWalletsWithBalancesAndNames'; +import { useUserAssetsStore } from '@/state/assets/userAssets'; import { useRemoteConfig } from '@/model/remoteConfig'; import { usePositions } from '@/resources/defi/PositionsQuery'; import { useClaimables } from '@/resources/addys/claimables/query'; import { useExperimentalConfig } from '@/config/experimentalHooks'; -import { useUserAssetsStore } from '@/state/assets/userAssets'; import { analyticsV2 } from '@/analytics'; import { Claimable } from '@/resources/addys/claimables/types'; import { throttle } from 'lodash'; @@ -55,13 +54,16 @@ export default function useWalletSectionsData({ }: { type?: string; } = {}) { + const { accountAddress, language, network, nativeCurrency } = useAccountSettings(); const { selectedWallet, isReadOnlyWallet } = useWallets(); - const { isLoading: isLoadingUserAssets, data: sortedAssets = [] } = useSortedUserAssets(); + const { isLoadingUserAssets, sortedAssets = [] } = useUserAssetsStore(state => ({ + sortedAssets: state.legacyUserAssets, + isLoadingUserAssets: state.isLoadingUserAssets, + })); const isWalletEthZero = useIsWalletEthZero(); const { nftSort, nftSortDirection } = useNftSort(); - const { accountAddress, language, network, nativeCurrency } = useAccountSettings(); const { sendableUniqueTokens } = useSendableUniqueTokens(); const { data: { nfts: allUniqueTokens }, diff --git a/src/hooks/useWalletsHiddenBalances.ts b/src/hooks/useWalletsHiddenBalances.ts index 724ff266ab5..fccff352bd9 100644 --- a/src/hooks/useWalletsHiddenBalances.ts +++ b/src/hooks/useWalletsHiddenBalances.ts @@ -1,35 +1,20 @@ import { AllRainbowWallets } from '@/model/wallet'; import { useMemo, useState, useEffect, useCallback } from 'react'; import { Address } from 'viem'; -import useAccountSettings from './useAccountSettings'; -import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; -import { NativeCurrencyKey } from '@/entities/nativeCurrencyTypes'; import { userAssetsStore } from '@/state/assets/userAssets'; import { queryClient } from '@/react-query'; -import { userAssetsQueryKey, UserAssetsResult } from '@/resources/assets/UserAssetsQuery'; -import { convertAmountAndPriceToNativeDisplay, add, isEqual, multiply } from '@/helpers/utilities'; +import { add, isEqual, multiply } from '@/helpers/utilities'; import { isEqual as _isEqual } from 'lodash'; export type WalletBalanceResult = { hiddenBalances: Record; }; -const getHiddenAssetBalance = ({ - address, - nativeCurrency, - connectedToHardhat, -}: { - address: Address; - nativeCurrency: NativeCurrencyKey; - connectedToHardhat: boolean; -}) => { +const getHiddenAssetBalance = ({ address }: { address: Address }) => { const hiddenAssetIds = userAssetsStore.getState(address).getHiddenAssetsIds(); - const assetData = queryClient.getQueryData( - userAssetsQueryKey({ address, currency: nativeCurrency, connectedToHardhat }) - ); const balance = hiddenAssetIds.reduce((acc, uniqueId) => { - const asset = assetData?.[uniqueId]; + const asset = userAssetsStore.getState(address).getUserAsset(uniqueId); if (!asset) return acc; const assetNativeBalance = multiply(asset.price?.value || 0, asset.balance?.amount || 0); return add(acc, assetNativeBalance); @@ -39,8 +24,6 @@ const getHiddenAssetBalance = ({ }; const useWalletsHiddenBalances = (wallets: AllRainbowWallets): WalletBalanceResult => { - const { nativeCurrency } = useAccountSettings(); - const connectedToHardhat = useConnectedToHardhatStore(state => state.connectedToHardhat); const [hiddenBalances, setHiddenBalances] = useState>({}); const allAddresses = useMemo( @@ -48,24 +31,21 @@ const useWalletsHiddenBalances = (wallets: AllRainbowWallets): WalletBalanceResu [wallets] ); - const calculateHiddenBalanceForAddress = useCallback( - (address: Address) => { - const lowerCaseAddress = address.toLowerCase() as Address; - const hiddenAssetBalance = getHiddenAssetBalance({ address, nativeCurrency, connectedToHardhat }); + const calculateHiddenBalanceForAddress = useCallback((address: Address) => { + const lowerCaseAddress = address.toLowerCase() as Address; + const hiddenAssetBalance = getHiddenAssetBalance({ address }); - setHiddenBalances(prev => { - const newBalance = hiddenAssetBalance; - if (!prev[lowerCaseAddress] || !isEqual(prev[lowerCaseAddress], newBalance)) { - return { - ...prev, - [lowerCaseAddress]: newBalance, - }; - } - return prev; - }); - }, - [nativeCurrency, connectedToHardhat] - ); + setHiddenBalances(prev => { + const newBalance = hiddenAssetBalance; + if (!prev[lowerCaseAddress] || !isEqual(prev[lowerCaseAddress], newBalance)) { + return { + ...prev, + [lowerCaseAddress]: newBalance, + }; + } + return prev; + }); + }, []); useEffect(() => { allAddresses.forEach(address => { @@ -97,7 +77,7 @@ const useWalletsHiddenBalances = (wallets: AllRainbowWallets): WalletBalanceResu subscriptions.forEach(sub => sub()); unsubscribeFromQueryCache(); }; - }, [allAddresses, calculateHiddenBalanceForAddress, connectedToHardhat, nativeCurrency]); + }, [allAddresses, calculateHiddenBalanceForAddress]); return { hiddenBalances }; }; diff --git a/src/hooks/useWatchPendingTxs.ts b/src/hooks/useWatchPendingTxs.ts index f939d6e408b..517185d1407 100644 --- a/src/hooks/useWatchPendingTxs.ts +++ b/src/hooks/useWatchPendingTxs.ts @@ -1,8 +1,7 @@ import { useMemo, useCallback } from 'react'; import useAccountSettings from './useAccountSettings'; +import { userAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; import { RainbowTransaction, MinedTransaction, TransactionStatus } from '@/entities'; -import { userAssetsQueryKey } from '@/resources/assets/UserAssetsQuery'; -import { userAssetsQueryKey as swapsUserAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; import { transactionFetchQuery } from '@/resources/transactions/transaction'; import { RainbowError, logger } from '@/logger'; import { consolidatedTransactionsQueryKey } from '@/resources/transactions/consolidatedTransactions'; @@ -32,14 +31,7 @@ export const useWatchPendingTransactions = ({ address }: { address: string }) => userAssetsQueryKey({ address, currency: nativeCurrency, - connectedToHardhat, - }) - ); - queryClient.invalidateQueries( - swapsUserAssetsQueryKey({ - address: address as Address, - currency: nativeCurrency, - testnetMode: !!connectedToHardhat, + testnetMode: connectedToHardhat, }) ); invalidateAddressNftsQueries(address); @@ -123,7 +115,7 @@ export const useWatchPendingTransactions = ({ address }: { address: string }) => }); queryClient.refetchQueries({ - queryKey: userAssetsQueryKey({ address, currency: nativeCurrency, connectedToHardhat }), + queryKey: userAssetsQueryKey({ address, currency: nativeCurrency, testnetMode: connectedToHardhat }), }); const supportedMainnetChainIds = useBackendNetworksStore.getState().getSupportedMainnetChainIds(); diff --git a/src/languages/en_US.json b/src/languages/en_US.json index c788bbc02b9..22f790f1f88 100644 --- a/src/languages/en_US.json +++ b/src/languages/en_US.json @@ -875,6 +875,8 @@ "adworld_title": "Welcome to Rainbow World!", "farcaster_description": "Our most boring app icon ever, inspired by Warpcast's bland minimalism.", "farcaster_title": "You've unlocked\nRainbowcast", + "redacted_description": "A stupi-exclusive Rainbow icon for the true Gdupi enjoyers.", + "redacted_title": "You've unlocked\n Redacted Rainbow", "button": "Snag the icon" }, "explain": { @@ -945,41 +947,69 @@ "text": "The miner tip goes directly to the miner who confirms your transaction on the network.\n\nA higher tip makes your transaction more likely to be confirmed quickly.", "title": "Miner tip" }, - "optimism": { - "text": "Optimism is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.\n\nIt bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum.", - "title": "What's Optimism?" + "apechain": { + "text": "ApeChain is a Layer 3 network that runs on top of Arbitrum Orbit and Ethereum.\n\nIt significantly enhances ApeCoin's utility, fostering a robust and dynamic economy driven by $APE.", + "title": "What's ApeChain?" + }, + "avalanche": { + "text": "Avalanche is a sidechain, a distinct network that runs alongside Ethereum and is compatible with it.\n\nIt allows for cheaper and faster transactions, but unlike Layer 2 networks, Avalanche has its own security and consensus mechanisms that differ from Ethereum.", + "title": "What's Avalanche?" }, "base": { "text": "Base is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.\n\nIt bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum.", "title": "What's Base?" }, - "avalanche": { - "text": "Avalanche is a sidechain, a distinct network that runs alongside Ethereum and is compatible with it.\n\nIt allows for cheaper and faster transactions, but unlike Layer 2 networks, Avalanche has its own security and consensus mechanisms that differ from Ethereum.", - "title": "What's Avalanche?" + "blast": { + "text": "Blast is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.\n\nIt bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum.", + "title": "What's Blast?" + }, + "bsc": { + "text": "Binance Smart Chain (BSC) is the blockchain for the trading platform Binance. \n\nBSC allows for cheaper and faster transactions, but unlike a Layer 2 network, it has its own security and consensus mechanisms that differ from Ethereum.", + "title": "What's Binance Smart Chain?" }, "degen": { "text": "Degen Chain is a Layer 3 network that runs on top of Arbitrum Orbit and Ethereum.", "title": "What's Degen Chain?" }, - "blast": { - "text": "Blast is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.\n\nIt bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum.", - "title": "What's Blast?" + "gravity": { + "text": "Gravity is a high-performance Layer 1 blockchain built by Galxe, achieving over one gigagas per second throughput and sub-second finality.\n\nIt utilizes a pipelined AptosBFT consensus engine and a parallel EVM runtime, maintaining Proof-of-Stake security through restaking technology.", + "title": "What's Gravity?" }, - "apechain": { - "text": "ApeChain is a Layer 3 network that runs on top of Arbitrum Orbit and Ethereum.\n\nIt significantly enhances ApeCoin's utility, fostering a robust and dynamic economy driven by $APE.", - "title": "What's ApeChain?" + "gnosis": { + "text": "Gnosis Chain is a community-owned Ethereum sidechain operated by a diverse set of validators worldwide.\n\nIt focuses on resilience and credible neutrality, offering cheaper and faster transactions while maintaining its own security and consensus mechanisms.", + "title": "What's Gnosis?" }, - "zora": { - "text": "Zora is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.\n\nIt bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum.", - "title": "What's Zora?" + "ink": { + "text": "Ink is a Layer 2 network built on the OP Stack, designed to scale Ethereum by providing sub-second block times and low transaction fees.\n\nUnleashed by Kraken, and part of the Superchain, Ink aims to enhance performance and accessibility for decentralized finance (DeFi) applications.", + "title": "What's Ink?" + }, + "linea": { + "text": "Linea is a secure, low-cost, Ethereum-equivalent Layer 2 blockchain developed by ConsenSys.\n\nIt enables faster and more affordable transactions without compromising security and decentralization, aiming to onboard the next billion users to web3.", + "title": "What's Linea?" + }, + "optimism": { + "text": "Optimism is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.\n\nIt bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum.", + "title": "What's Optimism?" }, "polygon": { "text": "Polygon is a sidechain, a distinct network that runs alongside Ethereum and is compatible with it.\n\nIt allows for cheaper and faster transactions, but unlike Layer 2 networks, Polygon has its own security and consensus mechanisms that differ from Ethereum.", "title": "What's Polygon?" }, - "bsc": { - "text": "Binance Smart Chain (BSC) is the blockchain for the trading platform Binance. \n\nBSC allows for cheaper and faster transactions, but unlike a Layer 2 network, it has its own security and consensus mechanisms that differ from Ethereum.", - "title": "What's Binance Smart Chain?" + "scroll": { + "text": "Scroll is a Layer 2 solution built atop Ethereum, aiming to enhance scalability and transaction efficiency.\n\nIt employs roll-up technology to bundle transactions, which are then submitted to Ethereum, benefiting from its security infrastructure.", + "title": "What's Scroll?" + }, + "sanko": { + "text": "Sanko is a Layer 3 network that runs on top of Arbitrum and Ethereum, focusing on NFTs and gaming.\n\nIt uses AnyTrust Data Availability and fraud proofs for state validation, allowing for faster and cheaper transactions while leveraging Ethereum's security. Sanko features a native token called DMT and employs whitelisted validators for proposing and challenging state roots.", + "title": "What's Sanko?" + }, + "zksync": { + "text": "ZKsync is a Layer 2 protocol designed to scale Ethereum using advanced zero-knowledge cryptographic proofs.\n\nIt enhances Ethereum’s throughput while maintaining decentralization and security, enabling faster and cheaper transactions.", + "title": "What's Zksync?" + }, + "zora": { + "text": "Zora is a Layer 2 network that runs on top of Ethereum, enabling cheaper and faster transactions while still benefiting from the underlying security of Ethereum.\n\nIt bundles lots of transactions together in a \"roll up\" before sending them down to live permanently on Ethereum.", + "title": "What's Zora?" }, "read_more": "Read More", "learn_more": "Learn More", diff --git a/src/model/migrations.ts b/src/model/migrations.ts index c4d2c706db7..bfd41f7b887 100644 --- a/src/model/migrations.ts +++ b/src/model/migrations.ts @@ -39,8 +39,13 @@ import { EthereumAddress, RainbowToken } from '@/entities'; import { standardizeUrl, useFavoriteDappsStore } from '@/state/browser/favoriteDappsStore'; import { useLegacyFavoriteDappsStore } from '@/state/legacyFavoriteDapps'; import { getAddressAndChainIdFromUniqueId, getUniqueId, getUniqueIdNetwork } from '@/utils/ethereumUtils'; -import { UniqueId } from '@/__swaps__/types/assets'; +import { ParsedAssetsDictByChain, ParsedSearchAsset, UniqueId } from '@/__swaps__/types/assets'; import { userAssetsStore } from '@/state/assets/userAssets'; +import { userAssetsQueryKey } from '@/__swaps__/screens/Swap/resources/assets/userAssets'; +import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; +import { selectorFilterByUserChains, selectUserAssetsList } from '@/__swaps__/screens/Swap/resources/_selectors/assets'; +import { UnlockableAppIconKey, unlockableAppIcons } from '@/appIcons/appIcons'; +import { unlockableAppIconStorage } from '@/featuresToUnlock/unlockableAppIconCheck'; export default async function runMigrations() { // get current version @@ -696,6 +701,50 @@ export default async function runMigrations() { migrations.push(v21); + /** + *************** Migration v22 ****************** + * Reset icon checks + */ + const v22 = async () => { + // For each appIcon, delete the handled flag + (Object.keys(unlockableAppIcons) as UnlockableAppIconKey[]).map(appIconKey => { + unlockableAppIconStorage.delete(appIconKey); + logger.debug('Resetting icon status for ' + appIconKey); + }); + }; + + migrations.push(v22); + + /** + *************** Migration v23 ****************** + * Populate `legacyUserAssets` attribute in `userAssetsStore` + */ + const v23 = async () => { + const state = store.getState(); + const { wallets } = state.wallets; + const { nativeCurrency } = state.settings; + + if (!wallets) return; + + for (const wallet of Object.values(wallets)) { + for (const { address } of (wallet as RainbowWallet).addresses) { + const { connectedToHardhat } = useConnectedToHardhatStore.getState(); + const queryKey = userAssetsQueryKey({ address, currency: nativeCurrency, testnetMode: connectedToHardhat }); + const queryData: ParsedAssetsDictByChain | undefined = queryClient.getQueryData(queryKey); + + if (!queryData) continue; + + const userAssets = selectorFilterByUserChains({ + data: queryData, + selector: selectUserAssetsList, + }); + userAssetsStore.getState(address).setUserAssets(userAssets as ParsedSearchAsset[]); + } + } + }; + + migrations.push(v23); + logger.debug(`[runMigrations]: ready to run migrations starting on number ${currentVersion}`); // await setMigrationVersion(17); if (migrations.length === currentVersion) { diff --git a/src/model/remoteConfig.ts b/src/model/remoteConfig.ts index 59e5b6dbcbb..40382af707b 100644 --- a/src/model/remoteConfig.ts +++ b/src/model/remoteConfig.ts @@ -65,12 +65,19 @@ export const DEFAULT_CONFIG: RainbowConfig = { arbitrum: 200, avalanche: 200, base: 200, - blast: 200, bsc: 200, + blast: 200, degen: 200, + gnosis: 200, + gravity: 200, + ink: 200, + linea: 200, mainnet: 100, optimism: 200, polygon: 200, + sanko: 200, + scroll: 200, + zksync: 200, zora: 200, }), default_slippage_bips_chainId: JSON.stringify({ diff --git a/src/raps/actions/swap.ts b/src/raps/actions/swap.ts index deeb8c5658d..7bcf02a9173 100644 --- a/src/raps/actions/swap.ts +++ b/src/raps/actions/swap.ts @@ -3,11 +3,11 @@ import { Transaction } from '@ethersproject/transactions'; import { CrosschainQuote, Quote, - ChainId as SwapChainId, SwapType, fillQuote, getQuoteExecutionDetails, getRainbowRouterContractAddress, + getWrappedAssetAddress, getWrappedAssetMethod, unwrapNativeAsset, wrapNativeAsset, @@ -138,7 +138,7 @@ export const estimateSwapGasLimit = async ({ from: quote.from, value: isWrapNativeAsset ? quote.buyAmount.toString() : '0', }, - getWrappedAssetMethod(isWrapNativeAsset ? 'deposit' : 'withdraw', provider, chainId as unknown as SwapChainId), + getWrappedAssetMethod(isWrapNativeAsset ? 'deposit' : 'withdraw', provider, getWrappedAssetAddress(quote)), isWrapNativeAsset ? [] : [quote.buyAmount.toString()], provider, WRAP_GAS_PADDING @@ -285,10 +285,10 @@ export const executeSwap = async ({ // Wrap Eth if (quote.swapType === SwapType.wrap) { - return wrapNativeAsset(quote.buyAmount, wallet, chainId as unknown as SwapChainId, transactionParams); + return wrapNativeAsset(quote.buyAmount, wallet, getWrappedAssetAddress(quote), transactionParams); // Unwrap Weth } else if (quote.swapType === SwapType.unwrap) { - return unwrapNativeAsset(quote.sellAmount, wallet, chainId as unknown as SwapChainId, transactionParams); + return unwrapNativeAsset(quote.sellAmount, wallet, getWrappedAssetAddress(quote), transactionParams); // Swap } else { return fillQuote(quote, transactionParams, wallet, permit, chainId as number, REFERRER); diff --git a/src/raps/execute.ts b/src/raps/execute.ts index fa8fed28cab..08502a53aaf 100644 --- a/src/raps/execute.ts +++ b/src/raps/execute.ts @@ -117,30 +117,7 @@ function getRapFullName(actions: RapAction[]) { const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); -const NODE_ACK_MAX_TRIES = 10; - -const waitForNodeAck = async (hash: string, provider: Signer['provider'], tries = 0): Promise => { - try { - const tx = await provider?.getTransaction(hash); - - // This means the node is aware of the tx, we're good to go - if ((tx && tx.blockNumber === null) || (tx && tx?.blockNumber && tx?.blockNumber > 0)) { - return; - } - - // Wait for 1 second and try again - if (tries < NODE_ACK_MAX_TRIES) { - await delay(1000); - return waitForNodeAck(hash, provider, tries + 1); - } - } catch (e) { - // Wait for 1 second and try again - if (tries < NODE_ACK_MAX_TRIES) { - await delay(1000); - return waitForNodeAck(hash, provider, tries + 1); - } - } -}; +const NODE_ACK_DELAY = 500; export const walletExecuteRap = async ( wallet: Signer, @@ -177,12 +154,13 @@ export const walletExecuteRap = async ( }; const { baseNonce, errorMessage: error, hash: firstHash } = await executeAction(actionParams); - const shouldWaitForNodeAck = parameters.chainId !== ChainId.mainnet; + const shouldDelayForNodeAck = parameters.chainId !== ChainId.mainnet; if (typeof baseNonce === 'number') { let latestHash = firstHash; for (let index = 1; index < actions.length; index++) { - latestHash && shouldWaitForNodeAck && (await waitForNodeAck(latestHash, wallet.provider)); + latestHash && shouldDelayForNodeAck && (await delay(NODE_ACK_DELAY)); + const action = actions[index]; const actionParams = { action, diff --git a/src/references/token-gate-checker-abi.json b/src/references/token-gate-checker-abi.json index 8f9b9601bb7..7df67fcc8c5 100644 --- a/src/references/token-gate-checker-abi.json +++ b/src/references/token-gate-checker-abi.json @@ -2,11 +2,25 @@ { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, + { "internalType": "address[]", "name": "potentialOwners", "type": "address[]" } + ], + "name": "areOwners", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address[]", - "name": "potentialOwners", - "type": "address[]" - } + "components": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "uint256", "name": "id", "type": "uint256" } + ], + "internalType": "struct NftChecker.TokenInfo[]", + "name": "targets", + "type": "tuple[]" + }, + { "internalType": "address[]", "name": "potentialOwners", "type": "address[]" } ], "name": "areOwners", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], diff --git a/src/resources/assets/UserAssetsQuery.ts b/src/resources/assets/UserAssetsQuery.ts deleted file mode 100644 index 5616163e903..00000000000 --- a/src/resources/assets/UserAssetsQuery.ts +++ /dev/null @@ -1,222 +0,0 @@ -import isEmpty from 'lodash/isEmpty'; -import { ADDYS_API_KEY } from 'react-native-dotenv'; -import { NativeCurrencyKey } from '@/entities'; -import { saveAccountEmptyState } from '@/handlers/localstorage/accountLocal'; -import { greaterThan } from '@/helpers/utilities'; -import { rainbowFetch } from '@/rainbow-fetch'; -import { createQueryKey, queryClient, QueryConfigWithSelect, QueryFunctionArgs, QueryFunctionResult } from '@/react-query'; -import { useQuery } from '@tanstack/react-query'; -import { filterPositionsData, parseAddressAsset } from './assets'; -import { fetchHardhatBalances } from './hardhatAssets'; -import { AddysAccountAssetsMeta, AddysAccountAssetsResponse, RainbowAddressAssets } from './types'; -import { Network } from '@/state/backendNetworks/types'; -import { staleBalancesStore } from '@/state/staleBalances'; -import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; - -// /////////////////////////////////////////////// -// Query Types - -export type UserAssetsArgs = { - address: string; // Address; - currency: NativeCurrencyKey; - connectedToHardhat: boolean; -}; - -// /////////////////////////////////////////////// -// Query Key - -export const userAssetsQueryKey = ({ address, currency, connectedToHardhat }: UserAssetsArgs) => - createQueryKey('userAssets', { address, currency, connectedToHardhat }, { persisterVersion: 1 }); - -type UserAssetsQueryKey = ReturnType; - -// /////////////////////////////////////////////// -// Query Function - -const fetchUserAssetsForChainIds = async ({ - address, - currency, - chainIds, - staleBalanceParam, -}: { - address: string; - currency: NativeCurrencyKey; - chainIds: number[]; - staleBalanceParam?: string; -}) => { - const chainIdsString = chainIds.join(','); - let url = `https://addys.p.rainbow.me/v3/${chainIdsString}/${address}/assets?currency=${currency.toLowerCase()}`; - - if (staleBalanceParam) { - url = url + staleBalanceParam; - } - - const response = await rainbowFetch(url, { - method: 'get', - headers: { - Authorization: `Bearer ${ADDYS_API_KEY}`, - }, - }); - - return response.data; -}; - -async function userAssetsQueryFunction({ - queryKey: [{ address, currency, connectedToHardhat }], -}: QueryFunctionArgs) { - const cache = queryClient.getQueryCache(); - const cachedAddressAssets = (cache.find(userAssetsQueryKey({ address, currency, connectedToHardhat }))?.state?.data || - {}) as RainbowAddressAssets; - - if (connectedToHardhat) { - const parsedHardhatResults = await fetchHardhatBalances(address); - return parsedHardhatResults; - } - - try { - staleBalancesStore.getState().clearExpiredData(address); - const staleBalanceParam = staleBalancesStore.getState().getStaleBalancesQueryParam(address); - - const { erroredChainIds, results } = await fetchAndParseUserAssetsForChainIds({ - address, - currency, - chainIds: useBackendNetworksStore.getState().getSupportedMainnetChainIds(), - staleBalanceParam, - }); - let parsedSuccessResults = results; - - // grab cached data for chain IDs with errors - if (!isEmpty(erroredChainIds)) { - const cachedDataForErroredChainIds = Object.keys(cachedAddressAssets) - .filter(uniqueId => { - const cachedAsset = cachedAddressAssets[uniqueId]; - return erroredChainIds?.find((chainId: number) => chainId === cachedAsset.chainId); - }) - .reduce((cur, uniqueId) => { - return Object.assign(cur, { - [uniqueId]: cachedAddressAssets[uniqueId], - }); - }, {}); - - parsedSuccessResults = { - ...parsedSuccessResults, - ...cachedDataForErroredChainIds, - }; - - retryErroredChainIds(address, currency, connectedToHardhat, erroredChainIds); - } - - return parsedSuccessResults; - } catch (e) { - return cachedAddressAssets; - } -} - -const retryErroredChainIds = async ( - address: string, - currency: NativeCurrencyKey, - connectedToHardhat: boolean, - erroredChainIds: number[] -) => { - const { meta, results } = await fetchAndParseUserAssetsForChainIds({ address, currency, chainIds: erroredChainIds }); - let parsedSuccessResults = results; - const successChainIds = meta?.chain_ids; - - if (isEmpty(successChainIds)) { - return; - } - - // grab cached data without data that will be replaced - const cache = queryClient.getQueryCache(); - const cachedAddressAssets = (cache.find(userAssetsQueryKey({ address, currency, connectedToHardhat }))?.state?.data || - {}) as RainbowAddressAssets; - - const cachedData = Object.keys(cachedAddressAssets) - .filter(uniqueId => { - const cachedAsset = cachedAddressAssets[uniqueId]; - return successChainIds?.find((chainId: number) => chainId !== cachedAsset.chainId); - }) - .reduce((cur, uniqueId) => { - return Object.assign(cur, { - [uniqueId]: cachedAddressAssets[uniqueId], - }); - }, {}); - - parsedSuccessResults = { - ...cachedData, - ...parsedSuccessResults, - }; - - queryClient.setQueryData(userAssetsQueryKey({ address, currency, connectedToHardhat }), parsedSuccessResults); -}; - -export type UserAssetsResult = QueryFunctionResult; - -interface AssetsAndMetadata { - erroredChainIds: number[]; - meta: AddysAccountAssetsMeta; - results: RainbowAddressAssets; -} - -const fetchAndParseUserAssetsForChainIds = async ({ - address, - currency, - chainIds, - staleBalanceParam, -}: { - address: string; - currency: NativeCurrencyKey; - chainIds: number[]; - staleBalanceParam?: string; -}): Promise => { - const data = await fetchUserAssetsForChainIds({ address, currency, chainIds, staleBalanceParam }); - let parsedSuccessResults = parseUserAssetsByChain(data); - - // filter out positions data - parsedSuccessResults = filterPositionsData(address, currency, parsedSuccessResults); - - // update account empty state - if (!isEmpty(parsedSuccessResults)) { - saveAccountEmptyState(false, address, Network.mainnet); - } - - const erroredChainIds = data?.meta?.chain_ids_with_errors; - return { erroredChainIds, meta: data?.meta, results: parsedSuccessResults }; -}; - -function parseUserAssetsByChain(message: AddysAccountAssetsResponse) { - return Object.values(message?.payload?.assets || {}).reduce((dict, assetData) => { - if (greaterThan(assetData?.quantity, 0)) { - const parsedAsset = parseAddressAsset({ - assetData, - }); - dict[parsedAsset?.uniqueId] = parsedAsset; - } - return dict; - }, {} as RainbowAddressAssets); -} - -// /////////////////////////////////////////////// -// Query Fetcher (Optional) - -export async function fetchUserAssets( - { address, currency, connectedToHardhat }: UserAssetsArgs, - config: QueryConfigWithSelect = {} -) { - return await queryClient.fetchQuery(userAssetsQueryKey({ address, currency, connectedToHardhat }), userAssetsQueryFunction, config); -} - -// /////////////////////////////////////////////// -// Query Hook - -export function useUserAssets( - { address, currency, connectedToHardhat }: UserAssetsArgs, - config: QueryConfigWithSelect = {} -) { - return useQuery(userAssetsQueryKey({ address, currency, connectedToHardhat }), userAssetsQueryFunction, { - enabled: !!address && !!currency, - staleTime: 60_000, // 1 minute - refetchInterval: 120_000, // 2 minutes - ...config, - }); -} diff --git a/src/resources/assets/assetSelectors.ts b/src/resources/assets/assetSelectors.ts deleted file mode 100644 index 41d6d2ba9e5..00000000000 --- a/src/resources/assets/assetSelectors.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { NativeCurrencyKey, ParsedAddressAsset } from '@/entities'; -import { parseAssetsNative } from '@/parsers'; -import isEmpty from 'lodash/isEmpty'; -import isNil from 'lodash/isNil'; -import { RainbowAddressAssets } from './types'; - -const EMPTY_ARRAY: any = []; - -export function selectUserAssetWithUniqueId(uniqueId: string) { - return (accountAssets: RainbowAddressAssets) => { - return accountAssets?.[uniqueId]; - }; -} - -export function selectSortedUserAssets(nativeCurrency: NativeCurrencyKey) { - return (accountAssets: RainbowAddressAssets) => { - return sortAssetsByNativeAmount(accountAssets, nativeCurrency); - }; -} - -const sortAssetsByNativeAmount = (accountAssets: RainbowAddressAssets, nativeCurrency: NativeCurrencyKey): ParsedAddressAsset[] => { - let assetsNativePrices = Object.values(accountAssets); - - if (!isEmpty(assetsNativePrices)) { - assetsNativePrices = parseAssetsNative(assetsNativePrices, nativeCurrency); - } - const { hasValue = EMPTY_ARRAY, noValue = EMPTY_ARRAY } = groupAssetsByMarketValue(assetsNativePrices); - - const sortedAssetsNoShitcoins = hasValue.sort((a: any, b: any) => { - const itemA = Number(a.native?.balance?.amount) ?? 0; - const itemB = Number(b.native?.balance?.amount) ?? 0; - - return itemA < itemB ? 1 : -1; - }); - - const sortedShitcoins = noValue.sort((a: any, b: any) => { - const itemA = a.name; - const itemB = b.name; - - return itemA > itemB ? 1 : -1; - }); - - const sortedAssets = sortedAssetsNoShitcoins.concat(sortedShitcoins); - - return sortedAssets; -}; - -const groupAssetsByMarketValue = (assets: any) => - assets.reduce( - (acc: any, asset: any) => { - if (isNil(asset.native)) { - acc.noValue.push(asset); - } else { - acc.hasValue.push(asset); - } - - return acc; - }, - { - hasValue: [], - noValue: [], - } - ); diff --git a/src/resources/assets/assets.ts b/src/resources/assets/assets.ts index 057963856bb..d64dacd9948 100644 --- a/src/resources/assets/assets.ts +++ b/src/resources/assets/assets.ts @@ -1,8 +1,8 @@ import lang from 'i18n-js'; -import isEmpty from 'lodash/isEmpty'; -import { NativeCurrencyKey, ParsedAddressAsset } from '@/entities'; import { isNativeAsset } from '@/handlers/assets'; import { convertRawAmountToBalance } from '@/helpers/utilities'; +import isEmpty from 'lodash/isEmpty'; +import { NativeCurrencyKey, ParsedAddressAsset } from '@/entities'; import { queryClient } from '@/react-query'; import { positionsQueryKey } from '@/resources/defi/PositionsQuery'; import { RainbowPositions } from '@/resources/defi/types'; diff --git a/src/resources/assets/useSortedUserAssets.ts b/src/resources/assets/useSortedUserAssets.ts deleted file mode 100644 index b7e80d92c71..00000000000 --- a/src/resources/assets/useSortedUserAssets.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { useAccountSettings } from '@/hooks'; -import { selectSortedUserAssets } from '@/resources/assets/assetSelectors'; -import { useUserAssets } from '@/resources/assets/UserAssetsQuery'; -import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; - -export function useSortedUserAssets() { - const { accountAddress, nativeCurrency } = useAccountSettings(); - const { connectedToHardhat } = useConnectedToHardhatStore(); - - return useUserAssets( - { - address: accountAddress, - currency: nativeCurrency, - connectedToHardhat, - }, - { - select: selectSortedUserAssets(nativeCurrency), - } - ); -} diff --git a/src/resources/assets/useUserAsset.ts b/src/resources/assets/useUserAsset.ts deleted file mode 100644 index 4ee1dea9de1..00000000000 --- a/src/resources/assets/useUserAsset.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ChainId } from '@/state/backendNetworks/types'; -import { useAccountSettings } from '@/hooks'; -import { useUserAssets } from '@/resources/assets/UserAssetsQuery'; -import { selectUserAssetWithUniqueId } from '@/resources/assets/assetSelectors'; -import { getUniqueId } from '@/utils/ethereumUtils'; -import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; -import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; - -export function useUserAsset(uniqueId: string) { - const { accountAddress, nativeCurrency } = useAccountSettings(); - const { connectedToHardhat } = useConnectedToHardhatStore(); - - return useUserAssets( - { - address: accountAddress, - currency: nativeCurrency, - connectedToHardhat, - }, - { - select: selectUserAssetWithUniqueId(uniqueId), - } - ); -} - -export function useUserNativeNetworkAsset(chainId: ChainId) { - const nativeCurrency = useBackendNetworksStore.getState().getChainsNativeAsset()[chainId]; - const { address } = nativeCurrency; - const uniqueId = getUniqueId(address, chainId); - return useUserAsset(uniqueId); -} diff --git a/src/resources/assets/useUserAssetCount.ts b/src/resources/assets/useUserAssetCount.ts deleted file mode 100644 index 7cf00ced409..00000000000 --- a/src/resources/assets/useUserAssetCount.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useAccountSettings } from '@/hooks'; -import { useUserAssets } from '@/resources/assets/UserAssetsQuery'; -import { RainbowAddressAssets } from './types'; -import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; - -const countSelector = (accountAssets: RainbowAddressAssets) => accountAssets?.length; - -export function useUserAssetCount() { - const { accountAddress, nativeCurrency } = useAccountSettings(); - const { connectedToHardhat } = useConnectedToHardhatStore(); - - return useUserAssets( - { - address: accountAddress, - currency: nativeCurrency, - connectedToHardhat, - }, - { - select: countSelector, - } - ); -} diff --git a/src/resources/summary/summary.ts b/src/resources/summary/summary.ts index 6f902a391f0..cd0ef1d8542 100644 --- a/src/resources/summary/summary.ts +++ b/src/resources/summary/summary.ts @@ -16,6 +16,30 @@ interface AddysSummary { data: { addresses: { [key: Address]: { + meta: { + farcaster?: { + object: string; + fid: number; + username: string; + display_name: string; + pfp_url: string; + custody_address: string; + profile: { + Bio: { + text: string; + }; + }; + follower_count: number; + following_count: number; + verifications: string[]; + verified_addresses: { + eth_addresses: string[]; + sol_addresses: string[]; + }; + verified_accounts: string[]; + power_badge: boolean; + }; + }; summary: { native_balance_by_symbol: { [key in 'ETH' | 'MATIC' | 'BNB' | 'AVAX']: { diff --git a/src/screens/SendSheet.tsx b/src/screens/SendSheet.tsx index 81e870f7bfc..c634befe7b0 100644 --- a/src/screens/SendSheet.tsx +++ b/src/screens/SendSheet.tsx @@ -46,7 +46,6 @@ import { loadWallet, sendTransaction } from '@/model/wallet'; import { useNavigation } from '@/navigation/Navigation'; import { parseGasParamsForTransaction } from '@/parsers'; import { rainbowTokenList } from '@/references'; -import { useSortedUserAssets } from '@/resources/assets/useSortedUserAssets'; import Routes from '@/navigation/routesNames'; import styled from '@/styled-thing'; import { borders } from '@/styles'; @@ -129,7 +128,7 @@ type OnSubmitProps = { export default function SendSheet() { const { goBack, navigate } = useNavigation(); - const { data: sortedAssets } = useSortedUserAssets(); + const sortedAssets = useUserAssetsStore(state => state.legacyUserAssets); const { gasFeeParamsBySpeed, gasLimit, diff --git a/src/screens/claimables/transaction/context/TransactionClaimableContext.tsx b/src/screens/claimables/transaction/context/TransactionClaimableContext.tsx index 63c1ce771be..d25448ea23e 100644 --- a/src/screens/claimables/transaction/context/TransactionClaimableContext.tsx +++ b/src/screens/claimables/transaction/context/TransactionClaimableContext.tsx @@ -15,7 +15,6 @@ import { convertAmountToNativeDisplayWorklet, add, } from '@/helpers/utilities'; -import { useUserNativeNetworkAsset } from '@/resources/assets/useUserAsset'; import { GasSpeed } from '@/__swaps__/types/gas'; import { getGasSettingsBySpeed, useGasSettings } from '@/__swaps__/screens/Swap/hooks/useSelectedGas'; import { LegacyTransactionGasParamAmounts, TransactionGasParamAmounts } from '@/entities'; @@ -41,6 +40,7 @@ import { getRemoteConfig } from '@/model/remoteConfig'; import { estimateClaimUnlockSwapGasLimit } from '../estimateGas'; import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; import showWalletErrorAlert from '@/helpers/support'; +import { userAssetsStore } from '@/state/assets/userAssets'; enum ErrorMessages { SWAP_ERROR = 'Failed to swap claimed asset due to swap action error', @@ -141,8 +141,6 @@ export function TransactionClaimableContextProvider({ const gasSettings = useGasSettings(claimable.chainId, GasSpeed.FAST); - const { data: userNativeNetworkAsset, isLoading: isLoadingNativeNetworkAsset } = useUserNativeNetworkAsset(claimable.chainId); - const updateQuoteState = useCallback(async () => { if (!outputConfig?.token || !outputConfig.chainId || !outputTokenAddress) { logger.warn('[TransactionClaimableContext]: Somehow entered unreachable state in updateQuote'); @@ -220,11 +218,7 @@ export function TransactionClaimableContextProvider({ const provider = useMemo(() => getProvider({ chainId: claimable.chainId }), [claimable.chainId]); // make sure we have necessary data before attempting gas estimation - const canEstimateGas = !!( - !isLoadingNativeNetworkAsset && - gasSettings && - (!requiresSwap || (quoteState.quote && quoteState.status === 'success')) - ); + const canEstimateGas = !!(gasSettings && (!requiresSwap || (quoteState.quote && quoteState.status === 'success'))); const updateGasState = useCallback(async () => { try { @@ -252,12 +246,13 @@ export function TransactionClaimableContextProvider({ const gasFeeWei = calculateGasFeeWorklet(gasSettings, gasLimit); const nativeAsset = useBackendNetworksStore.getState().getChainsNativeAsset()[claimable.chainId]; + const userNativeAsset = userAssetsStore.getState().getNativeAssetForChain(claimable.chainId); const gasFeeNativeToken = formatUnits(safeBigInt(gasFeeWei), nativeAsset.decimals); - const userBalance = userNativeNetworkAsset?.balance?.amount || '0'; + const userBalance = userNativeAsset?.balance?.amount || '0'; const sufficientGas = lessThanOrEqualToWorklet(gasFeeNativeToken, userBalance); - const networkAssetPrice = userNativeNetworkAsset?.price?.value?.toString(); + const networkAssetPrice = userNativeAsset?.price?.value?.toString(); let gasFeeNativeCurrencyDisplay; if (!networkAssetPrice) { @@ -290,8 +285,6 @@ export function TransactionClaimableContextProvider({ accountAddress, quoteState.quote, gasSettings, - userNativeNetworkAsset?.balance?.amount, - userNativeNetworkAsset?.price?.value, gasState.status, nativeCurrency, ]); diff --git a/src/screens/points/content/PointsContent.tsx b/src/screens/points/content/PointsContent.tsx index 295336fc9ff..282e24ba181 100644 --- a/src/screens/points/content/PointsContent.tsx +++ b/src/screens/points/content/PointsContent.tsx @@ -476,9 +476,11 @@ const NextDistributionCountdown = ({ nextDistribution }: { nextDistribution: Dat const minuteStr = minutes ? `${minutes}m` : ''; return ( - - {`${dayStr} ${hourStr} ${minuteStr}`.trim()} - + + + {`${dayStr} ${hourStr} ${minuteStr}`.trim()} + + ); }; @@ -529,9 +531,7 @@ const NextDropCard = memo(function NextDropCard({ nextDistribution }: { nextDist overflow: 'hidden', }} > - - - + diff --git a/src/state/appSessions/index.ts b/src/state/appSessions/index.ts index ee5400779ca..23e96522f2f 100644 --- a/src/state/appSessions/index.ts +++ b/src/state/appSessions/index.ts @@ -9,6 +9,12 @@ const chainsIdByNetwork: Record = { [Network.polygon]: ChainId.polygon, [Network.avalanche]: ChainId.avalanche, [Network.bsc]: ChainId.bsc, + [Network.gravity]: ChainId.gravity, + [Network.scroll]: ChainId.scroll, + [Network.zksync]: ChainId.zksync, + [Network.ink]: ChainId.ink, + [Network.linea]: ChainId.linea, + [Network.sanko]: ChainId.sanko, [Network.arbitrum]: ChainId.arbitrum, [Network.optimism]: ChainId.optimism, [Network.zora]: ChainId.zora, diff --git a/src/state/assets/userAssets.ts b/src/state/assets/userAssets.ts index 2109601e25d..d667880acdb 100644 --- a/src/state/assets/userAssets.ts +++ b/src/state/assets/userAssets.ts @@ -5,14 +5,80 @@ import reduxStore, { AppState } from '@/redux/store'; import { supportedNativeCurrencies } from '@/references'; import { createRainbowStore } from '@/state/internal/createRainbowStore'; import { useStore } from 'zustand'; +import { ParsedAddressAsset } from '@/entities'; import { swapsStore } from '@/state/swaps/swapsStore'; import { ChainId } from '@/state/backendNetworks/types'; import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; import { useSelector } from 'react-redux'; +import { getUniqueId } from '@/utils/ethereumUtils'; + +type UserAssetsStateToPersist = Omit< + Partial, + | 'currentAbortController' + | 'inputSearchQuery' + | 'searchCache' + | 'getBalanceSortedChainList' + | 'getChainsWithBalance' + | 'getFilteredUserAssetIds' + | 'getHighestValueNativeAsset' + | 'getUserAsset' + | 'getUserAssets' + | 'selectUserAssetIds' + | 'selectUserAssets' + | 'setSearchCache' + | 'setSearchQuery' + | 'setUserAssets' +>; const SEARCH_CACHE_MAX_ENTRIES = 50; +const parsedSearchAssetToParsedAddressAsset = (asset: ParsedSearchAsset): ParsedAddressAsset => ({ + address: asset.address, + balance: { + amount: asset.balance.amount, + display: asset.balance.display, + }, + network: useBackendNetworksStore.getState().getChainsName()[asset.chainId], + name: asset.name, + chainId: asset.chainId, + color: asset.colors?.primary ?? asset.colors?.fallback, + colors: asset.colors?.primary + ? { + primary: asset.colors.primary, + fallback: asset.colors.fallback, + shadow: asset.colors.shadow, + } + : undefined, + decimals: asset.decimals, + highLiquidity: asset.highLiquidity, + icon_url: asset.icon_url, + id: asset.networks?.[ChainId.mainnet]?.address, + isNativeAsset: asset.isNativeAsset, + price: { + changed_at: undefined, + relative_change_24h: asset.price?.relative_change_24h, + value: asset.price?.value, + }, + mainnet_address: asset.mainnetAddress, + native: { + balance: { + amount: asset.native.balance.amount, + display: asset.native.balance.display, + }, + change: asset.native.price?.change, + price: { + amount: asset.native.price?.amount?.toString(), + display: asset.native.price?.display, + }, + }, + shadowColor: asset.colors?.shadow, + symbol: asset.symbol, + type: asset.type, + uniqueId: asset.uniqueId, +}); + const escapeRegExp = (string: string) => string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const getSearchQueryKey = ({ filter, searchQuery }: { filter: UserAssetFilter; searchQuery: string }) => `${filter}${searchQuery}`; const getDefaultCacheKeys = (): Set => { @@ -35,41 +101,27 @@ export interface UserAssetsState { inputSearchQuery: string; searchCache: Map; userAssets: Map; + legacyUserAssets: ParsedAddressAsset[]; + isLoadingUserAssets: boolean; getBalanceSortedChainList: () => ChainId[]; getChainsWithBalance: () => ChainId[]; getFilteredUserAssetIds: () => UniqueId[]; getHighestValueNativeAsset: () => ParsedSearchAsset | null; getUserAsset: (uniqueId: UniqueId) => ParsedSearchAsset | null; + getLegacyUserAsset: (uniqueId: UniqueId) => ParsedAddressAsset | null; + getNativeAssetForChain: (chainId: ChainId) => ParsedSearchAsset | null; getUserAssets: () => ParsedSearchAsset[]; selectUserAssetIds: (selector: (asset: ParsedSearchAsset) => boolean, filter?: UserAssetFilter) => Generator; selectUserAssets: (selector: (asset: ParsedSearchAsset) => boolean) => Generator<[UniqueId, ParsedSearchAsset], void, unknown>; setSearchCache: (queryKey: string, filteredIds: UniqueId[]) => void; setSearchQuery: (query: string) => void; - setUserAssets: (userAssets: Map | ParsedSearchAsset[]) => void; + setUserAssets: (userAssets: ParsedSearchAsset[]) => void; hiddenAssets: Set; getHiddenAssetsIds: () => UniqueId[]; setHiddenAssets: (uniqueIds: UniqueId[]) => void; } -type UserAssetsStateToPersist = Omit< - Partial, - | 'currentAbortController' - | 'inputSearchQuery' - | 'searchCache' - | 'getBalanceSortedChainList' - | 'getChainsWithBalance' - | 'getFilteredUserAssetIds' - | 'getHighestValueNativeAsset' - | 'getUserAsset' - | 'getUserAssets' - | 'selectUserAssetIds' - | 'selectUserAssets' - | 'setSearchCache' - | 'setSearchQuery' - | 'setUserAssets' ->; - // NOTE: We are serializing Map as an Array<[UniqueId, ParsedSearchAsset]> type UserAssetsStateToPersistWithTransforms = Omit< UserAssetsStateToPersist, @@ -170,6 +222,8 @@ export const createUserAssetsStore = (address: Address | string) => inputSearchQuery: '', searchCache: new Map(), userAssets: new Map(), + legacyUserAssets: [], + isLoadingUserAssets: true, getBalanceSortedChainList: () => { const chainBalances = [...get().chainBalances.entries()]; @@ -223,7 +277,7 @@ export const createUserAssetsStore = (address: Address | string) => const preferredNetwork = swapsStore.getState().preferredNetwork; const assets = get().userAssets; - let highestValueEth = null; + let highestValueNativeAsset = null; for (const [, asset] of assets) { if (!asset.isNativeAsset) continue; @@ -232,16 +286,28 @@ export const createUserAssetsStore = (address: Address | string) => return asset; } - if (!highestValueEth || asset.balance > highestValueEth.balance) { - highestValueEth = asset; + if (!highestValueNativeAsset || asset.balance > highestValueNativeAsset.balance) { + highestValueNativeAsset = asset; } } - return highestValueEth; + return highestValueNativeAsset; + }, + + getNativeAssetForChain: (chainId: ChainId) => { + const nativeAssetAddress = useBackendNetworksStore.getState().getChainsNativeAsset()[chainId].address; + const nativeAssetUniqueId = getUniqueId(nativeAssetAddress, chainId); + return get().userAssets.get(nativeAssetUniqueId) || null; }, getUserAsset: (uniqueId: UniqueId) => get().userAssets.get(uniqueId) || null, + getLegacyUserAsset: (uniqueId: UniqueId) => { + const asset = get().userAssets.get(uniqueId); + if (!asset) return null; + return parsedSearchAssetToParsedAddressAsset(asset); + }, + getUserAssets: () => Array.from(get().userAssets.values()) || [], selectUserAssetIds: function* (selector: (asset: ParsedSearchAsset) => boolean, filter?: UserAssetFilter) { @@ -305,7 +371,7 @@ export const createUserAssetsStore = (address: Address | string) => }); }, - setUserAssets: (userAssets: Map | ParsedSearchAsset[]) => + setUserAssets: (userAssets: ParsedSearchAsset[]) => set(() => { const idsByChain = new Map(); const unsortedChainBalances = new Map(); @@ -336,9 +402,9 @@ export const createUserAssetsStore = (address: Address | string) => idsByChain.set(chainId, idsByChain.get(chainId) || []); }); - const isMap = userAssets instanceof Map; - const allIdsArray = isMap ? Array.from(userAssets.keys()) : userAssets.map(asset => asset.uniqueId); - const userAssetsMap = isMap ? userAssets : new Map(userAssets.map(asset => [asset.uniqueId, asset])); + const allIdsArray = userAssets.map(asset => asset.uniqueId); + const userAssetsMap = new Map(userAssets.map(asset => [asset.uniqueId, asset])); + const legacyUserAssets = userAssets.map(asset => parsedSearchAssetToParsedAddressAsset(asset)); idsByChain.set('all', allIdsArray); @@ -358,15 +424,14 @@ export const createUserAssetsStore = (address: Address | string) => searchCache.set('all', filteredAllIdsArray); - if (isMap) { - return { chainBalances, idsByChain, searchCache, userAssets }; - } else - return { - chainBalances, - idsByChain, - searchCache, - userAssets: userAssetsMap, - }; + return { + chainBalances, + idsByChain, + legacyUserAssets, + searchCache, + userAssets: userAssetsMap, + isLoadingUserAssets: false, + }; }), hiddenAssets: new Set(), @@ -383,7 +448,6 @@ export const createUserAssetsStore = (address: Address | string) => hiddenAssets.add(uniqueId); } }); - return { hiddenAssets }; }); }, @@ -395,6 +459,7 @@ export const createUserAssetsStore = (address: Address | string) => filter: state.filter, idsByChain: state.idsByChain, userAssets: state.userAssets, + legacyUserAssets: state.legacyUserAssets, hiddenAssets: state.hiddenAssets, }), version: 1, diff --git a/src/state/backendNetworks/backendNetworks.ts b/src/state/backendNetworks/backendNetworks.ts index 17da5798f27..9e1882f2601 100644 --- a/src/state/backendNetworks/backendNetworks.ts +++ b/src/state/backendNetworks/backendNetworks.ts @@ -211,7 +211,7 @@ export const useBackendNetworksStore = createRainbowStore( ); }, - // TODO: This should come from the backend at some point + // TODO: This should come from the backend defaultSimplehashNetwork: chainId => { switch (chainId) { case ChainId.apechain: @@ -232,14 +232,27 @@ export const useBackendNetworksStore = createRainbowStore( return 'gnosis'; case ChainId.goerli: return 'ethereum-goerli'; + // case ChainId.gravity: // FIXME: Unsupported as of now https://docs.simplehash.com/reference/supported-chains-testnets#mainnets + // return 'gravity'; + // case ChainId.ink: // FIXME: Unsupported as of now https://docs.simplehash.com/reference/supported-chains-testnets#mainnets + // return 'ink'; case ChainId.mainnet: return 'ethereum'; case ChainId.optimism: return 'optimism'; case ChainId.polygon: return 'polygon'; + // case ChainId.sanko: // FIXME: Unsupported as of now https://docs.simplehash.com/reference/supported-chains-testnets#mainnets + // return 'sanko'; + case ChainId.scroll: + return 'scroll'; + case ChainId.zksync: + return 'zksync-era'; case ChainId.zora: return 'zora'; + case ChainId.linea: + return 'linea'; + default: return ''; } diff --git a/src/state/backendNetworks/types.ts b/src/state/backendNetworks/types.ts index e8cd56f14eb..ab84a34b120 100644 --- a/src/state/backendNetworks/types.ts +++ b/src/state/backendNetworks/types.ts @@ -7,21 +7,27 @@ const HARDHAT_RPC_URL = 'http://127.0.0.1:8545/'; export enum Network { apechain = 'apechain', arbitrum = 'arbitrum', + avalanche = 'avalanche', + base = 'base', + blast = 'blast', + bsc = 'bsc', + degen = 'degen', + gnosis = 'gnosis', goerli = 'goerli', + gravity = 'gravity', + ink = 'ink', + linea = 'linea', mainnet = 'mainnet', optimism = 'optimism', polygon = 'polygon', - base = 'base', - bsc = 'bsc', + sanko = 'sanko', + scroll = 'scroll', + zksync = 'zksync', zora = 'zora', - gnosis = 'gnosis', - avalanche = 'avalanche', - blast = 'blast', - degen = 'degen', } export enum ChainId { - apechain = 33139, + apechain = chain.apeChain.id, arbitrum = chain.arbitrum.id, arbitrumNova = chain.arbitrumNova.id, arbitrumSepolia = chain.arbitrumSepolia.id, @@ -37,9 +43,11 @@ export enum ChainId { degen = chain.degen.id, gnosis = chain.gnosis.id, goerli = chain.goerli.id, + gravity = chain.gravity.id, hardhat = HARDHAT_CHAIN_ID, hardhatOptimism = HARDHAT_OP_CHAIN_ID, holesky = chain.holesky.id, + ink = 57073, linea = chain.linea.id, mainnet = chain.mainnet.id, manta = chain.manta.id, @@ -50,8 +58,10 @@ export enum ChainId { polygonMumbai = chain.polygonMumbai.id, polygonZkEvm = chain.polygonZkEvm.id, rari = 1380012617, + sanko = chain.sanko.id, scroll = chain.scroll.id, sepolia = chain.sepolia.id, + zksync = chain.zksync.id, zora = chain.zora.id, zoraSepolia = chain.zoraSepolia.id, } @@ -64,32 +74,36 @@ export enum ChainName { avalanche = 'avalanche', avalancheFuji = 'avalanche-fuji', base = 'base', + baseSepolia = 'base-sepolia', blast = 'blast', blastSepolia = 'blast-sepolia', bsc = 'bsc', + bscTestnet = 'bsc-testnet', celo = 'celo', degen = 'degen', gnosis = 'gnosis', goerli = 'goerli', + gravity = 'gravity', + hardhat = 'hardhat', + hardhatOptimism = 'hardhat-optimism', + holesky = 'holesky', + ink = 'ink', linea = 'linea', + mainnet = 'mainnet', manta = 'manta', optimism = 'optimism', + optimismSepolia = 'optimism-sepolia', polygon = 'polygon', + polygonAmoy = 'polygon-amoy', + polygonMumbai = 'polygon-mumbai', polygonZkEvm = 'polygon-zkevm', rari = 'rari', + sanko = 'sanko', scroll = 'scroll', - zora = 'zora', - mainnet = 'mainnet', - holesky = 'holesky', - hardhat = 'hardhat', - hardhatOptimism = 'hardhat-optimism', sepolia = 'sepolia', - optimismSepolia = 'optimism-sepolia', - bscTestnet = 'bsc-testnet', - polygonMumbai = 'polygon-mumbai', - baseSepolia = 'base-sepolia', + zksync = 'zksync', + zora = 'zora', zoraSepolia = 'zora-sepolia', - polygonAmoy = 'polygon-amoy', } export const chainHardhat: chain.Chain = { diff --git a/src/state/nonces/index.ts b/src/state/nonces/index.ts index caa6de76c95..d49d40e9c89 100644 --- a/src/state/nonces/index.ts +++ b/src/state/nonces/index.ts @@ -21,7 +21,7 @@ type UpdateNonceArgs = NonceData & GetNonceArgs; export async function getNextNonce({ address, chainId }: { address: string; chainId: ChainId }): Promise { const { getNonce } = nonceStore.getState(); const localNonceData = getNonce({ address, chainId }); - const localNonce = localNonceData?.currentNonce || 0; + const localNonce = localNonceData?.currentNonce || -1; const provider = getBatchedProvider({ chainId }); const privateMempoolTimeout = useBackendNetworksStore.getState().getChainsPrivateMempoolTimeout()[chainId]; diff --git a/src/state/pendingTransactions/index.ts b/src/state/pendingTransactions/index.ts index a09a7bb006b..a53be91df02 100644 --- a/src/state/pendingTransactions/index.ts +++ b/src/state/pendingTransactions/index.ts @@ -84,7 +84,7 @@ export const addNewTransaction = ({ const parsedTransaction = convertNewTransactionToRainbowTransaction(transaction); addPendingTransaction({ address, pendingTransaction: parsedTransaction }); const localNonceData = getNonce({ address, chainId }); - const localNonce = localNonceData?.currentNonce || 0; + const localNonce = localNonceData?.currentNonce || -1; if (transaction.nonce > localNonce) { setNonce({ address, diff --git a/src/state/sync/UserAssetsSync.tsx b/src/state/sync/UserAssetsSync.tsx index e8722cddfce..06d94eb832a 100644 --- a/src/state/sync/UserAssetsSync.tsx +++ b/src/state/sync/UserAssetsSync.tsx @@ -1,3 +1,4 @@ +import { memo } from 'react'; import { useAccountSettings } from '@/hooks'; import { userAssetsStore } from '@/state/assets/userAssets'; import { useSwapsStore } from '@/state/swaps/swapsStore'; @@ -5,8 +6,9 @@ import { selectUserAssetsList, selectorFilterByUserChains } from '@/__swaps__/sc import { ParsedSearchAsset } from '@/__swaps__/types/assets'; import { useUserAssets } from '@/__swaps__/screens/Swap/resources/assets'; import { ChainId } from '@/state/backendNetworks/types'; +import { IS_TEST } from '@/env'; -export const UserAssetsSync = function UserAssetsSync() { +function UserAssetsSyncComponent() { const { accountAddress, nativeCurrency: currentCurrency } = useAccountSettings(); const isSwapsOpen = useSwapsStore(state => state.isSwapsOpen); const isUserAssetsStoreMissingData = userAssetsStore.getState().getUserAssets()?.length === 0; @@ -39,4 +41,6 @@ export const UserAssetsSync = function UserAssetsSync() { ); return null; -}; +} + +export const UserAssetsSync = IS_TEST ? UserAssetsSyncComponent : memo(UserAssetsSyncComponent); diff --git a/src/styles/colors.ts b/src/styles/colors.ts index 0cdac9387af..04d23086e48 100644 --- a/src/styles/colors.ts +++ b/src/styles/colors.ts @@ -187,10 +187,16 @@ const getColorsByTheme = (darkMode?: boolean) => { }; let networkColors = { + [ChainId.zksync]: '#25292E', + [ChainId.sanko]: '#594BA7', + [ChainId.scroll]: '#A6855D', + [ChainId.linea]: '#25292E', + [ChainId.gravity]: '#B75E2C', + [ChainId.ink]: '#7132F5', [ChainId.arbitrum]: '#2D374B', [ChainId.base]: '#0052FF', [ChainId.goerli]: '#f6c343', - [ChainId.gnosis]: '#479E9C', + [ChainId.gnosis]: '#133629', [ChainId.mainnet]: '#25292E', [ChainId.optimism]: '#FF4040', [ChainId.polygon]: '#8247E5', @@ -330,10 +336,16 @@ const getColorsByTheme = (darkMode?: boolean) => { }; networkColors = { + [ChainId.zksync]: '#FFFFFF', + [ChainId.sanko]: '#7F6FC9', + [ChainId.scroll]: '#EBC28E', + [ChainId.linea]: '#FFFFFF', + [ChainId.gravity]: '#B75E2C', + [ChainId.ink]: '#864DFF', [ChainId.arbitrum]: '#ADBFE3', [ChainId.base]: '#3979FF', [ChainId.goerli]: '#f6c343', - [ChainId.gnosis]: '#479E9C', + [ChainId.gnosis]: '#F0EBDE', [ChainId.mainnet]: '#E0E8FF', [ChainId.optimism]: '#FF6A6A', [ChainId.polygon]: '#A275EE', diff --git a/src/utils/ethereumUtils.ts b/src/utils/ethereumUtils.ts index 7c095eb3676..74dbcb14969 100644 --- a/src/utils/ethereumUtils.ts +++ b/src/utils/ethereumUtils.ts @@ -1,8 +1,6 @@ import { BigNumberish } from '@ethersproject/bignumber'; import { StaticJsonRpcProvider, TransactionRequest } from '@ethersproject/providers'; import { serialize } from '@ethersproject/transactions'; -import { RainbowAddressAssets } from '@/resources/assets/types'; -import { userAssetsQueryKey } from '@/resources/assets/UserAssetsQuery'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { queryClient } from '@/react-query'; // @ts-expect-error ts-migrate(7016) FIXME: Could not find a declaration file for module 'eth-... Remove this comment to see the full error message @@ -42,7 +40,7 @@ import { import { ChainId, Network } from '@/state/backendNetworks/types'; import { AddressOrEth } from '@/__swaps__/types/assets'; import { useBackendNetworksStore } from '@/state/backendNetworks/backendNetworks'; -import { useConnectedToHardhatStore } from '@/state/connectedToHardhat'; +import { userAssetsStore } from '@/state/assets/userAssets'; /** * @deprecated - use `getUniqueId` instead for chainIds @@ -148,23 +146,6 @@ const getAsset = (accountAssets: Record, uniqueId: E const loweredUniqueId = uniqueId.toLowerCase(); return accountAssets[loweredUniqueId]; }; - -const getUserAssetFromCache = (uniqueId: string) => { - const { accountAddress, nativeCurrency } = store.getState().settings; - const connectedToHardhat = useConnectedToHardhatStore.getState().connectedToHardhat; - - const cache = queryClient.getQueryCache(); - - const cachedAddressAssets = (cache.find( - userAssetsQueryKey({ - address: accountAddress, - currency: nativeCurrency, - connectedToHardhat, - }) - )?.state?.data || {}) as RainbowAddressAssets; - return cachedAddressAssets?.[uniqueId]; -}; - const getExternalAssetFromCache = (uniqueId: string) => { const { nativeCurrency } = store.getState().settings; const { address, chainId } = getAddressAndChainIdFromUniqueId(uniqueId); @@ -186,15 +167,14 @@ const getExternalAssetFromCache = (uniqueId: string) => { const getAssetFromAllAssets = (uniqueId: EthereumAddress | undefined) => { const loweredUniqueId = uniqueId?.toLowerCase() ?? ''; - const accountAsset = getUserAssetFromCache(loweredUniqueId); + const accountAsset = userAssetsStore.getState().getLegacyUserAsset(loweredUniqueId); const externalAsset = getExternalAssetFromCache(loweredUniqueId); return accountAsset ?? externalAsset; }; const getAccountAsset = (uniqueId: EthereumAddress | undefined): ParsedAddressAsset | undefined => { const loweredUniqueId = uniqueId?.toLowerCase() ?? ''; - const accountAsset = getUserAssetFromCache(loweredUniqueId); - return accountAsset; + return userAssetsStore.getState().getLegacyUserAsset(loweredUniqueId) ?? undefined; }; const getAssetPrice = ( diff --git a/yarn.lock b/yarn.lock index 004c5ca45b8..b5fbcfce5a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,6 +24,13 @@ __metadata: languageName: node linkType: hard +"@adraffy/ens-normalize@npm:^1.10.1": + version: 1.11.0 + resolution: "@adraffy/ens-normalize@npm:1.11.0" + checksum: 10c0/5111d0f1a273468cb5661ed3cf46ee58de8f32f84e2ebc2365652e66c1ead82649df94c736804e2b9cfa831d30ef24e1cc3575d970dbda583416d3a98d8870a6 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.2.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" @@ -4452,6 +4459,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.7.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.7.0": + version: 1.7.0 + resolution: "@noble/curves@npm:1.7.0" + dependencies: + "@noble/hashes": "npm:1.6.0" + checksum: 10c0/3317ec9b7699d2476707a89ceb3ddce60e69bac287561a31dd533669408633e093860fea5067eb9c54e5a7ced0705da1cba8859b6b1e0c48d3afff55fe2e77d0 + languageName: node + linkType: hard + "@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": version: 1.2.0 resolution: "@noble/hashes@npm:1.2.0" @@ -4473,6 +4489,20 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.6.0": + version: 1.6.0 + resolution: "@noble/hashes@npm:1.6.0" + checksum: 10c0/e7e75898257fb36d933935fcdf1cc67ca7c083eb7b2411aa57fde7eb494c2cea0bec03686462032e25d5b0e1e4ab7357d1afb6718f6a68515db1f392141e9f14 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.6.1, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:~1.6.0": + version: 1.6.1 + resolution: "@noble/hashes@npm:1.6.1" + checksum: 10c0/27643cd8b551bc933b57cc29aa8c8763d586552fc4c3e06ecf7897f55be3463c0c9dff7f6ebacd88e5ce6d0cdb5415ca4874d0cf4359b5ea4a85be21ada03aab + languageName: node + linkType: hard + "@noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" @@ -5512,9 +5542,9 @@ __metadata: languageName: node linkType: hard -"@rainbow-me/swaps@npm:0.28.0": - version: 0.28.0 - resolution: "@rainbow-me/swaps@npm:0.28.0" +"@rainbow-me/swaps@npm:0.30.1": + version: 0.30.1 + resolution: "@rainbow-me/swaps@npm:0.30.1" dependencies: "@ethereumjs/util": "npm:9.0.0" "@ethersproject/abi": "npm:5.7.0" @@ -5529,7 +5559,7 @@ __metadata: "@ethersproject/transactions": "npm:5.7.0" "@ethersproject/wallet": "npm:5.7.0" "@metamask/eth-sig-util": "npm:7.0.0" - checksum: 10c0/a5c8cd8325ceb7552ad7442a815b1a5afa9ddc9f7487a732704b414fcd94e718286951c02a46440d6252020bdd191bacc38f59d61deec6933d78fb787d1602c9 + checksum: 10c0/40f6824393986527bdd41b56129e5189c0089f74ca4a4e860aea5bb706c5acc4ad2458cf5a63edead5d45d61bde0c40251b536c640aa2a6f3b2d026c0161fcf9 languageName: node linkType: hard @@ -6394,6 +6424,13 @@ __metadata: languageName: node linkType: hard +"@scure/base@npm:~1.2.1": + version: 1.2.1 + resolution: "@scure/base@npm:1.2.1" + checksum: 10c0/e61068854370855b89c50c28fa4092ea6780f1e0db64ea94075ab574ebcc964f719a3120dc708db324991f4b3e652d92ebda03fce2bf6a4900ceeacf9c0ff933 + languageName: node + linkType: hard + "@scure/bip32@npm:1.1.5": version: 1.1.5 resolution: "@scure/bip32@npm:1.1.5" @@ -6427,6 +6464,17 @@ __metadata: languageName: node linkType: hard +"@scure/bip32@npm:1.6.0, @scure/bip32@npm:^1.5.0": + version: 1.6.0 + resolution: "@scure/bip32@npm:1.6.0" + dependencies: + "@noble/curves": "npm:~1.7.0" + "@noble/hashes": "npm:~1.6.0" + "@scure/base": "npm:~1.2.1" + checksum: 10c0/5a5eff8c0bc0b53d70528c5eda6efa7ed6d186a5c9ba0a339edf9c150ee3f331d837ffe29d2c6c6336b1f88ad90aa8b6e596a4950217343f36916d8024f79bdf + languageName: node + linkType: hard + "@scure/bip39@npm:1.1.1": version: 1.1.1 resolution: "@scure/bip39@npm:1.1.1" @@ -6457,6 +6505,16 @@ __metadata: languageName: node linkType: hard +"@scure/bip39@npm:1.5.0, @scure/bip39@npm:^1.4.0": + version: 1.5.0 + resolution: "@scure/bip39@npm:1.5.0" + dependencies: + "@noble/hashes": "npm:~1.6.0" + "@scure/base": "npm:~1.2.1" + checksum: 10c0/114ab88fb00269d17a73d5c39a2cade47403e05f6df5a8d6f5da6e7f2b071966fe8f656a740dc3399acd006163f234e82b680544c38004703dbb60f8a29daf73 + languageName: node + linkType: hard + "@segment/loosely-validate-event@npm:^2.0.0": version: 2.0.0 resolution: "@segment/loosely-validate-event@npm:2.0.0" @@ -9129,7 +9187,7 @@ __metadata: "@notifee/react-native": "npm:7.8.2" "@rainbow-me/provider": "npm:0.1.1" "@rainbow-me/react-native-animated-number": "npm:0.0.2" - "@rainbow-me/swaps": "npm:0.28.0" + "@rainbow-me/swaps": "npm:0.30.1" "@react-native-async-storage/async-storage": "npm:1.23.1" "@react-native-camera-roll/camera-roll": "npm:7.7.0" "@react-native-clipboard/clipboard": "npm:1.13.2" @@ -9380,7 +9438,7 @@ __metadata: use-deep-compare: "npm:1.1.0" use-memo-one: "npm:1.1.1" util: "npm:0.10.4" - viem: "npm:2.9.16" + viem: "npm:2.21.54" vm-browserify: "npm:0.0.4" w2t: "npm:3.0.2" webpack: "npm:5.94.0" @@ -9420,9 +9478,9 @@ __metadata: languageName: node linkType: hard -"abitype@npm:1.0.0": - version: 1.0.0 - resolution: "abitype@npm:1.0.0" +"abitype@npm:1.0.7, abitype@npm:^1.0.6": + version: 1.0.7 + resolution: "abitype@npm:1.0.7" peerDependencies: typescript: ">=5.0.4" zod: ^3 >=3.22.0 @@ -9431,7 +9489,7 @@ __metadata: optional: true zod: optional: true - checksum: 10c0/d685351a725c49f81bdc588e2f3825c28ad96c59048d4f36bf5e4ef30935c31f7e60b5553c70177b77a9e4d8b04290eea43d3d9c1c2562cb130381c88b15d39f + checksum: 10c0/de63055e27bcc8ec14e810c8525c2a61658a1b01dc1e5882af45c96a966ad3911d50dd16d97dfb49c106fb323638a906bcaf1e48f4f1b9c5bf4926dc217a81e1 languageName: node linkType: hard @@ -17787,6 +17845,15 @@ __metadata: languageName: node linkType: hard +"isows@npm:1.0.6": + version: 1.0.6 + resolution: "isows@npm:1.0.6" + peerDependencies: + ws: "*" + checksum: 10c0/f89338f63ce2f497d6cd0f86e42c634209328ebb43b3bdfdc85d8f1589ee75f02b7e6d9e1ba274101d0f6f513b1b8cbe6985e6542b4aaa1f0c5fd50d9c1be95c + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -21639,6 +21706,26 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.1.2": + version: 0.1.2 + resolution: "ox@npm:0.1.2" + dependencies: + "@adraffy/ens-normalize": "npm:^1.10.1" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + "@scure/bip32": "npm:^1.5.0" + "@scure/bip39": "npm:^1.4.0" + abitype: "npm:^1.0.6" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9d0615e9a95c316063587fe08dc268476e67429eea897598b2f69cb1509ac66739f888b0b9bc1cfd0b4bd2f1a3fd0af4d3e81d40ba0bf3abd53e36a6f5b21323 + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -28051,24 +28138,25 @@ react-native-safe-area-view@rainbow-me/react-native-safe-area-view: languageName: node linkType: hard -"viem@npm:2.9.16": - version: 2.9.16 - resolution: "viem@npm:2.9.16" +"viem@npm:2.21.54": + version: 2.21.54 + resolution: "viem@npm:2.21.54" dependencies: - "@adraffy/ens-normalize": "npm:1.10.0" - "@noble/curves": "npm:1.2.0" - "@noble/hashes": "npm:1.3.2" - "@scure/bip32": "npm:1.3.2" - "@scure/bip39": "npm:1.2.1" - abitype: "npm:1.0.0" - isows: "npm:1.0.3" - ws: "npm:8.13.0" + "@noble/curves": "npm:1.7.0" + "@noble/hashes": "npm:1.6.1" + "@scure/bip32": "npm:1.6.0" + "@scure/bip39": "npm:1.5.0" + abitype: "npm:1.0.7" + isows: "npm:1.0.6" + ox: "npm:0.1.2" + webauthn-p256: "npm:0.0.10" + ws: "npm:8.18.0" peerDependencies: typescript: ">=5.0.4" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/832ed60ea8de1eba70dc6bafc1196243836c9ccaa7284e37b35bedf9f8fcfe6e238c30f04408556d7cba7fff80def9ee2b807cff114e8fec885bca9b95b00586 + checksum: 10c0/d4d77f47de89248a6c2e43dc0729517b1b5cb5afd372f97ae2f5b37170d9df131c92955efcc0776bd6e75980bd19bc38f0daa1026e2059204ad8593b5f383e55 languageName: node linkType: hard @@ -28159,6 +28247,16 @@ react-native-safe-area-view@rainbow-me/react-native-safe-area-view: languageName: node linkType: hard +"webauthn-p256@npm:0.0.10": + version: 0.0.10 + resolution: "webauthn-p256@npm:0.0.10" + dependencies: + "@noble/curves": "npm:^1.4.0" + "@noble/hashes": "npm:^1.4.0" + checksum: 10c0/27d836d81a1fec24a31d2d9b652f8ff6876b51940d1003bbd14dc5cfa57c58d84223b5a4eece229516522fd997bc0bc7be618ac42b129fb5fa42fa530060b16d + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -28535,6 +28633,21 @@ react-native-safe-area-view@rainbow-me/react-native-safe-area-view: languageName: node linkType: hard +"ws@npm:8.18.0, ws@npm:^8.12.1": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 + languageName: node + linkType: hard + "ws@npm:^6.2.2": version: 6.2.3 resolution: "ws@npm:6.2.3" @@ -28559,21 +28672,6 @@ react-native-safe-area-view@rainbow-me/react-native-safe-area-view: languageName: node linkType: hard -"ws@npm:^8.12.1": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 - languageName: node - linkType: hard - "ws@npm:~8.2.3": version: 8.2.3 resolution: "ws@npm:8.2.3"