diff --git a/.detoxrc.js b/.detoxrc.js index efcacc30b6c..0b5b837895f 100644 --- a/.detoxrc.js +++ b/.detoxrc.js @@ -9,7 +9,7 @@ module.exports = { devices: { 'ios.simulator': { type: 'ios.simulator', - device: { type: 'iPhone 15 Pro' }, + device: { type: 'iPhone 16 Pro' }, }, 'android.attached': { type: 'android.attached', diff --git a/.github/workflows/macstadium-builds.yml b/.github/workflows/macstadium-builds.yml index eb66d59324a..4de26e67e9b 100644 --- a/.github/workflows/macstadium-builds.yml +++ b/.github/workflows/macstadium-builds.yml @@ -45,7 +45,8 @@ jobs: ${{ steps.yarn-cache-dir-path.outputs.dir }} .yarn/cache .yarn/install-state.gz - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + !.eslintcache # Exclude eslint cache + key: ${{ runner.os }}-yarn-${{ github.sha }} # Cache per commit restore-keys: | ${{ runner.os }}-yarn- diff --git a/.github/workflows/macstadium-tests.yml b/.github/workflows/macstadium-tests.yml index b06e42ae654..237d1614507 100644 --- a/.github/workflows/macstadium-tests.yml +++ b/.github/workflows/macstadium-tests.yml @@ -18,7 +18,7 @@ jobs: run: git config core.sshCommand "ssh -i ~/.ssh/id_ed25519 -F /dev/null" - name: Clean iOS app - run: yarn clean:ios > /dev/null 2>&1 || true + run: yarn cache clean && yarn clean:ios > /dev/null 2>&1 || true - name: Set up ENV vars & scripts env: @@ -40,7 +40,8 @@ jobs: ${{ steps.yarn-cache-dir-path.outputs.dir }} .yarn/cache .yarn/install-state.gz - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + !.eslintcache # Exclude eslint cache + key: ${{ runner.os }}-yarn-${{ github.sha }} # Cache per commit restore-keys: | ${{ runner.os }}-yarn- @@ -49,7 +50,7 @@ jobs: yarn install && yarn setup - name: Upload Yarn cache - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: yarn-cache path: | @@ -62,7 +63,7 @@ jobs: needs: install-deps steps: - name: Download Yarn cache - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: yarn-cache path: .yarn @@ -73,6 +74,9 @@ jobs: - name: Audit CI run: yarn audit-ci --config audit-ci.jsonc + - name: Remove ESLint cache + run: rm -f .eslintcache + - name: Lint run: yarn lint:ci @@ -86,7 +90,7 @@ jobs: needs: install-deps steps: - name: Download Yarn cache - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: yarn-cache path: .yarn diff --git a/CHANGELOG.md b/CHANGELOG.md index 36233adc07a..9446638f981 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,46 @@ and this project adheres to [Semantic Versioning](http://semver.org/) ### Fixed -## [1.9.38] (https://github.com/rainbow-me/rainbow/releases/tag/v1.9.36) +## [1.9.40] (https://github.com/rainbow-me/rainbow/releases/tag/v1.9.40) + +### Fixed + +- Fixed a bug with speed up and cancel (#6133) + +## [1.9.39] (https://github.com/rainbow-me/rainbow/releases/tag/v1.9.39) + +### Added + +- Added rc-push script for release tracking and cleanup (#6088) +- Built the react query for addys claimables endpoint along with wallet screen UI (#6071) + +### Changed + +- Swaps performance improvements (#6050) +- Improved CI jobs for build and tests for Tophat (#6043, #6089) +- Removed some test env for some vars that aren’t needed anymore (#6077) +- userAssetsStore refactor (#6015) +- Bumped swaps sdk to 0.26 (#6098) +- Final implementation for network to chainId migration (#6039) + +### Fixed + +- Fixed swaps spec in e2e so that all assets balances will update correctly (#6060) +- Fixed an issue with charts where it was using USD for points instead of user’s selected currency (#6051) +- Fixed an issue on Android nav bar where it was covered by the systems navigation bar (#6053) +- Fixed e2e flakiness (#6084, #6090) +- Fixed an issue with opacity on mwp sign txn sheet (#6083) +- Fixed a crash that happened when searching input token in swaps (#6104) +- Fixed and issue with degen native asset address, degen ↔ wdegen (#6087, #6091) +- Fixed a crash on token details chart for cannot read property ‘y’ of undefined (#6009) +- Fixed issues with remote promo sheets (#6085) +- Fixed a bug on iOS 18 which caused context menu dismissals (#6112) +- Fixed a crash that was happening on send flow (#6116) +- Fixed a bug where the paste button was disabled on swaps flow for android devices (#6118) +- Fixed an issue where deleting a contact would cause loading issues on send flow (#6119) +- Fixed a bug where chainId wasn’t being passed in the dapp browser (#6121) + +## [1.9.38] (https://github.com/rainbow-me/rainbow/releases/tag/v1.9.38) ### Fixed diff --git a/android/app/build.gradle b/android/app/build.gradle index 7a56f87e913..a6572fd6ec5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -130,8 +130,8 @@ android { applicationId "me.rainbow" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 231 - versionName "1.9.39" + versionCode 233 + versionName "1.9.41" missingDimensionStrategy 'react-native-camera', 'general' renderscriptTargetApi 23 renderscriptSupportModeEnabled true diff --git a/e2e/9_swaps.spec.ts b/e2e/9_swaps.spec.ts index a9d4a5577d1..67d866e2326 100644 --- a/e2e/9_swaps.spec.ts +++ b/e2e/9_swaps.spec.ts @@ -62,9 +62,7 @@ describe('Swap Sheet Interaction Flow', () => { await tap('swap-button'); await delayTime('very-long'); - // flaky - // await swipeUntilVisible('token-to-buy-dai-1', 'token-to-buy-list', 'up', 100); - await swipe('token-to-buy-list', 'up', 'slow', 0.2); + await swipeUntilVisible('token-to-buy-dai-1', 'token-to-buy-list', 'up', 100); await tap('token-to-buy-dai-1'); await delayTime('very-long'); diff --git a/e2e/helpers.ts b/e2e/helpers.ts index 7ecb9811fc3..441a9d0144d 100644 --- a/e2e/helpers.ts +++ b/e2e/helpers.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ /* eslint-disable no-await-in-loop */ import { exec } from 'child_process'; import { JsonRpcProvider } from '@ethersproject/providers'; @@ -201,6 +202,7 @@ export async function clearField(elementId: string | RegExp) { export async function tapAndLongPress(elementId: string | RegExp, duration?: number) { try { + // @ts-expect-error return await element(by.id(elementId)).longPress(duration); } catch (error) { throw new Error(`Error long-pressing element by id "${elementId}": ${error}`); @@ -209,6 +211,7 @@ export async function tapAndLongPress(elementId: string | RegExp, duration?: num export async function tapAndLongPressByText(text: string | RegExp, duration?: number) { try { + // @ts-expect-error return await element(by.text(text)).longPress(duration); } catch (error) { throw new Error(`Error long-pressing element by text "${text}": ${error}`); diff --git a/ios/Gemfile b/ios/Gemfile index 4d4d8ecb223..56d9ef00e81 100644 --- a/ios/Gemfile +++ b/ios/Gemfile @@ -4,8 +4,9 @@ source 'https://rubygems.org' ruby '>= 2.7.0' gem "fastlane" -gem 'cocoapods', '>= 1.13', '< 1.15' -gem 'activesupport', '>= 6.1.7.5', '< 7.1.0' +# Exclude problematic versions of cocoapods and activesupport that causes build failures. +gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' +gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock index 1af4554f95c..db0f6145d07 100644 --- a/ios/Gemfile.lock +++ b/ios/Gemfile.lock @@ -276,8 +276,8 @@ PLATFORMS ruby DEPENDENCIES - activesupport (>= 6.1.7.5, < 7.1.0) - cocoapods (>= 1.13, < 1.15) + activesupport (>= 6.1.7.5, != 7.1.0) + cocoapods (>= 1.13, != 1.15.1, != 1.15.0) fastlane RUBY VERSION diff --git a/ios/Podfile b/ios/Podfile index fff78719d51..bf1cf540459 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -69,7 +69,7 @@ target 'Rainbow' do pod 'SRSRadialGradient', :path => '../node_modules/react-native-radial-gradient/ios' pod 'react-native-palette-full', :path => '../node_modules/react-native-palette-full' pod 'react-native-ble-plx', :path => '../node_modules/react-native-ble-plx' - pod 'TOCropViewController', '2.7.3' + pod 'TOCropViewController', '~> 2.7.4' use_native_modules! diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f28ca0bae70..32d0852c36a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1651,15 +1651,15 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNImageCropPicker (0.41.0): + - RNImageCropPicker (0.41.2): - React-Core - React-RCTImage - - RNImageCropPicker/QBImagePickerController (= 0.41.0) - - TOCropViewController (~> 2.7.3) - - RNImageCropPicker/QBImagePickerController (0.41.0): + - RNImageCropPicker/QBImagePickerController (= 0.41.2) + - TOCropViewController (~> 2.7.4) + - RNImageCropPicker/QBImagePickerController (0.41.2): - React-Core - React-RCTImage - - TOCropViewController (~> 2.7.3) + - TOCropViewController (~> 2.7.4) - RNInputMask (4.1.0) - RNKeyboard (1.0.6): - React @@ -1766,11 +1766,29 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNSentry (5.22.0): + - RNSentry (5.31.1): + - DoubleConversion + - glog - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics - React-hermes - - Sentry/HybridSDK (= 8.24.0) + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Sentry/HybridSDK (= 8.36.0) + - Yoga - RNShare (8.2.1): - React-Core - RNSound (0.11.2): @@ -1792,7 +1810,7 @@ PODS: - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - - Sentry/HybridSDK (8.24.0) + - Sentry/HybridSDK (8.36.0) - Shimmer (1.0.2) - SocketRocket (0.7.0) - SRSRadialGradient (1.0.10): @@ -1801,7 +1819,7 @@ PODS: - TcpSockets (3.3.2): - CocoaAsyncSocket - React - - TOCropViewController (2.7.3) + - TOCropViewController (2.7.4) - ToolTipMenu (5.2.1): - React - VisionCamera (4.4.2): @@ -1954,7 +1972,7 @@ DEPENDENCIES: - SRSRadialGradient (from `../node_modules/react-native-radial-gradient/ios`) - swift-vibrant - TcpSockets (from `../node_modules/react-native-tcp`) - - TOCropViewController (= 2.7.3) + - TOCropViewController (~> 2.7.4) - ToolTipMenu (from `../node_modules/react-native-tooltip`) - VisionCamera (from `../node_modules/react-native-vision-camera`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -2395,7 +2413,7 @@ SPEC CHECKSUMS: RNFlashList: e9b57a5553639f9b528cc50ab53f25831722ed62 RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df RNGestureHandler: efed690b8493a00b99654043daeb1335276ac4a2 - RNImageCropPicker: 13eab07a785c7a8f8047a1146f7e59d1911c7bb8 + RNImageCropPicker: 771e2ca319d2cf92e04ebf334ece892ee9a6728f RNInputMask: 815461ebdf396beb62cf58916c35cf6930adb991 RNKeyboard: 14793d75953d99c6d950090b8e9698b234c5d08c RNKeychain: 4f63aada75ebafd26f4bc2c670199461eab85d94 @@ -2406,7 +2424,7 @@ SPEC CHECKSUMS: RNReanimated: 45553a3ae29a75a76269595f8554d07d4090e392 RNRudderSdk: 805d4b7064714f3295bf5f152d3812cc67f67a93 RNScreens: aa943ad421c3ced3ef5a47ede02b0cbfc43a012e - RNSentry: 7ae2a06a5563de39ec09dcb1e751ac0c67f1883c + RNSentry: 2c78e72aaa6e55d61ce60d98a62f01b666f76513 RNShare: eaee3dd5a06dad397c7d3b14762007035c5de405 RNSound: 6c156f925295bdc83e8e422e7d8b38d33bc71852 RNSVG: 5da7a24f31968ec74f0b091e3440080f347e279b @@ -2416,17 +2434,17 @@ SPEC CHECKSUMS: RudderKit: f272f9872183946452ac94cd7bb2244a71e6ca8f SDWebImage: 2d6d229046fea284d62e36bfb8ebe8287dfc5b10 SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 - Sentry: 2f6baed15a3f8056b875fc903dc3dcb2903117f4 + Sentry: f8374b5415bc38dfb5645941b3ae31230fbeae57 Shimmer: c5374be1c2b0c9e292fb05b339a513cf291cac86 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d SRSRadialGradient: e5a34825dff88c9cf773b58bf39ed6a02e59a084 swift-vibrant: 3def73c5c281db74f420ec386590d9c1c5b0995c TcpSockets: bd31674146c0931a064fc254a59812dfd1a73ae0 - TOCropViewController: b9b2905938c0424f289ea2d9964993044913fac6 + TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 ToolTipMenu: 8ac61aded0fbc4acfe7e84a7d0c9479d15a9a382 VisionCamera: 2af28201c3de77245f8c58b7a5274d5979df70df Yoga: 04f1db30bb810187397fa4c37dd1868a27af229c -PODFILE CHECKSUM: 0839e4141c8f26133bf9a961f5ded1ea3127af54 +PODFILE CHECKSUM: 40f081f682acbe2d1d2129eb3335352ea01aab70 COCOAPODS: 1.14.3 diff --git a/ios/Rainbow.xcodeproj/project.pbxproj b/ios/Rainbow.xcodeproj/project.pbxproj index 8f98c3f4058..abcaf71efa3 100644 --- a/ios/Rainbow.xcodeproj/project.pbxproj +++ b/ios/Rainbow.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ 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 */; }; + 3F5576215214EE23607F6CA9 /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FC59C3544C0FBE4328F0600 /* libPods-PriceWidgetExtension.a */; }; 4D098C2F2811A9A5006A801A /* RNStartTime.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D098C2E2811A9A5006A801A /* RNStartTime.m */; }; 6630540924A38A1900E5B030 /* RainbowText.m in Sources */ = {isa = PBXBuildFile; fileRef = 6630540824A38A1900E5B030 /* RainbowText.m */; }; 6635730624939991006ACFA6 /* SafeStoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 6635730524939991006ACFA6 /* SafeStoreReview.m */; }; @@ -34,8 +35,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 */; }; - 86913359E129076B2E94167D /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6875B4873D0949D4D7AAAE07 /* libPods-Rainbow.a */; }; - 8A822C422360198E62AD7BFA /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BCDB57FCE228B5380B3618D3 /* libPods-SelectTokenIntent.a */; }; + 7E667C2059B8CDB73F45605F /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C37D3C9100B762F75F550BB5 /* libPods-ImageNotification.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 */; }; @@ -68,7 +68,6 @@ B5CE8FFF29A5758100EB1EFA /* pooly@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = B5CE8FFD29A5758100EB1EFA /* pooly@3x.png */; }; B5D7F2F029E8D41E003D6A54 /* finiliar@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = B5D7F2EE29E8D41D003D6A54 /* finiliar@3x.png */; }; B5D7F2F129E8D41E003D6A54 /* finiliar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B5D7F2EF29E8D41E003D6A54 /* finiliar@2x.png */; }; - B8CD55BCF7A0AB6EFF7E2107 /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 025D857C7770B9D5627327FA /* libPods-ImageNotification.a */; }; C04D10F025AFC8C1003BEF7A /* Extras.json in Resources */ = {isa = PBXBuildFile; fileRef = C04D10EF25AFC8C1003BEF7A /* Extras.json */; }; C1038325273C2D0C00B18210 /* PriceWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16DCF75272BA7AA00FF5C78 /* PriceWidgetView.swift */; }; C1038337273C5C4200B18210 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16DCF62272BA6EF00FF5C78 /* PriceWidget.swift */; }; @@ -139,8 +138,9 @@ 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, ); }; }; - CE27C1EECE64497C72CC5B3A /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D346B122505933DBFA22D04A /* libPods-PriceWidgetExtension.a */; }; + CC651D36962A724E81524D7F /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6742E1A099DF0612378089CD /* libPods-SelectTokenIntent.a */; }; ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; + EDE3164FD32FFCE390544F9B /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A53309386F4BFBD43C6866D6 /* libPods-Rainbow.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -203,14 +203,12 @@ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* RainbowTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RainbowTests.m; sourceTree = ""; }; - 025D857C7770B9D5627327FA /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 0299CE772886202800B5C7E7 /* ImageNotification.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ImageNotification.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 0299CE792886202800B5C7E7 /* NotificationService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationService.h; sourceTree = ""; }; 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; }; - 0C374E26CF6ED7C5C2C823ED /* 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 = ""; }; - 0EF5903F6DA2DDF4181D7872 /* 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 = ""; }; + 11F3C03FC45727D52FAE847D /* 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 = ""; }; 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 = ""; }; @@ -218,6 +216,7 @@ 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 = ""; }; + 1539A52384919E5109C2C9B2 /* 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 = ""; }; 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 = ""; }; @@ -236,6 +235,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 = ""; }; + 1FC59C3544C0FBE4328F0600 /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; @@ -248,19 +248,19 @@ 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 = ""; }; - 33BC79874A51AA3880F7C4AC /* 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 = ""; }; + 2FF98F997797E047DCAF7234 /* 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 = ""; }; + 380324A440FD8D773D7F1074 /* 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 = ""; }; 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 = ""; }; - 4AE8D68F8252F11480F2D99E /* 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 = ""; }; - 4C6224CF2221F931780B3CE6 /* 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 = ""; }; 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 = ""; }; + 62CAF1459EC3D2C1F76CAAA6 /* 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 = ""; }; + 62DD03EC74A1637EEB329C87 /* 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 = ""; }; 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 = ""; }; 664612ED274848B000B43F5A /* SelectTokenIntent.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SelectTokenIntent.entitlements; sourceTree = ""; }; 6655FFB325BB2B0700642961 /* ThemeModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ThemeModule.m; sourceTree = ""; }; - 6657A4835F27FC0FFFFBF340 /* 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 = ""; }; 668ADB2C25A4E3A40050859D /* Stickers.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Stickers.xcassets; sourceTree = ""; }; 668ADB2E25A4E3A40050859D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 66A1FEAF24AB641100C3F539 /* RNCMScreenStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RNCMScreenStack.h; path = "../src/react-native-cool-modals/ios/RNCMScreenStack.h"; sourceTree = ""; }; @@ -271,17 +271,16 @@ 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; }; - 675045CF6F69ECCABFA7ED3C /* 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 = ""; }; - 6875B4873D0949D4D7AAAE07 /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6FF8A19FD539CD5755E2A363 /* 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 = ""; }; - 7A533038ADA944A6493A66D1 /* 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 = ""; }; - 8148434135865DD9B63D5991 /* 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 = ""; }; + 6742E1A099DF0612378089CD /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 75256BD3661D2D38F0A34282 /* 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 = ""; }; + 883A50680E4D8A275AFBB48C /* 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 = ""; }; 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; }; 9DEADFA4826D4D0BAA950D21 /* libRNFIRMessaging.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFIRMessaging.a; 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 = ""; }; + A53309386F4BFBD43C6866D6 /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; @@ -291,7 +290,7 @@ AA6228ED24272B200078BDAA /* SF-Pro-Rounded-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SF-Pro-Rounded-Medium.otf"; path = "../src/assets/fonts/SF-Pro-Rounded-Medium.otf"; sourceTree = ""; }; 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 = ""; }; - B04D80FD63CAEB682250EB0A /* 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 = ""; }; + AB3065204B58D1CAF6AB5BFB /* 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 = ""; }; B0C692B061D7430D8194DC98 /* ToolTipMenuTests.xctest */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = ToolTipMenuTests.xctest; 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 = ""; }; @@ -313,8 +312,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 = ""; }; - B7B49161FD8417A90F7CB9A8 /* 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 = ""; }; - BCDB57FCE228B5380B3618D3 /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + B652202E744A23B17A022084 /* 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 = ""; }; 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 = ""; }; @@ -342,6 +340,9 @@ 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 = ""; }; + C37D3C9100B762F75F550BB5 /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C3AB85CEFE6AA92587D648DA /* 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 = ""; }; + C83648862B87E1FB90335EFA /* 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 = ""; }; 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; }; @@ -354,14 +355,13 @@ 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 = ""; }; - D346B122505933DBFA22D04A /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; D755E71324B04FEE9C691D14 /* libRNFirebase.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFirebase.a; sourceTree = ""; }; - E00C89EED34D89AE4F2A3462 /* 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 = ""; }; - E1179CDF5117977A37C590EE /* 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 = ""; }; - E2E91009BF4E2373D0EAA867 /* 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 = ""; }; + E5F43237FF3957D40BFC7963 /* 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 = ""; }; + EBC7F3A7CB4D39D0EB49A89B /* 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 = ""; }; 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; }; - FD8F690D66D4FC3337BC4317 /* 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 = ""; }; + F222FAC72622CB2711326815 /* 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 = ""; }; + FCB6238842FEFC329B82EB3C /* 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 */ @@ -369,7 +369,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B8CD55BCF7A0AB6EFF7E2107 /* libPods-ImageNotification.a in Frameworks */, + 7E667C2059B8CDB73F45605F /* libPods-ImageNotification.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -379,7 +379,7 @@ files = ( ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, C72F456C99A646399192517D /* libz.tbd in Frameworks */, - 86913359E129076B2E94167D /* libPods-Rainbow.a in Frameworks */, + EDE3164FD32FFCE390544F9B /* libPods-Rainbow.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -389,7 +389,7 @@ files = ( C16DCF60272BA6EF00FF5C78 /* SwiftUI.framework in Frameworks */, C16DCF5E272BA6EF00FF5C78 /* WidgetKit.framework in Frameworks */, - CE27C1EECE64497C72CC5B3A /* libPods-PriceWidgetExtension.a in Frameworks */, + 3F5576215214EE23607F6CA9 /* libPods-PriceWidgetExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -398,7 +398,7 @@ buildActionMask = 2147483647; files = ( C16DCF81272BAB9500FF5C78 /* Intents.framework in Frameworks */, - 8A822C422360198E62AD7BFA /* libPods-SelectTokenIntent.a in Frameworks */, + CC651D36962A724E81524D7F /* libPods-SelectTokenIntent.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -575,10 +575,10 @@ C16DCF80272BAB9500FF5C78 /* Intents.framework */, C16DCF8B272BAB9600FF5C78 /* IntentsUI.framework */, C9B378A12C5159880085E5D0 /* UniformTypeIdentifiers.framework */, - 025D857C7770B9D5627327FA /* libPods-ImageNotification.a */, - D346B122505933DBFA22D04A /* libPods-PriceWidgetExtension.a */, - 6875B4873D0949D4D7AAAE07 /* libPods-Rainbow.a */, - BCDB57FCE228B5380B3618D3 /* libPods-SelectTokenIntent.a */, + C37D3C9100B762F75F550BB5 /* libPods-ImageNotification.a */, + 1FC59C3544C0FBE4328F0600 /* libPods-PriceWidgetExtension.a */, + A53309386F4BFBD43C6866D6 /* libPods-Rainbow.a */, + 6742E1A099DF0612378089CD /* libPods-SelectTokenIntent.a */, ); name = Frameworks; sourceTree = ""; @@ -733,22 +733,22 @@ C640359C0E6575CE0A7ECD73 /* Pods */ = { isa = PBXGroup; children = ( - 4AE8D68F8252F11480F2D99E /* Pods-ImageNotification.debug.xcconfig */, - 6657A4835F27FC0FFFFBF340 /* Pods-ImageNotification.release.xcconfig */, - 0C374E26CF6ED7C5C2C823ED /* Pods-ImageNotification.localrelease.xcconfig */, - E00C89EED34D89AE4F2A3462 /* Pods-ImageNotification.staging.xcconfig */, - E2E91009BF4E2373D0EAA867 /* Pods-PriceWidgetExtension.debug.xcconfig */, - 675045CF6F69ECCABFA7ED3C /* Pods-PriceWidgetExtension.release.xcconfig */, - B04D80FD63CAEB682250EB0A /* Pods-PriceWidgetExtension.localrelease.xcconfig */, - B7B49161FD8417A90F7CB9A8 /* Pods-PriceWidgetExtension.staging.xcconfig */, - 7A533038ADA944A6493A66D1 /* Pods-Rainbow.debug.xcconfig */, - 6FF8A19FD539CD5755E2A363 /* Pods-Rainbow.release.xcconfig */, - 8148434135865DD9B63D5991 /* Pods-Rainbow.localrelease.xcconfig */, - 4C6224CF2221F931780B3CE6 /* Pods-Rainbow.staging.xcconfig */, - 33BC79874A51AA3880F7C4AC /* Pods-SelectTokenIntent.debug.xcconfig */, - E1179CDF5117977A37C590EE /* Pods-SelectTokenIntent.release.xcconfig */, - 0EF5903F6DA2DDF4181D7872 /* Pods-SelectTokenIntent.localrelease.xcconfig */, - FD8F690D66D4FC3337BC4317 /* Pods-SelectTokenIntent.staging.xcconfig */, + 11F3C03FC45727D52FAE847D /* Pods-ImageNotification.debug.xcconfig */, + 883A50680E4D8A275AFBB48C /* Pods-ImageNotification.release.xcconfig */, + FCB6238842FEFC329B82EB3C /* Pods-ImageNotification.localrelease.xcconfig */, + 62CAF1459EC3D2C1F76CAAA6 /* Pods-ImageNotification.staging.xcconfig */, + C3AB85CEFE6AA92587D648DA /* Pods-PriceWidgetExtension.debug.xcconfig */, + C83648862B87E1FB90335EFA /* Pods-PriceWidgetExtension.release.xcconfig */, + AB3065204B58D1CAF6AB5BFB /* Pods-PriceWidgetExtension.localrelease.xcconfig */, + EBC7F3A7CB4D39D0EB49A89B /* Pods-PriceWidgetExtension.staging.xcconfig */, + B652202E744A23B17A022084 /* Pods-Rainbow.debug.xcconfig */, + 62DD03EC74A1637EEB329C87 /* Pods-Rainbow.release.xcconfig */, + 1539A52384919E5109C2C9B2 /* Pods-Rainbow.localrelease.xcconfig */, + F222FAC72622CB2711326815 /* Pods-Rainbow.staging.xcconfig */, + 380324A440FD8D773D7F1074 /* Pods-SelectTokenIntent.debug.xcconfig */, + 75256BD3661D2D38F0A34282 /* Pods-SelectTokenIntent.release.xcconfig */, + 2FF98F997797E047DCAF7234 /* Pods-SelectTokenIntent.localrelease.xcconfig */, + E5F43237FF3957D40BFC7963 /* Pods-SelectTokenIntent.staging.xcconfig */, ); path = Pods; sourceTree = ""; @@ -796,11 +796,11 @@ isa = PBXNativeTarget; buildConfigurationList = 0299CE842886202800B5C7E7 /* Build configuration list for PBXNativeTarget "ImageNotification" */; buildPhases = ( - FD10D710D0C7F8EEE6EB0F77 /* [CP] Check Pods Manifest.lock */, + 7C2BB7E8EA2574B3A74BB808 /* [CP] Check Pods Manifest.lock */, 0299CE732886202800B5C7E7 /* Sources */, 0299CE742886202800B5C7E7 /* Frameworks */, 0299CE752886202800B5C7E7 /* Resources */, - BB2F78BEBE245D7D48C41820 /* [CP] Copy Pods Resources */, + F202C751E27E638202288B79 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -815,16 +815,16 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Rainbow" */; buildPhases = ( - 2D9D26600F4C9E0D02F62A88 /* [CP] Check Pods Manifest.lock */, + 58D46DFCC897D560DF7238EC /* [CP] Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 9FF961FEA7AF435FA18ED988 /* Upload Debug Symbols to Sentry */, 668ADB3225A4E3A40050859D /* Embed App Extensions */, - 6B4739E5535DF7E99F0022D2 /* [CP] Embed Pods Frameworks */, - F7FE6D014143799E2E6894D9 /* [CP] Copy Pods Resources */, - 3340F01A333AFB189AD85476 /* [CP-User] [RNFB] Core Configuration */, + 712E4B41786AE847D8D82804 /* [CP] Embed Pods Frameworks */, + B645329271EC2E2C170CA75B /* [CP] Copy Pods Resources */, + 09A7DC74FE15490E6EC30E26 /* [CP-User] [RNFB] Core Configuration */, ); buildRules = ( ); @@ -844,11 +844,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF6E272BA6F100FF5C78 /* Build configuration list for PBXNativeTarget "PriceWidgetExtension" */; buildPhases = ( - 7B777DFB693FD28E1DB8F77A /* [CP] Check Pods Manifest.lock */, + 6B031E223F6AC5E261E2209C /* [CP] Check Pods Manifest.lock */, C16DCF58272BA6EF00FF5C78 /* Sources */, C16DCF59272BA6EF00FF5C78 /* Frameworks */, C16DCF5A272BA6EF00FF5C78 /* Resources */, - BB62BF1016C4CA862C515CFC /* [CP] Copy Pods Resources */, + 99C0F14AAA799EF5C78E3FB9 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -863,11 +863,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF9F272BAB9600FF5C78 /* Build configuration list for PBXNativeTarget "SelectTokenIntent" */; buildPhases = ( - 3F02A98D7D1EC5BBE267C4DD /* [CP] Check Pods Manifest.lock */, + 5367F9783545F28460727F96 /* [CP] Check Pods Manifest.lock */, C16DCF7B272BAB9500FF5C78 /* Sources */, C16DCF7C272BAB9500FF5C78 /* Frameworks */, C16DCF7D272BAB9500FF5C78 /* Resources */, - EE77FD4F5751D4E858F705B1 /* [CP] Copy Pods Resources */, + 897D6F92EBB33792380F5E33 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1098,7 +1098,20 @@ shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport EXTRA_PACKAGER_ARGS=\"--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map\"\nset -ex\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\nSENTRY_CLI=\"../node_modules/@sentry/cli/bin/sentry-cli\"\n\n\n/bin/sh -c \"$WITH_ENVIRONMENT \\\"$SENTRY_CLI react-native xcode $REACT_NATIVE_XCODE\\\"\"\n"; showEnvVarsInLog = 0; }; - 2D9D26600F4C9E0D02F62A88 /* [CP] Check Pods Manifest.lock */ = { + 09A7DC74FE15490E6EC30E26 /* [CP-User] [RNFB] Core Configuration */ = { + 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"; + }; + 5367F9783545F28460727F96 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1113,27 +1126,36 @@ 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; }; - 3340F01A333AFB189AD85476 /* [CP-User] [RNFB] Core Configuration */ = { + 58D46DFCC897D560DF7238EC /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Rainbow-checkManifestLockResult.txt", ); - 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"; + 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; }; - 3F02A98D7D1EC5BBE267C4DD /* [CP] Check Pods Manifest.lock */ = { + 6B031E223F6AC5E261E2209C /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1148,14 +1170,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-SelectTokenIntent-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; }; - 6B4739E5535DF7E99F0022D2 /* [CP] Embed Pods Frameworks */ = { + 712E4B41786AE847D8D82804 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1173,7 +1195,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 7B777DFB693FD28E1DB8F77A /* [CP] Check Pods Manifest.lock */ = { + 7C2BB7E8EA2574B3A74BB808 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1188,35 +1210,20 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-PriceWidgetExtension-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-ImageNotification-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; }; - 9FF961FEA7AF435FA18ED988 /* Upload Debug Symbols to Sentry */ = { + 897D6F92EBB33792380F5E33 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - ); - name = "Upload Debug Symbols to Sentry"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-SelectTokenIntent-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym\n"; - }; - BB2F78BEBE245D7D48C41820 /* [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", @@ -1227,7 +1234,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 = ( @@ -1241,14 +1247,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", ); 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; }; - BB62BF1016C4CA862C515CFC /* [CP] Copy Pods Resources */ = { + 99C0F14AAA799EF5C78E3FB9 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1284,43 +1289,22 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh\"\n"; showEnvVarsInLog = 0; }; - EE77FD4F5751D4E858F705B1 /* [CP] Copy Pods Resources */ = { + 9FF961FEA7AF435FA18ED988 /* Upload Debug Symbols to Sentry */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${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", - "${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"; + name = "Upload Debug Symbols to Sentry"; 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", + "$(DERIVED_FILE_DIR)/Pods-SelectTokenIntent-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym\n"; }; - F7FE6D014143799E2E6894D9 /* [CP] Copy Pods Resources */ = { + B645329271EC2E2C170CA75B /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1376,26 +1360,42 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh\"\n"; showEnvVarsInLog = 0; }; - FD10D710D0C7F8EEE6EB0F77 /* [CP] Check Pods Manifest.lock */ = { + F202C751E27E638202288B79 /* [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-ImageNotification-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; }; /* End PBXShellScriptBuildPhase section */ @@ -1583,7 +1583,7 @@ /* Begin XCBuildConfiguration section */ 0299CE802886202800B5C7E7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4AE8D68F8252F11480F2D99E /* Pods-ImageNotification.debug.xcconfig */; + baseConfigurationReference = 11F3C03FC45727D52FAE847D /* Pods-ImageNotification.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1633,7 +1633,7 @@ }; 0299CE812886202800B5C7E7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6657A4835F27FC0FFFFBF340 /* Pods-ImageNotification.release.xcconfig */; + baseConfigurationReference = 883A50680E4D8A275AFBB48C /* Pods-ImageNotification.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1684,7 +1684,7 @@ }; 0299CE822886202800B5C7E7 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0C374E26CF6ED7C5C2C823ED /* Pods-ImageNotification.localrelease.xcconfig */; + baseConfigurationReference = FCB6238842FEFC329B82EB3C /* Pods-ImageNotification.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1732,7 +1732,7 @@ }; 0299CE832886202800B5C7E7 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E00C89EED34D89AE4F2A3462 /* Pods-ImageNotification.staging.xcconfig */; + baseConfigurationReference = 62CAF1459EC3D2C1F76CAAA6 /* Pods-ImageNotification.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1780,7 +1780,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7A533038ADA944A6493A66D1 /* Pods-Rainbow.debug.xcconfig */; + baseConfigurationReference = B652202E744A23B17A022084 /* Pods-Rainbow.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1836,7 +1836,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.39; + MARKETING_VERSION = 1.9.41; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -1857,7 +1857,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6FF8A19FD539CD5755E2A363 /* Pods-Rainbow.release.xcconfig */; + baseConfigurationReference = 62DD03EC74A1637EEB329C87 /* Pods-Rainbow.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1900,7 +1900,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.39; + MARKETING_VERSION = 1.9.41; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -1977,7 +1977,7 @@ }; 2C6A799821127ED9003AFB37 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4C6224CF2221F931780B3CE6 /* Pods-Rainbow.staging.xcconfig */; + baseConfigurationReference = F222FAC72622CB2711326815 /* Pods-Rainbow.staging.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2017,7 +2017,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.39; + MARKETING_VERSION = 1.9.41; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -2093,7 +2093,7 @@ }; 2C87B79A2197FA1900682EC4 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8148434135865DD9B63D5991 /* Pods-Rainbow.localrelease.xcconfig */; + baseConfigurationReference = 1539A52384919E5109C2C9B2 /* Pods-Rainbow.localrelease.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2133,7 +2133,7 @@ "$(PROJECT_DIR)", ); LLVM_LTO = YES; - MARKETING_VERSION = 1.9.39; + MARKETING_VERSION = 1.9.41; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", @@ -2266,7 +2266,7 @@ }; C16DCF6A272BA6F100FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E2E91009BF4E2373D0EAA867 /* Pods-PriceWidgetExtension.debug.xcconfig */; + baseConfigurationReference = C3AB85CEFE6AA92587D648DA /* Pods-PriceWidgetExtension.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2315,7 +2315,7 @@ }; C16DCF6B272BA6F100FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 675045CF6F69ECCABFA7ED3C /* Pods-PriceWidgetExtension.release.xcconfig */; + baseConfigurationReference = C83648862B87E1FB90335EFA /* Pods-PriceWidgetExtension.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2365,7 +2365,7 @@ }; C16DCF6C272BA6F100FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B04D80FD63CAEB682250EB0A /* Pods-PriceWidgetExtension.localrelease.xcconfig */; + baseConfigurationReference = AB3065204B58D1CAF6AB5BFB /* Pods-PriceWidgetExtension.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2412,7 +2412,7 @@ }; C16DCF6D272BA6F100FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B7B49161FD8417A90F7CB9A8 /* Pods-PriceWidgetExtension.staging.xcconfig */; + baseConfigurationReference = EBC7F3A7CB4D39D0EB49A89B /* Pods-PriceWidgetExtension.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2459,7 +2459,7 @@ }; C16DCFA0272BAB9600FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 33BC79874A51AA3880F7C4AC /* Pods-SelectTokenIntent.debug.xcconfig */; + baseConfigurationReference = 380324A440FD8D773D7F1074 /* Pods-SelectTokenIntent.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2506,7 +2506,7 @@ }; C16DCFA1272BAB9600FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E1179CDF5117977A37C590EE /* Pods-SelectTokenIntent.release.xcconfig */; + baseConfigurationReference = 75256BD3661D2D38F0A34282 /* Pods-SelectTokenIntent.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2554,7 +2554,7 @@ }; C16DCFA2272BAB9600FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0EF5903F6DA2DDF4181D7872 /* Pods-SelectTokenIntent.localrelease.xcconfig */; + baseConfigurationReference = 2FF98F997797E047DCAF7234 /* Pods-SelectTokenIntent.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2599,7 +2599,7 @@ }; C16DCFA3272BAB9600FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FD8F690D66D4FC3337BC4317 /* Pods-SelectTokenIntent.staging.xcconfig */; + baseConfigurationReference = E5F43237FF3957D40BFC7963 /* Pods-SelectTokenIntent.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; diff --git a/package.json b/package.json index 4c64b2fe7f1..8418907307e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Rainbow", - "version": "1.9.39-1", + "version": "1.9.41-1", "private": true, "scripts": { "setup": "yarn graphql-codegen:install && yarn ds:install && yarn allow-scripts && yarn postinstall && yarn graphql-codegen && yarn fetch:networks", @@ -41,12 +41,13 @@ "install-pods-fast": "cd ios && bundle exec pod install && cd ..", "install-pods-fast-jsc": "cd ios && bundle exec env USE_HERMES=NO pod install && cd ..", "install-pods-no-flipper": "cd ios && bundle exec env SKIP_FLIPPER=true pod install --repo-update && cd ..", - "ios": "react-native run-ios --simulator='iPhone 15 Pro'", + "ios": "react-native run-ios --simulator='iPhone 16 Pro'", "format": "prettier --write .", "format:check": "prettier --check .", "lint": "yarn format:check && yarn lint:ts && yarn lint:js", - "lint:ci": "yarn format:check && yarn lint:ts && yarn lint:js", + "lint:ci": "yarn format:check && yarn lint:ts && yarn lint:js:ci", "lint:js": "eslint --cache . --quiet", + "lint:js:ci": "eslint --quiet", "lint:ts": "yarn tsc --skipLibCheck --noEmit", "postinstall": "./scripts/postinstall.sh", "start": "react-native start", @@ -105,7 +106,7 @@ "@ledgerhq/react-native-hw-transport-ble": "6.27.7", "@metamask/eth-sig-util": "7.0.2", "@notifee/react-native": "7.8.2", - "@rainbow-me/provider": "0.0.12", + "@rainbow-me/provider": "0.1.1", "@rainbow-me/react-native-animated-number": "0.0.2", "@rainbow-me/swaps": "0.26.0", "@react-native-async-storage/async-storage": "1.23.1", @@ -125,14 +126,13 @@ "@react-navigation/stack": "6.3.29", "@reservoir0x/reservoir-sdk": "2.3.0", "@rudderstack/rudder-sdk-react-native": "1.12.1", - "@sentry/react-native": "5.22.0", + "@sentry/react-native": "5.31.1", "@shopify/flash-list": "1.7.0", "@shopify/react-native-skia": "1.3.11", "@tanstack/query-async-storage-persister": "4.2.1", "@tanstack/react-query": "4.2.1", "@tanstack/react-query-persist-client": "4.2.1", "@tradle/react-native-http": "2.0.1", - "@types/detox": "18.1.0", "@types/i18n-js": "3.0.3", "@types/lodash": "4.14.168", "@types/react-redux": "7.1.9", @@ -234,7 +234,7 @@ "react-native-gesture-handler": "2.18.1", "react-native-get-random-values": "1.5.0", "react-native-haptic-feedback": "2.2.0", - "react-native-image-crop-picker": "0.41.0", + "react-native-image-crop-picker": "0.41.2", "react-native-indicators": "0.17.0", "react-native-ios-context-menu": "1.15.3", "react-native-keyboard-area": "1.0.6", @@ -354,7 +354,7 @@ "babel-plugin-transform-remove-console": "6.9.4", "chai": "4.2.0", "depcheck": "1.4.7", - "detox": "20.19.3", + "detox": "20.26.2", "dotenv": "8.2.0", "eslint": "8.22.0", "eslint-config-rainbow": "4.3.0", diff --git a/patches/react-native-cloud-fs+2.6.1.patch b/patches/react-native-cloud-fs+2.6.2.patch similarity index 100% rename from patches/react-native-cloud-fs+2.6.1.patch rename to patches/react-native-cloud-fs+2.6.2.patch diff --git a/patches/react-native-image-crop-picker+0.41.0.patch b/patches/react-native-image-crop-picker+0.41.2.patch similarity index 100% rename from patches/react-native-image-crop-picker+0.41.0.patch rename to patches/react-native-image-crop-picker+0.41.2.patch diff --git a/src/__swaps__/screens/Swap/components/SearchInputButton.tsx b/src/__swaps__/screens/Swap/components/SearchInputButton.tsx index 30c5a60f673..aa89ce65023 100644 --- a/src/__swaps__/screens/Swap/components/SearchInputButton.tsx +++ b/src/__swaps__/screens/Swap/components/SearchInputButton.tsx @@ -10,6 +10,7 @@ import { THICK_BORDER_WIDTH } from '../constants'; import { useClipboard } from '@/hooks'; import { TIMING_CONFIGS } from '@/components/animations/animationConfigs'; import { triggerHapticFeedback } from '@/screens/points/constants'; +import { IS_ANDROID } from '@/env'; const CANCEL_LABEL = i18n.t(i18n.l.button.cancel); const CLOSE_LABEL = i18n.t(i18n.l.button.close); @@ -35,6 +36,7 @@ export const SearchInputButton = ({ outputSearchRef, AnimatedSwapStyles, } = useSwapContext(); + const { hasClipboardData } = useClipboard(); const btnText = useDerivedValue(() => { @@ -74,9 +76,10 @@ export const SearchInputButton = ({ const isOutputSearchFocused = outputProgress.value === NavigationSteps.SEARCH_FOCUSED; const isOutputTokenListFocused = outputProgress.value === NavigationSteps.TOKEN_LIST_FOCUSED; - const isVisible = isInputSearchFocused || isOutputSearchFocused || output || (!output && !!internalSelectedInputAsset.value); + const clipboardDataAvailable = hasClipboardData || IS_ANDROID; - const isPasteDisabled = output && !internalSelectedOutputAsset.value && isOutputTokenListFocused && !hasClipboardData; + const isPasteDisabled = output && !internalSelectedOutputAsset.value && isOutputTokenListFocused && !clipboardDataAvailable; + const isVisible = isInputSearchFocused || isOutputSearchFocused || output || (!output && !!internalSelectedInputAsset.value); const visibleOpacity = isPasteDisabled ? 0.4 : 1; return { diff --git a/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx b/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx index 179ef8defdf..60dd457215d 100644 --- a/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx +++ b/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx @@ -11,6 +11,8 @@ import { FadeMask } from '@/__swaps__/screens/Swap/components/FadeMask'; import { GestureHandlerButton } from '@/__swaps__/screens/Swap/components/GestureHandlerButton'; import { SwapActionButton } from '@/__swaps__/screens/Swap/components/SwapActionButton'; import { SwapInput } from '@/__swaps__/screens/Swap/components/SwapInput'; +import { SwapNativeInput } from '@/__swaps__/screens/Swap/components/SwapNativeInput'; +import { SwapInputValuesCaret } from '@/__swaps__/screens/Swap/components/SwapInputValuesCaret'; import { TokenList } from '@/__swaps__/screens/Swap/components/TokenList/TokenList'; import { BASE_INPUT_WIDTH, INPUT_INNER_WIDTH, INPUT_PADDING, THICK_BORDER_WIDTH } from '@/__swaps__/screens/Swap/constants'; @@ -50,7 +52,7 @@ function SwapInputActionButton() { } function SwapInputAmount() { - const { focusedInput, SwapTextStyles, SwapInputController, AnimatedSwapStyles } = useSwapContext(); + const { focusedInput, SwapTextStyles, SwapInputController } = useSwapContext(); return ( {SwapInputController.formattedInputAmount} - - - + @@ -119,15 +119,7 @@ function InputAssetBalanceBadge() { } export function SwapInputAsset() { - const { - outputProgress, - inputProgress, - AnimatedSwapStyles, - SwapTextStyles, - SwapInputController, - internalSelectedInputAsset, - SwapNavigation, - } = useSwapContext(); + const { outputProgress, inputProgress, AnimatedSwapStyles, internalSelectedInputAsset, SwapNavigation } = useSwapContext(); return ( @@ -143,9 +135,7 @@ export function SwapInputAsset() { - - {SwapInputController.formattedInputNativeValue} - + @@ -174,14 +164,6 @@ export const styles = StyleSheet.create({ backgroundOverlay: { backgroundColor: 'rgba(0, 0, 0, 0.88)', }, - caret: { - height: 32, - width: 2, - }, - caretContainer: { - flexGrow: 100, - flexShrink: 0, - }, flipButton: { borderRadius: 15, height: 30, diff --git a/src/__swaps__/screens/Swap/components/SwapInputValuesCaret.tsx b/src/__swaps__/screens/Swap/components/SwapInputValuesCaret.tsx new file mode 100644 index 00000000000..99c57675935 --- /dev/null +++ b/src/__swaps__/screens/Swap/components/SwapInputValuesCaret.tsx @@ -0,0 +1,95 @@ +import { Box, useColorMode } from '@/design-system'; +import React from 'react'; +import { StyleSheet } from 'react-native'; +import Animated, { Easing, SharedValue, useAnimatedStyle, withRepeat, withSequence, withTiming } from 'react-native-reanimated'; +import { SLIDER_COLLAPSED_HEIGHT, SLIDER_HEIGHT, caretConfig } from '@/__swaps__/screens/Swap/constants'; +import { equalWorklet } from '@/__swaps__/safe-math/SafeMath'; +import { NavigationSteps } from '@/__swaps__/screens/Swap/hooks/useSwapNavigation'; +import { useSwapContext } from '@/__swaps__/screens/Swap/providers/swap-provider'; +import { inputKeys } from '@/__swaps__/types/swap'; +import { getColorValueForThemeWorklet } from '@/__swaps__/utils/swaps'; + +export function SwapInputValuesCaret({ inputCaretType, disabled }: { inputCaretType: inputKeys; disabled?: SharedValue }) { + const { isDarkMode } = useColorMode(); + const { + configProgress, + focusedInput, + inputProgress, + internalSelectedInputAsset, + internalSelectedOutputAsset, + isQuoteStale, + outputProgress, + SwapInputController, + sliderPressProgress, + } = useSwapContext(); + + const inputMethod = SwapInputController.inputMethod; + const inputValues = SwapInputController.inputValues; + + const caretStyle = useAnimatedStyle(() => { + const shouldShow = + !disabled?.value && + configProgress.value === NavigationSteps.INPUT_ELEMENT_FOCUSED && + focusedInput.value === inputCaretType && + inputProgress.value === 0 && + outputProgress.value === 0 && + (inputMethod.value !== 'slider' || + (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)) || + (sliderPressProgress.value === SLIDER_COLLAPSED_HEIGHT / SLIDER_HEIGHT && isQuoteStale.value === 0)); + + const opacity = shouldShow + ? withRepeat( + withSequence( + withTiming(1, { duration: 0 }), + withTiming(1, { duration: 400, easing: Easing.bezier(0.87, 0, 0.13, 1) }), + withTiming(0, caretConfig), + withTiming(1, caretConfig) + ), + -1, + true + ) + : withTiming(0, caretConfig); + + const isZero = + (inputMethod.value !== 'slider' && inputValues.value[inputCaretType] === 0) || + (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)); + + return { + display: shouldShow ? 'flex' : 'none', + opacity, + position: isZero ? 'absolute' : 'relative', + }; + }); + + const assetCaretStyle = useAnimatedStyle(() => { + const selectedAsset = + inputCaretType === 'inputAmount' || inputCaretType === 'inputNativeValue' ? internalSelectedInputAsset : internalSelectedOutputAsset; + return { + backgroundColor: getColorValueForThemeWorklet(selectedAsset.value?.highContrastColor, isDarkMode, true), + }; + }); + + const caretSizeStyle = + inputCaretType === 'inputNativeValue' || inputCaretType === 'outputNativeValue' ? styles.nativeCaret : styles.inputCaret; + + return ( + + + + ); +} + +export const styles = StyleSheet.create({ + nativeCaret: { + height: 19, + width: 1.5, + }, + inputCaret: { + height: 32, + width: 2, + }, + caretContainer: { + flexGrow: 100, + flexShrink: 0, + }, +}); diff --git a/src/__swaps__/screens/Swap/components/SwapNativeInput.tsx b/src/__swaps__/screens/Swap/components/SwapNativeInput.tsx new file mode 100644 index 00000000000..7432d641750 --- /dev/null +++ b/src/__swaps__/screens/Swap/components/SwapNativeInput.tsx @@ -0,0 +1,82 @@ +import { AnimatedText, Box } from '@/design-system'; +import React from 'react'; +import { StyleSheet } from 'react-native'; +import Animated, { runOnJS, useAnimatedStyle, useDerivedValue } from 'react-native-reanimated'; + +import { SwapInputValuesCaret } from '@/__swaps__/screens/Swap/components/SwapInputValuesCaret'; +import { GestureHandlerButton } from '@/__swaps__/screens/Swap/components/GestureHandlerButton'; +import { useSwapContext } from '@/__swaps__/screens/Swap/providers/swap-provider'; +import { equalWorklet } from '@/__swaps__/safe-math/SafeMath'; + +export function SwapNativeInput({ + nativeInputType, + handleTapWhileDisabled, +}: { + nativeInputType: 'inputNativeValue' | 'outputNativeValue'; + handleTapWhileDisabled?: () => void; +}) { + const { + focusedInput, + internalSelectedInputAsset, + internalSelectedOutputAsset, + outputQuotesAreDisabled, + SwapTextStyles, + SwapInputController, + } = useSwapContext(); + + const formattedNativeInput = + nativeInputType === 'inputNativeValue' ? SwapInputController.formattedInputNativeValue : SwapInputController.formattedOutputNativeValue; + + const textStyle = nativeInputType === 'inputNativeValue' ? SwapTextStyles.inputNativeValueStyle : SwapTextStyles.outputNativeValueStyle; + + const nativeCurrencySymbol = formattedNativeInput.value.slice(0, 1); + const formattedNativeValue = useDerivedValue(() => { + return formattedNativeInput.value.slice(1); + }); + + const disabled = useDerivedValue(() => { + if (nativeInputType === 'outputNativeValue' && outputQuotesAreDisabled.value) return true; + + // disable caret and pointer events for native inputs when corresponding asset is missing price + const asset = nativeInputType === 'inputNativeValue' ? internalSelectedInputAsset : internalSelectedOutputAsset; + const assetPrice = asset.value?.nativePrice || asset.value?.price?.value || 0; + return !assetPrice || equalWorklet(assetPrice, 0); + }); + + const pointerEventsStyle = useAnimatedStyle(() => { + return { + pointerEvents: disabled.value ? 'none' : 'box-only', + }; + }); + + return ( + { + 'worklet'; + if (outputQuotesAreDisabled.value && handleTapWhileDisabled && nativeInputType === 'outputNativeValue') { + runOnJS(handleTapWhileDisabled)(); + } else { + focusedInput.value = nativeInputType; + } + }} + > + + + {nativeCurrencySymbol} + + + + {formattedNativeValue} + + + + + + ); +} + +export const styles = StyleSheet.create({ + nativeContainer: { alignItems: 'center', flexDirection: 'row', height: 17, pointerEvents: 'box-only' }, + nativeRowContainer: { alignItems: 'center', flexDirection: 'row' }, +}); diff --git a/src/__swaps__/screens/Swap/components/SwapNumberPad.tsx b/src/__swaps__/screens/Swap/components/SwapNumberPad.tsx index a90b5dace9d..b9b9a5286a4 100644 --- a/src/__swaps__/screens/Swap/components/SwapNumberPad.tsx +++ b/src/__swaps__/screens/Swap/components/SwapNumberPad.tsx @@ -11,9 +11,10 @@ import Animated, { withDelay, withTiming, } from 'react-native-reanimated'; - +import { supportedNativeCurrencies } from '@/references'; import { Bleed, Box, Columns, HitSlop, Separator, Text, useColorMode, useForegroundColor } from '@/design-system'; -import { stripCommas } from '@/__swaps__/utils/swaps'; +import { equalWorklet } from '@/__swaps__/safe-math/SafeMath'; +import { stripNonDecimalNumbers } from '@/__swaps__/utils/swaps'; import { CUSTOM_KEYBOARD_HEIGHT, LIGHT_SEPARATOR_COLOR, @@ -30,6 +31,7 @@ import { colors } from '@/styles'; import { NavigationSteps, useSwapContext } from '@/__swaps__/screens/Swap/providers/swap-provider'; import { IS_IOS } from '@/env'; import { inputKeys } from '@/__swaps__/types/swap'; +import { useAccountSettings } from '@/hooks'; type numberPadCharacter = number | 'backspace' | '.'; @@ -49,23 +51,81 @@ const getFormattedInputKey = (inputKey: inputKeys) => { export const SwapNumberPad = () => { const { isDarkMode } = useColorMode(); - const { focusedInput, isQuoteStale, SwapInputController, configProgress, outputQuotesAreDisabled } = useSwapContext(); + const { nativeCurrency } = useAccountSettings(); + const { + focusedInput, + internalSelectedInputAsset, + internalSelectedOutputAsset, + isQuoteStale, + SwapInputController, + configProgress, + outputQuotesAreDisabled, + } = useSwapContext(); const longPressTimer = useSharedValue(0); - const addNumber = (number?: number) => { + const removeFormatting = (inputKey: inputKeys) => { 'worklet'; + return stripNonDecimalNumbers(SwapInputController[getFormattedInputKey(inputKey)].value); + }; + + const ignoreChange = ({ currentValue, addingDecimal = false }: { currentValue?: string; addingDecimal?: boolean }) => { + 'worklet'; + // ignore when: outputQuotesAreDisabled and we are updating the output amount or output native value if ((focusedInput.value === 'outputAmount' || focusedInput.value === 'outputNativeValue') && outputQuotesAreDisabled.value) { + return true; + } + + // ignore when: corresponding asset does not have a price and we are updating native inputs + const inputAssetPrice = internalSelectedInputAsset.value?.nativePrice || internalSelectedInputAsset.value?.price?.value || 0; + const outputAssetPrice = internalSelectedOutputAsset.value?.nativePrice || internalSelectedOutputAsset.value?.price?.value || 0; + const outputAssetHasNoPrice = !outputAssetPrice || equalWorklet(outputAssetPrice, 0); + const inputAssetHasNoPrice = !inputAssetPrice || equalWorklet(inputAssetPrice, 0); + if ( + (focusedInput.value === 'outputNativeValue' && outputAssetHasNoPrice) || + (focusedInput.value === 'inputNativeValue' && inputAssetHasNoPrice) + ) { + return true; + } + + // ignore when: decimals exceed native currency decimals + if (currentValue) { + const currentValueDecimals = currentValue.split('.')?.[1]?.length ?? -1; + const nativeCurrencyDecimals = supportedNativeCurrencies[nativeCurrency].decimals; + + const isNativePlaceholderValue = equalWorklet(currentValue, 0) && SwapInputController.inputMethod.value !== focusedInput.value; + + if (addingDecimal && nativeCurrencyDecimals === 0) { + return true; + } else if ( + (focusedInput.value === 'inputNativeValue' || focusedInput.value === 'outputNativeValue') && + !isNativePlaceholderValue && + currentValueDecimals >= nativeCurrencyDecimals + ) { + return true; + } + } + return false; + }; + + const addNumber = (number?: number) => { + 'worklet'; + const inputKey = focusedInput.value; + const currentValue = removeFormatting(inputKey); + + if (ignoreChange({ currentValue })) { return; } // Immediately stop the quote fetching interval SwapInputController.quoteFetchingInterval.stop(); - const inputKey = focusedInput.value; - const currentValue = stripCommas(SwapInputController[getFormattedInputKey(inputKey)].value); + const inputMethod = SwapInputController.inputMethod.value; - const newValue = currentValue === '0' ? `${number}` : `${currentValue}${number}`; + const isNativePlaceholderValue = + equalWorklet(currentValue, 0) && inputMethod !== inputKey && (inputKey === 'inputNativeValue' || inputKey === 'outputNativeValue'); + + const newValue = currentValue === '0' || isNativePlaceholderValue ? `${number}` : `${currentValue}${number}`; // For a uint256, the maximum value is: // 2e256 − 1 =115792089237316195423570985008687907853269984665640564039457584007913129639935 @@ -79,7 +139,7 @@ export const SwapNumberPad = () => { isQuoteStale.value = 1; } - if (SwapInputController.inputMethod.value !== inputKey) { + if (inputMethod !== inputKey) { SwapInputController.inputMethod.value = inputKey; } @@ -94,7 +154,11 @@ export const SwapNumberPad = () => { const addDecimalPoint = () => { 'worklet'; const inputKey = focusedInput.value; - const currentValue = stripCommas(SwapInputController[getFormattedInputKey(inputKey)].value); + const currentValue = removeFormatting(inputKey); + + if (ignoreChange({ currentValue, addingDecimal: true })) { + return; + } if (!currentValue.includes('.')) { if (SwapInputController.inputMethod.value !== inputKey) { @@ -115,7 +179,7 @@ export const SwapNumberPad = () => { const deleteLastCharacter = () => { 'worklet'; - if ((focusedInput.value === 'outputAmount' || focusedInput.value === 'outputNativeValue') && outputQuotesAreDisabled.value) { + if (ignoreChange({})) { return; } @@ -125,7 +189,7 @@ export const SwapNumberPad = () => { SwapInputController.inputMethod.value = inputKey; } - const currentValue = stripCommas(SwapInputController[getFormattedInputKey(inputKey)].value); + const currentValue = removeFormatting(inputKey); // Handle deletion, ensuring a placeholder zero remains if the entire number is deleted const newValue = currentValue.length > 1 ? currentValue.slice(0, -1) : 0; diff --git a/src/__swaps__/screens/Swap/components/SwapOutputAsset.tsx b/src/__swaps__/screens/Swap/components/SwapOutputAsset.tsx index 3ccde4f4748..e3a5557ead5 100644 --- a/src/__swaps__/screens/Swap/components/SwapOutputAsset.tsx +++ b/src/__swaps__/screens/Swap/components/SwapOutputAsset.tsx @@ -7,6 +7,8 @@ import { ScreenCornerRadius } from 'react-native-screen-corner-radius'; import { AnimatedSwapCoinIcon } from '@/__swaps__/screens/Swap/components/AnimatedSwapCoinIcon'; import { BalanceBadge } from '@/__swaps__/screens/Swap/components/BalanceBadge'; +import { SwapNativeInput } from '@/__swaps__/screens/Swap/components/SwapNativeInput'; +import { SwapInputValuesCaret } from '@/__swaps__/screens/Swap/components/SwapInputValuesCaret'; import { FadeMask } from '@/__swaps__/screens/Swap/components/FadeMask'; import { GestureHandlerButton } from '@/__swaps__/screens/Swap/components/GestureHandlerButton'; import { SwapActionButton } from '@/__swaps__/screens/Swap/components/SwapActionButton'; @@ -20,7 +22,6 @@ import * as i18n from '@/languages'; import { useNavigation } from '@/navigation'; import Routes from '@/navigation/routesNames'; import { useSwapsStore } from '@/state/swaps/swapsStore'; -import { ethereumUtils } from '@/utils'; import Clipboard from '@react-native-clipboard/clipboard'; import { CopyPasteMenu } from './CopyPasteMenu'; @@ -51,27 +52,8 @@ function SwapOutputActionButton() { ); } -function SwapOutputAmount() { - const { navigate } = useNavigation(); - const { focusedInput, SwapTextStyles, SwapInputController, AnimatedSwapStyles, outputQuotesAreDisabled } = useSwapContext(); - - const handleTapWhileDisabled = useCallback(() => { - const { inputAsset, outputAsset } = useSwapsStore.getState(); - const inputTokenSymbol = inputAsset?.symbol; - const outputTokenSymbol = outputAsset?.symbol; - const isCrosschainSwap = inputAsset?.chainId !== outputAsset?.chainId; - const isBridgeSwap = inputTokenSymbol === outputTokenSymbol; - - navigate(Routes.EXPLAIN_SHEET, { - inputToken: inputTokenSymbol, - fromChainId: inputAsset?.chainId ?? ChainId.mainnet, - toChainId: outputAsset?.chainId ?? ChainId.mainnet, - isCrosschainSwap, - isBridgeSwap, - outputToken: outputTokenSymbol, - type: 'output_disabled', - }); - }, [navigate]); +function SwapOutputAmount({ handleTapWhileDisabled }: { handleTapWhileDisabled: () => void }) { + const { focusedInput, SwapTextStyles, SwapInputController, outputQuotesAreDisabled } = useSwapContext(); const [isPasteEnabled, setIsPasteEnabled] = useState(() => !outputQuotesAreDisabled.value); useAnimatedReaction( @@ -115,9 +97,7 @@ function SwapOutputAmount() { {SwapInputController.formattedOutputAmount} - - - + @@ -147,15 +127,26 @@ function OutputAssetBalanceBadge() { } export function SwapOutputAsset() { - const { - outputProgress, - inputProgress, - AnimatedSwapStyles, - SwapTextStyles, - SwapInputController, - internalSelectedOutputAsset, - SwapNavigation, - } = useSwapContext(); + const { outputProgress, inputProgress, AnimatedSwapStyles, internalSelectedOutputAsset, SwapNavigation } = useSwapContext(); + const { navigate } = useNavigation(); + + const handleTapWhileDisabled = useCallback(() => { + const { inputAsset, outputAsset } = useSwapsStore.getState(); + const inputTokenSymbol = inputAsset?.symbol; + const outputTokenSymbol = outputAsset?.symbol; + const isCrosschainSwap = inputAsset?.chainId !== outputAsset?.chainId; + const isBridgeSwap = inputTokenSymbol === outputTokenSymbol; + + navigate(Routes.EXPLAIN_SHEET, { + inputToken: inputTokenSymbol, + fromChainId: inputAsset?.chainId ?? ChainId.mainnet, + toChainId: outputAsset?.chainId ?? ChainId.mainnet, + isCrosschainSwap, + isBridgeSwap, + outputToken: outputTokenSymbol, + type: 'output_disabled', + }); + }, [navigate]); return ( @@ -165,15 +156,13 @@ export function SwapOutputAsset() { - + - - {SwapInputController.formattedOutputNativeValue} - + @@ -203,14 +192,6 @@ export const styles = StyleSheet.create({ backgroundOverlay: { backgroundColor: 'rgba(0, 0, 0, 0.88)', }, - caret: { - height: 32, - width: 2, - }, - caretContainer: { - flexGrow: 100, - flexShrink: 0, - }, flipButton: { borderRadius: 15, height: 30, diff --git a/src/__swaps__/screens/Swap/hooks/useAnimatedSwapStyles.ts b/src/__swaps__/screens/Swap/hooks/useAnimatedSwapStyles.ts index 6e74ff1b4f1..244dd9f993e 100644 --- a/src/__swaps__/screens/Swap/hooks/useAnimatedSwapStyles.ts +++ b/src/__swaps__/screens/Swap/hooks/useAnimatedSwapStyles.ts @@ -212,18 +212,6 @@ export function useAnimatedSwapStyles({ }; }); - const assetToSellCaretStyle = useAnimatedStyle(() => { - return { - backgroundColor: getColorValueForThemeWorklet(internalSelectedInputAsset.value?.highContrastColor, isDarkMode, true), - }; - }); - - const assetToBuyCaretStyle = useAnimatedStyle(() => { - return { - backgroundColor: getColorValueForThemeWorklet(internalSelectedOutputAsset.value?.highContrastColor, isDarkMode, true), - }; - }); - const flipButtonFetchingStyle = useAnimatedStyle(() => { if (IS_ANDROID) return { borderWidth: 0 }; return { @@ -309,9 +297,7 @@ export function useAnimatedSwapStyles({ outputTokenListStyle, swapActionWrapperStyle, assetToSellIconStyle, - assetToSellCaretStyle, assetToBuyIconStyle, - assetToBuyCaretStyle, hideWhileReviewingOrConfiguringGas, flipButtonFetchingStyle, searchInputAssetButtonStyle, diff --git a/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts b/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts index e82fa75fc39..030f7297458 100644 --- a/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts +++ b/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts @@ -1,4 +1,11 @@ -import { divWorklet, equalWorklet, greaterThanWorklet, isNumberStringWorklet, mulWorklet } from '@/__swaps__/safe-math/SafeMath'; +import { + divWorklet, + equalWorklet, + greaterThanWorklet, + isNumberStringWorklet, + mulWorklet, + toFixedWorklet, +} from '@/__swaps__/safe-math/SafeMath'; import { SCRUBBER_WIDTH, SLIDER_WIDTH, snappySpringConfig } from '@/__swaps__/screens/Swap/constants'; import { ExtendedAnimatedAssetWithColors } from '@/__swaps__/types/assets'; import { ChainId } from '@/chains/types'; @@ -10,7 +17,14 @@ import { convertRawAmountToDecimalFormat, handleSignificantDecimalsWorklet, } from '@/__swaps__/utils/numbers'; -import { addCommasToNumber, buildQuoteParams, clamp, getDefaultSlippageWorklet, trimTrailingZeros } from '@/__swaps__/utils/swaps'; +import { + addCommasToNumber, + addSymbolToNativeDisplayWorklet, + buildQuoteParams, + clamp, + getDefaultSlippageWorklet, + trimTrailingZeros, +} from '@/__swaps__/utils/swaps'; import { analyticsV2 } from '@/analytics'; import { SPRING_CONFIGS } from '@/components/animations/animationConfigs'; import { useAccountSettings } from '@/hooks'; @@ -102,7 +116,7 @@ export function useSwapInputsController({ return addCommasToNumber(inputValues.value.inputAmount, '0'); } - if (inputMethod.value === 'outputAmount') { + if (inputMethod.value === 'outputAmount' || inputMethod.value === 'inputNativeValue' || inputMethod.value === 'outputNativeValue') { return valueBasedDecimalFormatter({ amount: inputValues.value.inputAmount, nativePrice: inputNativePrice.value, @@ -121,16 +135,19 @@ export function useSwapInputsController({ }); const formattedInputNativeValue = useDerivedValue(() => { + if (inputMethod.value === 'inputNativeValue') { + return addSymbolToNativeDisplayWorklet(inputValues.value.inputNativeValue, currentCurrency); + } if ( (inputMethod.value === 'slider' && percentageToSwap.value === 0) || !inputValues.value.inputNativeValue || !isNumberStringWorklet(inputValues.value.inputNativeValue.toString()) || equalWorklet(inputValues.value.inputNativeValue, 0) ) { - return convertAmountToNativeDisplayWorklet(0, currentCurrency); + return convertAmountToNativeDisplayWorklet(0, currentCurrency, false, true); } - return convertAmountToNativeDisplayWorklet(inputValues.value.inputNativeValue, currentCurrency); + return convertAmountToNativeDisplayWorklet(inputValues.value.inputNativeValue, currentCurrency, false, true); }); const formattedOutputAmount = useDerivedValue(() => { @@ -154,16 +171,19 @@ export function useSwapInputsController({ }); const formattedOutputNativeValue = useDerivedValue(() => { + if (inputMethod.value === 'outputNativeValue') { + return addSymbolToNativeDisplayWorklet(inputValues.value.outputNativeValue, currentCurrency); + } if ( (inputMethod.value === 'slider' && percentageToSwap.value === 0) || !inputValues.value.outputNativeValue || !isNumberStringWorklet(inputValues.value.outputNativeValue.toString()) || equalWorklet(inputValues.value.outputNativeValue, 0) ) { - return convertAmountToNativeDisplayWorklet(0, currentCurrency); + return convertAmountToNativeDisplayWorklet(0, currentCurrency, false, true); } - return convertAmountToNativeDisplayWorklet(inputValues.value.outputNativeValue, currentCurrency); + return convertAmountToNativeDisplayWorklet(inputValues.value.outputNativeValue, currentCurrency, false, true); }); const updateNativePriceForAsset = useCallback( @@ -206,7 +226,7 @@ export function useSwapInputsController({ } // NOTE: if we encounter a quote error, let's make sure to update the outputAmount and inputAmount to 0 accordingly - if (lastTypedInput.value === 'inputAmount') { + if (lastTypedInput.value === 'inputAmount' || lastTypedInput.value === 'inputNativeValue') { inputValues.modify(prev => { return { ...prev, @@ -214,7 +234,7 @@ export function useSwapInputsController({ outputNativeValue: 0, }; }); - } else if (lastTypedInput.value === 'outputAmount') { + } else if (lastTypedInput.value === 'outputAmount' || lastTypedInput.value === 'outputNativeValue') { inputValues.modify(prev => { return { ...prev, @@ -246,7 +266,6 @@ export function useSwapInputsController({ quoteFetchingInterval: ReturnType; }) => { 'worklet'; - // Check whether the quote has been superseded by new user input so we don't introduce conflicting updates const isLastTypedInputStillValid = originalQuoteParams.lastTypedInput === lastTypedInput.value; @@ -259,7 +278,9 @@ export function useSwapInputsController({ const isInputAmountStillValid = originalQuoteParams.inputAmount === inputValues.value.inputAmount; const isOutputAmountStillValid = originalQuoteParams.outputAmount === inputValues.value.outputAmount; const areInputAmountsStillValid = - originalQuoteParams.lastTypedInput === 'inputAmount' ? isInputAmountStillValid : isOutputAmountStillValid; + originalQuoteParams.lastTypedInput === 'inputAmount' || originalQuoteParams.lastTypedInput === 'inputNativeValue' + ? isInputAmountStillValid + : isOutputAmountStillValid; // Set prices first regardless of the quote status, as long as the same assets are still selected if (inputPrice && isInputUniqueIdStillValid) { @@ -476,7 +497,7 @@ export function useSwapInputsController({ } const quotedInputAmount = - lastTypedInputParam === 'outputAmount' + lastTypedInputParam === 'outputAmount' || lastTypedInputParam === 'outputNativeValue' ? Number( convertRawAmountToDecimalFormat( quoteResponse.sellAmount.toString(), @@ -486,7 +507,7 @@ export function useSwapInputsController({ : undefined; const quotedOutputAmount = - lastTypedInputParam === 'inputAmount' + lastTypedInputParam === 'inputAmount' || lastTypedInputParam === 'inputNativeValue' ? Number( convertRawAmountToDecimalFormat( quoteResponse.buyAmountMinusFees.toString(), @@ -762,7 +783,7 @@ export function useSwapInputsController({ /** * Observes value changes in the active inputMethod, which can be any of the following: * - inputAmount - * - inputNativeValue (TODO) + * - inputNativeValue * - outputAmount * - outputNativeValue (TODO) * - sliderXPosition @@ -870,6 +891,56 @@ export function useSwapInputsController({ }; }); + runOnJS(debouncedFetchQuote)(); + } + } + const inputMethodValue = inputMethod.value; + const isNativeInputMethod = inputMethodValue === 'inputNativeValue'; + const isNativeOutputMethod = inputMethodValue === 'outputNativeValue'; + if ( + (isNativeInputMethod || isNativeOutputMethod) && + !equalWorklet(current.values[inputMethodValue], previous.values[inputMethodValue]) + ) { + // If the number in the native field changes + lastTypedInput.value = inputMethodValue; + if (equalWorklet(current.values[inputMethodValue], 0)) { + // If the native amount was set to 0 + resetValuesToZeroWorklet({ updateSlider: true, inputKey: inputMethodValue }); + } else { + // If the native amount was set to a non-zero value + if (isNativeInputMethod && !internalSelectedInputAsset.value) return; + if (isNativeOutputMethod && !internalSelectedOutputAsset.value) return; + + // If the asset price is zero + if (isNativeInputMethod && equalWorklet(inputNativePrice.value, 0)) return; + if (isNativeOutputMethod && equalWorklet(outputNativePrice.value, 0)) return; + + if (isQuoteStale.value !== 1) isQuoteStale.value = 1; + const nativePrice = isNativeInputMethod ? inputNativePrice.value : outputNativePrice.value; + const decimalPlaces = isNativeInputMethod + ? internalSelectedInputAsset.value?.decimals + : internalSelectedOutputAsset.value?.decimals; + const amount = toFixedWorklet(divWorklet(current.values[inputMethodValue], nativePrice), decimalPlaces || 18); + const amountKey = isNativeInputMethod ? 'inputAmount' : 'outputAmount'; + + inputValues.modify(values => { + return { + ...values, + [amountKey]: amount, + }; + }); + + if (isNativeInputMethod) { + const inputAssetBalance = internalSelectedInputAsset.value?.maxSwappableAmount || '0'; + + if (equalWorklet(inputAssetBalance, 0)) { + sliderXPosition.value = withSpring(0, snappySpringConfig); + } else { + const updatedSliderPosition = clamp(Number(divWorklet(amount, inputAssetBalance)) * SLIDER_WIDTH, 0, SLIDER_WIDTH); + sliderXPosition.value = withSpring(updatedSliderPosition, snappySpringConfig); + } + } + runOnJS(debouncedFetchQuote)(); } } diff --git a/src/__swaps__/screens/Swap/hooks/useSwapTextStyles.ts b/src/__swaps__/screens/Swap/hooks/useSwapTextStyles.ts index 92facea2c77..be633447abb 100644 --- a/src/__swaps__/screens/Swap/hooks/useSwapTextStyles.ts +++ b/src/__swaps__/screens/Swap/hooks/useSwapTextStyles.ts @@ -1,5 +1,4 @@ import { - Easing, SharedValue, interpolateColor, useAnimatedStyle, @@ -11,45 +10,27 @@ import { } from 'react-native-reanimated'; import { useColorMode, useForegroundColor } from '@/design-system'; -import { - ETH_COLOR_DARK, - ETH_COLOR_DARK_ACCENT, - SLIDER_COLLAPSED_HEIGHT, - SLIDER_HEIGHT, - caretConfig, - pulsingConfig, -} from '@/__swaps__/screens/Swap/constants'; -import { inputKeys, inputMethods, inputValuesType } from '@/__swaps__/types/swap'; +import { ETH_COLOR_DARK, ETH_COLOR_DARK_ACCENT, pulsingConfig } from '@/__swaps__/screens/Swap/constants'; +import { inputMethods, inputValuesType } from '@/__swaps__/types/swap'; import { getColorValueForThemeWorklet, opacity } from '@/__swaps__/utils/swaps'; import { ExtendedAnimatedAssetWithColors } from '@/__swaps__/types/assets'; import { equalWorklet } from '@/__swaps__/safe-math/SafeMath'; import { SPRING_CONFIGS, TIMING_CONFIGS } from '@/components/animations/animationConfigs'; -import { NavigationSteps } from './useSwapNavigation'; export function useSwapTextStyles({ - configProgress, inputMethod, inputValues, internalSelectedInputAsset, internalSelectedOutputAsset, isFetching, isQuoteStale, - focusedInput, - inputProgress, - outputProgress, - sliderPressProgress, }: { - configProgress: SharedValue; inputMethod: SharedValue; inputValues: SharedValue; internalSelectedInputAsset: SharedValue; internalSelectedOutputAsset: SharedValue; isFetching: SharedValue; isQuoteStale: SharedValue; - focusedInput: SharedValue; - inputProgress: SharedValue; - outputProgress: SharedValue; - sliderPressProgress: SharedValue; }) { const { isDarkMode } = useColorMode(); @@ -79,19 +60,30 @@ export function useSwapTextStyles({ }); const isInputZero = useDerivedValue(() => { - const isZero = - !internalSelectedInputAsset.value || - (inputValues.value.inputAmount === 0 && inputMethod.value !== 'slider') || - (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)); - return isZero; + const isInputAmountZero = inputValues.value.inputAmount === 0; + if (!internalSelectedInputAsset.value) return true; + + if (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)) return true; + + if (inputMethod.value === 'inputNativeValue' && isInputAmountZero) { + return inputValues.value.inputNativeValue === 0; + } + + return isInputAmountZero; }); const isOutputZero = useDerivedValue(() => { - const isZero = - !internalSelectedOutputAsset.value || - (inputValues.value.outputAmount === 0 && inputMethod.value !== 'slider') || - (inputMethod.value === 'slider' && equalWorklet(inputValues.value.outputAmount, 0)); - return isZero; + const isOutputAmountZero = inputValues.value.outputAmount === 0; + + if (!internalSelectedOutputAsset.value) return true; + + if (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)) return true; + + if (inputMethod.value === 'outputNativeValue' && isOutputAmountZero) { + return inputValues.value.outputNativeValue === 0; + } + + return isOutputAmountZero; }); const inputAssetColor = useDerivedValue(() => { @@ -170,81 +162,10 @@ export function useSwapTextStyles({ }; }); - // TODO: Create a reusable InputCaret component - const inputCaretStyle = useAnimatedStyle(() => { - const shouldShow = - configProgress.value === NavigationSteps.INPUT_ELEMENT_FOCUSED && - focusedInput.value === 'inputAmount' && - inputProgress.value === 0 && - outputProgress.value === 0 && - (inputMethod.value !== 'slider' || - (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)) || - (sliderPressProgress.value === SLIDER_COLLAPSED_HEIGHT / SLIDER_HEIGHT && isQuoteStale.value === 0)); - - const opacity = shouldShow - ? withRepeat( - withSequence( - withTiming(1, { duration: 0 }), - withTiming(1, { duration: 400, easing: Easing.bezier(0.87, 0, 0.13, 1) }), - withTiming(0, caretConfig), - withTiming(1, caretConfig) - ), - -1, - true - ) - : withTiming(0, caretConfig); - - const isZero = - (inputMethod.value !== 'slider' && inputValues.value.inputAmount === 0) || - (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)); - - return { - display: shouldShow ? 'flex' : 'none', - opacity, - position: isZero ? 'absolute' : 'relative', - }; - }); - - const outputCaretStyle = useAnimatedStyle(() => { - const shouldShow = - configProgress.value === NavigationSteps.INPUT_ELEMENT_FOCUSED && - focusedInput.value === 'outputAmount' && - inputProgress.value === 0 && - outputProgress.value === 0 && - (inputMethod.value !== 'slider' || - (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)) || - (sliderPressProgress.value === SLIDER_COLLAPSED_HEIGHT / SLIDER_HEIGHT && isQuoteStale.value === 0)); - - const opacity = shouldShow - ? withRepeat( - withSequence( - withTiming(1, { duration: 0 }), - withTiming(1, { duration: 400, easing: Easing.bezier(0.87, 0, 0.13, 1) }), - withTiming(0, caretConfig), - withTiming(1, caretConfig) - ), - -1, - true - ) - : withTiming(0, caretConfig); - - const isZero = - (inputMethod.value !== 'slider' && inputValues.value.outputAmount === 0) || - (inputMethod.value === 'slider' && equalWorklet(inputValues.value.inputAmount, 0)); - - return { - display: shouldShow ? 'flex' : 'none', - opacity, - position: isZero ? 'absolute' : 'relative', - }; - }); - return { inputAmountTextStyle, - inputCaretStyle, inputNativeValueStyle, outputAmountTextStyle, - outputCaretStyle, outputNativeValueStyle, }; } diff --git a/src/__swaps__/screens/Swap/providers/swap-provider.tsx b/src/__swaps__/screens/Swap/providers/swap-provider.tsx index 2a754eea029..642a65a42d8 100644 --- a/src/__swaps__/screens/Swap/providers/swap-provider.tsx +++ b/src/__swaps__/screens/Swap/providers/swap-provider.tsx @@ -431,17 +431,12 @@ export const SwapProvider = ({ children }: SwapProviderProps) => { }); const SwapTextStyles = useSwapTextStyles({ - configProgress, - focusedInput, inputMethod: SwapInputController.inputMethod, - inputProgress, inputValues: SwapInputController.inputValues, internalSelectedInputAsset, internalSelectedOutputAsset, isFetching, isQuoteStale, - outputProgress, - sliderPressProgress, }); const SwapNavigation = useSwapNavigation({ diff --git a/src/__swaps__/types/swap.ts b/src/__swaps__/types/swap.ts index 3bf0134c6d3..6a513b68024 100644 --- a/src/__swaps__/types/swap.ts +++ b/src/__swaps__/types/swap.ts @@ -1,5 +1,4 @@ -import { ExtendedAnimatedAssetWithColors, UniqueId } from './assets'; -import { SearchAsset } from './search'; +import { ExtendedAnimatedAssetWithColors } from './assets'; export type inputKeys = 'inputAmount' | 'inputNativeValue' | 'outputAmount' | 'outputNativeValue'; export type inputMethods = inputKeys | 'slider'; diff --git a/src/__swaps__/utils/__tests__/numbers.test.ts b/src/__swaps__/utils/__tests__/numbers.test.ts index 609ebc1186b..faf3be13c6b 100644 --- a/src/__swaps__/utils/__tests__/numbers.test.ts +++ b/src/__swaps__/utils/__tests__/numbers.test.ts @@ -13,7 +13,7 @@ const testCases = [ { value: 1234.56, currency: supportedCurrencies.NZD, expected: 'NZ$1,234.56' }, { value: 1234.56, currency: supportedCurrencies.GBP, expected: '£1,234.56' }, { value: 1234.56, currency: supportedCurrencies.CNY, expected: '¥1,234.56' }, - { value: 1234.56, currency: supportedCurrencies.JPY, expected: '¥1,234.56' }, + { value: 1234.56, currency: supportedCurrencies.JPY, expected: '¥1,235' }, { value: 1234.56, currency: supportedCurrencies.INR, expected: '₹1,234.56' }, { value: 1234.56, currency: supportedCurrencies.TRY, expected: '₺1,234.56' }, { value: 1234.56, currency: supportedCurrencies.ZAR, expected: 'R1,234.56' }, diff --git a/src/__swaps__/utils/numbers.ts b/src/__swaps__/utils/numbers.ts index 38969306888..c6c3e11a115 100644 --- a/src/__swaps__/utils/numbers.ts +++ b/src/__swaps__/utils/numbers.ts @@ -314,7 +314,8 @@ export const convertBipsToPercentage = (value: BigNumberish, decimals = 2): stri export const convertAmountToNativeDisplayWorklet = ( value: number | string, nativeCurrency: keyof nativeCurrencyType, - useThreshold = false + useThreshold = false, + ignoreAlignment = false ) => { 'worklet'; @@ -338,7 +339,7 @@ export const convertAmountToNativeDisplayWorklet = ( maximumFractionDigits: decimals, }); - const nativeDisplay = `${thresholdReached ? '<' : ''}${alignment === 'left' ? symbol : ''}${nativeValue}${alignment === 'right' ? symbol : ''}`; + const nativeDisplay = `${thresholdReached ? '<' : ''}${alignment === 'left' || ignoreAlignment ? symbol : ''}${nativeValue}${!ignoreAlignment && alignment === 'right' ? symbol : ''}`; return nativeDisplay; }; diff --git a/src/__swaps__/utils/swaps.ts b/src/__swaps__/utils/swaps.ts index 6b70afdf030..fc81b10cb35 100644 --- a/src/__swaps__/utils/swaps.ts +++ b/src/__swaps__/utils/swaps.ts @@ -17,7 +17,7 @@ import { TokenColors } from '@/graphql/__generated__/metadata'; import * as i18n from '@/languages'; import { RainbowConfig } from '@/model/remoteConfig'; import store from '@/redux/store'; -import { ETH_ADDRESS } from '@/references'; +import { ETH_ADDRESS, supportedNativeCurrencies } from '@/references'; import { userAssetsStore } from '@/state/assets/userAssets'; import { colors } from '@/styles'; import { BigNumberish } from '@ethersproject/bignumber'; @@ -197,6 +197,8 @@ export const findNiceIncrement = (availableBalance: string | number | undefined) // /---- 🔵 Worklet utils 🔵 ----/ // // +type nativeCurrencyType = typeof supportedNativeCurrencies; + export function addCommasToNumber(number: string | number, fallbackValue: T = 0 as T): T | string { 'worklet'; if (isNaN(Number(number))) { @@ -217,14 +219,25 @@ export function addCommasToNumber(number: string | n } } +export const addSymbolToNativeDisplayWorklet = (value: number | string, nativeCurrency: keyof nativeCurrencyType): string => { + 'worklet'; + + const nativeSelected = supportedNativeCurrencies?.[nativeCurrency]; + const { symbol } = nativeSelected; + + const nativeValueWithCommas = addCommasToNumber(value, '0'); + + return `${symbol}${nativeValueWithCommas}`; +}; + export function clamp(value: number, lowerBound: number, upperBound: number) { 'worklet'; return Math.min(Math.max(lowerBound, value), upperBound); } -export function stripCommas(value: string) { +export function stripNonDecimalNumbers(value: string) { 'worklet'; - return value.replace(/,/g, ''); + return value.replace(/[^0-9.]/g, ''); } export function trimTrailingZeros(value: string) { @@ -628,7 +641,6 @@ export const buildQuoteParams = ({ fromAddress: currentAddress, sellTokenAddress: inputAsset.isNativeAsset ? ETH_ADDRESS_AGGREGATOR : inputAsset.address, buyTokenAddress: outputAsset.isNativeAsset ? ETH_ADDRESS_AGGREGATOR : outputAsset.address, - // TODO: Handle native input cases below sellAmount: lastTypedInput === 'inputAmount' || lastTypedInput === 'inputNativeValue' ? convertAmountToRawAmount(inputAmount.toString(), inputAsset.decimals) diff --git a/src/components/DappBrowser/Homepage.tsx b/src/components/DappBrowser/Homepage.tsx index 4053671b59c..76ca66fb3bf 100644 --- a/src/components/DappBrowser/Homepage.tsx +++ b/src/components/DappBrowser/Homepage.tsx @@ -1,6 +1,6 @@ import { BlurView } from '@react-native-community/blur'; import React, { memo, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react'; -import { ScrollView, StyleSheet, View } from 'react-native'; +import { PixelRatio, ScrollView, StyleSheet, View } from 'react-native'; import LinearGradient from 'react-native-linear-gradient'; import { runOnJS, useAnimatedReaction } from 'react-native-reanimated'; import { ButtonPressAnimation } from '@/components/animations'; @@ -499,6 +499,17 @@ const Card = memo(function Card({ ); }); +const getImageForDevicePixelRatio = ({ imageUrl, imageVariants }: FeaturedResult) => { + if (!imageVariants) return imageUrl; + + const pixelRatio = PixelRatio.get(); + const { x1, x2, x3 } = imageVariants; + + if (pixelRatio < 1.5) return x1?.url || imageUrl; + if (pixelRatio < 3) return x2?.url || x1?.url || imageUrl; + return x3?.url || x2?.url || x1?.url || imageUrl; +}; + export const DappBrowserFeaturedResultsCard = memo(function Card({ handlePress, featuredResult, @@ -508,6 +519,8 @@ export const DappBrowserFeaturedResultsCard = memo(function Card({ }) { const { isDarkMode } = useColorMode(); + const imageUrl = getImageForDevicePixelRatio(featuredResult); + return ( - + {IS_IOS && ( { : null; if (!appSession) return null; + return { address: appSession?.address || '', chainId: appSession.chainId, }; - // return null; }; const checkRateLimitFn = async (host: string) => { @@ -344,9 +343,9 @@ export const handleProviderRequestApp = ({ messenger, data, meta }: { messenger: checkRateLimit, onSwitchEthereumChainNotSupported, onSwitchEthereumChainSupported, - getProvider: chainId => getProvider({ chainId: chainId as number }) as unknown as Provider, + getProvider, getActiveSession, - getChain: chainId => defaultChains[chainId] as Chain, + getChainNativeCurrency: chainId => chainsNativeAsset[chainId], }); // @ts-ignore diff --git a/src/components/fields/CheckboxField.tsx b/src/components/fields/CheckboxField.tsx index 4b79dbfc815..3f9d5fb1148 100644 --- a/src/components/fields/CheckboxField.tsx +++ b/src/components/fields/CheckboxField.tsx @@ -48,7 +48,7 @@ export default function CheckboxField({ - + {label} diff --git a/src/components/send/SendHeader.js b/src/components/send/SendHeader.js index f93e6b7fdbc..fe4ef3c7047 100644 --- a/src/components/send/SendHeader.js +++ b/src/components/send/SendHeader.js @@ -117,17 +117,15 @@ export default function SendHeader({ const isPreExistingContact = (contact?.nickname?.length || 0) > 0; const name = - removeFirstEmojiFromString(userWallet?.label || contact?.nickname || nickname) || userWallet?.ens || contact?.ens || recipient; + removeFirstEmojiFromString(contact?.nickname || userWallet?.label || nickname) || userWallet?.ens || contact?.ens || recipient; const handleNavigateToContact = useCallback(() => { - let nickname = profilesEnabled ? (!isHexString(recipient) ? recipient : null) : recipient; let color = ''; + const nickname = !isHexString(name) ? name : ''; if (!profilesEnabled) { color = contact?.color; if (color !== 0 && !color) { - const emoji = profileUtils.addressHashedEmoji(hexAddress); color = profileUtils.addressHashedColorIndex(hexAddress) || 0; - nickname = isHexString(recipient) ? emoji : `${emoji} ${recipient}`; } } @@ -142,7 +140,7 @@ export default function SendHeader({ onRefocusInput, type: 'contact_profile', }); - }, [contact, hexAddress, navigate, onRefocusInput, profilesEnabled, recipient]); + }, [contact, hexAddress, name, navigate, onRefocusInput, profilesEnabled, recipient]); const handleOpenContactActionSheet = useCallback(async () => { return showActionSheetWithOptions( @@ -162,7 +160,7 @@ export default function SendHeader({ address: hexAddress, nickname: name, onDelete: () => { - onChangeAddressInput(contact?.ens); + onChangeAddressInput(contact?.ens ? contact?.ens : contact?.address); }, removeContact: removeContact, }); @@ -175,7 +173,17 @@ export default function SendHeader({ } } ); - }, [contact?.ens, handleNavigateToContact, hexAddress, onRefocusInput, removeContact, setClipboard, name, onChangeAddressInput]); + }, [ + hexAddress, + name, + removeContact, + onChangeAddressInput, + contact?.ens, + contact?.address, + handleNavigateToContact, + onRefocusInput, + setClipboard, + ]); const onChange = useCallback( text => { diff --git a/src/references/supportedCurrencies.ts b/src/references/supportedCurrencies.ts index 9c356d87fd4..ef1588a377a 100644 --- a/src/references/supportedCurrencies.ts +++ b/src/references/supportedCurrencies.ts @@ -98,8 +98,8 @@ export const supportedCurrencies = { emoji: '🇰🇷', emojiName: 'south_korea', label: i18n.t(i18n.l.settings.currency.KRW), - mask: '[099999999999]{.}[00]', - placeholder: '0.00', + mask: '[099999999999]', + placeholder: '0', userAssetsSmallThreshold: 100, smallThreshold: 1000, symbol: '₩', @@ -139,12 +139,12 @@ export const supportedCurrencies = { alignment: 'left', assetLimit: 1, currency: 'JPY', - decimals: 2, + decimals: 0, emoji: '🇯🇵', emojiName: 'japan', label: i18n.t(i18n.l.settings.currency.JPY), - mask: '[099999999999]{.}[00]', - placeholder: '0.00', + mask: '[099999999999]', + placeholder: '0', userAssetsSmallThreshold: 10, smallThreshold: 100, symbol: '¥', diff --git a/src/resources/defi/types.ts b/src/resources/defi/types.ts index d2a50bc57dd..eac4fb62ea0 100644 --- a/src/resources/defi/types.ts +++ b/src/resources/defi/types.ts @@ -40,6 +40,7 @@ export type PositionsTotals = { export type Claimable = { asset: PositionAsset; quantity: string; + omit_from_total?: boolean; }; export type Deposit = { apr: string; @@ -47,6 +48,7 @@ export type Deposit = { asset: PositionAsset; quantity: string; total_asset: string; // what does this mean? + omit_from_total?: boolean; underlying: { asset: PositionAsset; quantity: string }[]; }; export type Borrow = { @@ -55,6 +57,7 @@ export type Borrow = { asset: PositionAsset; quantity: string; total_asset: string; // what does this mean? + omit_from_total?: boolean; underlying: { asset: PositionAsset; quantity: string }[]; }; diff --git a/src/resources/defi/utils.ts b/src/resources/defi/utils.ts index 436d7a20f6e..3adc0a45c2e 100644 --- a/src/resources/defi/utils.ts +++ b/src/resources/defi/utils.ts @@ -3,10 +3,7 @@ import { AddysPositionsResponse, Borrow, Claimable, - Deposit, - NativeDisplay, Position, - PositionAsset, PositionsTotals, RainbowBorrow, RainbowClaimable, @@ -21,66 +18,58 @@ import { chainsIdByName } from '@/chains'; export const parsePosition = (position: Position, currency: NativeCurrencyKey): RainbowPosition => { let totalDeposits = '0'; - const parsedDeposits = position.deposits?.map((deposit: Deposit): RainbowDeposit => { - deposit.underlying = deposit.underlying?.map( - (underlying: { - asset: PositionAsset; - quantity: string; - }): { - asset: PositionAsset; - quantity: string; - native: NativeDisplay; - } => { + const parsedDeposits = position.deposits?.map((deposit): RainbowDeposit => { + return { + ...deposit, + underlying: deposit.underlying?.map(underlying => { const nativeDisplay = convertRawAmountToNativeDisplay( underlying.quantity, underlying.asset.decimals, underlying.asset.price?.value!, currency ); - totalDeposits = add(totalDeposits, nativeDisplay.amount); + if (!deposit.omit_from_total) { + totalDeposits = add(totalDeposits, nativeDisplay.amount); + } return { ...underlying, native: nativeDisplay, }; - } - ); - return deposit as RainbowDeposit; + }), + }; }); let totalBorrows = '0'; const parsedBorrows = position.borrows?.map((borrow: Borrow): RainbowBorrow => { - borrow.underlying = borrow.underlying.map( - (underlying: { - asset: PositionAsset; - quantity: string; - }): { - asset: PositionAsset; - quantity: string; - native: NativeDisplay; - } => { + return { + ...borrow, + underlying: borrow.underlying.map(underlying => { const nativeDisplay = convertRawAmountToNativeDisplay( underlying.quantity, underlying.asset.decimals, underlying.asset.price?.value!, currency ); - totalBorrows = add(totalBorrows, nativeDisplay.amount); + if (!borrow.omit_from_total) { + totalBorrows = add(totalBorrows, nativeDisplay.amount); + } return { ...underlying, native: nativeDisplay, }; - } - ); - return borrow as RainbowBorrow; + }), + }; }); let totalClaimables = '0'; const parsedClaimables = position.claimables?.map((claim: Claimable): RainbowClaimable => { const nativeDisplay = convertRawAmountToNativeDisplay(claim.quantity, claim.asset.decimals, claim.asset.price?.value!, currency); - totalClaimables = add(totalClaimables, nativeDisplay.amount); + if (!claim.omit_from_total) { + totalClaimables = add(totalClaimables, nativeDisplay.amount); + } return { asset: claim.asset, quantity: claim.quantity, diff --git a/src/screens/SendConfirmationSheet.tsx b/src/screens/SendConfirmationSheet.tsx index 411434521cc..579946fb0b7 100644 --- a/src/screens/SendConfirmationSheet.tsx +++ b/src/screens/SendConfirmationSheet.tsx @@ -420,7 +420,7 @@ export const SendConfirmationSheet = () => { return existingAcct; }, [toAddress, userAccounts, watchedAccounts]); - let avatarName = removeFirstEmojiFromString(existingAccount?.label || contact?.nickname); + let avatarName = removeFirstEmojiFromString(contact?.nickname || existingAccount?.label); if (!avatarName) { if (isValidDomainFormat(to)) { diff --git a/src/screens/SendSheet.js b/src/screens/SendSheet.js index 68154d00611..f44a40370dd 100644 --- a/src/screens/SendSheet.js +++ b/src/screens/SendSheet.js @@ -588,7 +588,7 @@ export default function SendSheet(props) { })(); } }, - [amountDetails.assetAmount, goBack, isENS, isHardwareWallet, navigate, onSubmit, recipient, selected?.name, selected?.network] + [amountDetails, goBack, isENS, isHardwareWallet, navigate, onSubmit, recipient, selected?.name, selected?.network] ); const { buttonDisabled, buttonLabel } = useMemo(() => { @@ -713,8 +713,8 @@ export default function SendSheet(props) { const isValid = checkIsValidAddressOrDomainFormat(text); if (!isValid) { setIsValidAddress(); + setToAddress(); } - setToAddress(); setCurrentInput(text); setRecipient(text); setNickname(text); @@ -764,7 +764,6 @@ export default function SendSheet(props) { if ( !!accountAddress && - amountDetails.assetAmount !== '' && Object.entries(selected).length && assetChainId === currentChainId && currentProviderChainId === currentChainId && @@ -813,6 +812,12 @@ export default function SendSheet(props) { const isEmptyWallet = !sortedAssets?.length && !sendableUniqueTokens?.length; + const filteredUserAccountsFromContacts = useMemo(() => { + return userAccounts.filter( + account => !filteredContacts.some(contact => contact.address.toLowerCase() === account.address.toLowerCase()) + ); + }, [userAccounts, filteredContacts]); + return ( @@ -832,7 +837,7 @@ export default function SendSheet(props) { recipientFieldRef={recipientFieldRef} removeContact={onRemoveContact} showAssetList={showAssetList} - userAccounts={userAccounts} + userAccounts={filteredUserAccountsFromContacts} watchedAccounts={watchedAccounts} /> {showEmptyState && ( @@ -848,7 +853,7 @@ export default function SendSheet(props) { setNickname(nickname); }} removeContact={onRemoveContact} - userAccounts={userAccounts} + userAccounts={filteredUserAccountsFromContacts} watchedAccounts={watchedAccounts} /> )} diff --git a/src/screens/SpeedUpAndCancelSheet.js b/src/screens/SpeedUpAndCancelSheet.js index 00e6c71699a..bbbf1766df1 100644 --- a/src/screens/SpeedUpAndCancelSheet.js +++ b/src/screens/SpeedUpAndCancelSheet.js @@ -336,7 +336,7 @@ export default function SpeedUpAndCancelSheet() { setNonce(tx.nonce); setValue(hexValue); setData(hexData); - setTo(tx.txTo); + setTo(tx.to); setGasLimit(hexGasLimit); if (!isL2) { setTxType(GasFeeTypes.eip1559); diff --git a/src/walletConnect/index.tsx b/src/walletConnect/index.tsx index e85860bcbbc..a34dcf2e1b0 100644 --- a/src/walletConnect/index.tsx +++ b/src/walletConnect/index.tsx @@ -24,7 +24,6 @@ import * as lang from '@/languages'; import store from '@/redux/store'; import { findWalletWithAccount } from '@/helpers/findWalletWithAccount'; import WalletTypes from '@/helpers/walletTypes'; -import ethereumUtils from '@/utils/ethereumUtils'; import { getRequestDisplayDetails } from '@/parsers/requests'; import { WalletconnectRequestData, REQUESTS_UPDATE_REQUESTS_TO_APPROVE, removeRequest } from '@/redux/requests'; import { saveLocalRequests } from '@/handlers/localstorage/walletconnectRequests'; @@ -868,7 +867,7 @@ export async function onAuthRequest(event: Web3WalletTypes.AuthRequest) { * encapsulate reused code. */ const loadWalletAndSignMessage = async () => { - const provider = getProvider({ chainId: ChainId.arbitrum }); + const provider = getProvider({ chainId: ChainId.mainnet }); const wallet = await loadWallet({ address, showErrorIfNotLoaded: false, provider }); if (!wallet) { diff --git a/yarn.lock b/yarn.lock index e5093d9cfa3..ae432be3ab8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -341,7 +341,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.24.7": +"@babel/helper-remap-async-to-generator@npm:^7.18.9": + version: 7.25.0 + resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.24.7" + "@babel/helper-wrap-function": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/0d17b5f7bb6a607edc9cc62fff8056dd9f341bf2f919884f97b99170d143022a5e7ae57922c4891e4fc360ad291e708d2f8cd8989f1d3cd7a17600159984f5a6 + languageName: node + linkType: hard + +"@babel/helper-remap-async-to-generator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" dependencies: @@ -451,6 +464,17 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/helper-wrap-function@npm:7.25.0" + dependencies: + "@babel/template": "npm:^7.25.0" + "@babel/traverse": "npm:^7.25.0" + "@babel/types": "npm:^7.25.0" + checksum: 10c0/d54601a98384c191cbc1ff07b03a19e288ef8d5c6bfafe270b2a303d96e7304eb296002921ed464cc1b105a547d1db146eb86b0be617924dee1ba1b379cdc216 + languageName: node + linkType: hard + "@babel/helpers@npm:^7.22.0, @babel/helpers@npm:^7.24.8": version: 7.24.8 resolution: "@babel/helpers@npm:7.24.8" @@ -4377,9 +4401,9 @@ __metadata: languageName: node linkType: hard -"@rainbow-me/provider@npm:0.0.12": - version: 0.0.12 - resolution: "@rainbow-me/provider@npm:0.0.12" +"@rainbow-me/provider@npm:0.1.1": + version: 0.1.1 + resolution: "@rainbow-me/provider@npm:0.1.1" dependencies: "@ethersproject/abstract-provider": "npm:5.7.0" "@ethersproject/bignumber": "npm:5.7.0" @@ -4387,7 +4411,7 @@ __metadata: "@metamask/eth-sig-util": "npm:7.0.1" eventemitter3: "npm:5.0.1" viem: "npm:1.21.4" - checksum: 10c0/532e06fa477996f2f56758d8c68da91bc678eaa72e200fcd4fe589498e453e908033e0858a039aed1af66db3431d7dd9dcd7283b874516c2ebaea9cace2c3291 + checksum: 10c0/dcc62cbaf3e6a999e89d794bfbc95c62b2e3debb3c9370aef0d59a52dda623b64bc15a1f6eafc7eb8e15a6a37797e13f2b49c539efeb582b3d2a3dd12e2f8c60 languageName: node linkType: hard @@ -5267,115 +5291,123 @@ __metadata: languageName: node linkType: hard -"@sentry-internal/feedback@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry-internal/feedback@npm:7.110.1" +"@sentry-internal/feedback@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry-internal/feedback@npm:7.119.0" dependencies: - "@sentry/core": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" - checksum: 10c0/5429a7dcd14986770647392558ed0d09f31d33d6771688304f90e88feff9b0af6edaa0195e60c5bdce6a8518409f6314b9d03293b661fc3e1b74ef1c154e4595 + "@sentry/core": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" + checksum: 10c0/02ef3f157312c81dd8a2b9504aebf7b4ba5a81c395d529427ee521cd85b5026e847e5f37f3cc11b52229596f7a6f20c34a97ee3d8525a4d6c28aff0c32f1e615 languageName: node linkType: hard -"@sentry-internal/replay-canvas@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry-internal/replay-canvas@npm:7.110.1" +"@sentry-internal/replay-canvas@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry-internal/replay-canvas@npm:7.119.0" dependencies: - "@sentry/core": "npm:7.110.1" - "@sentry/replay": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" - checksum: 10c0/125b8247db4631e298f3c8c6d8b486669dfa6356490cc7464a23131a5518d9d7ef314f2c1cbbbadad4f9738ba451fbf5f9457170f4bc899b8275e15ae28cb610 + "@sentry/core": "npm:7.119.0" + "@sentry/replay": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" + checksum: 10c0/a51124c6709d57b245ad9d16e446601f9fd42bebcf3a10e6ea04e1e5f91e490a9c815761ed71a6e837daad3b1d7da8be91a4f99b5f258e15c0eb906ee3411e73 languageName: node linkType: hard -"@sentry-internal/tracing@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry-internal/tracing@npm:7.110.1" +"@sentry-internal/tracing@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry-internal/tracing@npm:7.119.0" dependencies: - "@sentry/core": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" - checksum: 10c0/ee901b99b838a932f2adb1b085364c816fb0b3f61643ca368af37dd2aa9faf702ea1f3d28f7b0e2e79c57794e3260c8ce34376da0f8658b6ee844b28676ecd55 + "@sentry/core": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" + checksum: 10c0/3cf855bdb6a6dae2b12626d74c0d6c03f9db749e7da7a9871929277a17fbaa411139ef6e892fe86b2836c706850fd165628954a6de6c1f44fdca2f82bde97ff2 + languageName: node + linkType: hard + +"@sentry/babel-plugin-component-annotate@npm:2.20.1": + version: 2.20.1 + resolution: "@sentry/babel-plugin-component-annotate@npm:2.20.1" + checksum: 10c0/83d9e203902ae2601a1b8fcb528c044b42a7275996df2dc775e67804b516f1467b132014d799322871777e40b1ee7d09605c8a1572d67541c1b7556049514d0d languageName: node linkType: hard -"@sentry/browser@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/browser@npm:7.110.1" +"@sentry/browser@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/browser@npm:7.119.0" dependencies: - "@sentry-internal/feedback": "npm:7.110.1" - "@sentry-internal/replay-canvas": "npm:7.110.1" - "@sentry-internal/tracing": "npm:7.110.1" - "@sentry/core": "npm:7.110.1" - "@sentry/replay": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" - checksum: 10c0/085a2cbd2b60dbb596b68d3cf7d0059e226bc8892aa90a50680fa9a9256889a715ff234e9210738a3205ce5513e52290e440ffa4f2d2e2429471ea584d075493 + "@sentry-internal/feedback": "npm:7.119.0" + "@sentry-internal/replay-canvas": "npm:7.119.0" + "@sentry-internal/tracing": "npm:7.119.0" + "@sentry/core": "npm:7.119.0" + "@sentry/integrations": "npm:7.119.0" + "@sentry/replay": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" + checksum: 10c0/8a29d1149a02f3f1b01723b0008517dfce34315b7803cd8d7f1543d401d4aba53d5eec20d1d9b879985973cddce0b29de62fe18d8da210e24cf73fd2b12a3be9 languageName: node linkType: hard -"@sentry/cli-darwin@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli-darwin@npm:2.30.4" +"@sentry/cli-darwin@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli-darwin@npm:2.34.0" conditions: os=darwin languageName: node linkType: hard -"@sentry/cli-linux-arm64@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli-linux-arm64@npm:2.30.4" +"@sentry/cli-linux-arm64@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli-linux-arm64@npm:2.34.0" conditions: (os=linux | os=freebsd) & cpu=arm64 languageName: node linkType: hard -"@sentry/cli-linux-arm@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli-linux-arm@npm:2.30.4" +"@sentry/cli-linux-arm@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli-linux-arm@npm:2.34.0" conditions: (os=linux | os=freebsd) & cpu=arm languageName: node linkType: hard -"@sentry/cli-linux-i686@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli-linux-i686@npm:2.30.4" +"@sentry/cli-linux-i686@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli-linux-i686@npm:2.34.0" conditions: (os=linux | os=freebsd) & (cpu=x86 | cpu=ia32) languageName: node linkType: hard -"@sentry/cli-linux-x64@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli-linux-x64@npm:2.30.4" +"@sentry/cli-linux-x64@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli-linux-x64@npm:2.34.0" conditions: (os=linux | os=freebsd) & cpu=x64 languageName: node linkType: hard -"@sentry/cli-win32-i686@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli-win32-i686@npm:2.30.4" +"@sentry/cli-win32-i686@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli-win32-i686@npm:2.34.0" conditions: os=win32 & (cpu=x86 | cpu=ia32) languageName: node linkType: hard -"@sentry/cli-win32-x64@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli-win32-x64@npm:2.30.4" +"@sentry/cli-win32-x64@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli-win32-x64@npm:2.34.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@sentry/cli@npm:2.30.4": - version: 2.30.4 - resolution: "@sentry/cli@npm:2.30.4" - dependencies: - "@sentry/cli-darwin": "npm:2.30.4" - "@sentry/cli-linux-arm": "npm:2.30.4" - "@sentry/cli-linux-arm64": "npm:2.30.4" - "@sentry/cli-linux-i686": "npm:2.30.4" - "@sentry/cli-linux-x64": "npm:2.30.4" - "@sentry/cli-win32-i686": "npm:2.30.4" - "@sentry/cli-win32-x64": "npm:2.30.4" +"@sentry/cli@npm:2.34.0": + version: 2.34.0 + resolution: "@sentry/cli@npm:2.34.0" + dependencies: + "@sentry/cli-darwin": "npm:2.34.0" + "@sentry/cli-linux-arm": "npm:2.34.0" + "@sentry/cli-linux-arm64": "npm:2.34.0" + "@sentry/cli-linux-i686": "npm:2.34.0" + "@sentry/cli-linux-x64": "npm:2.34.0" + "@sentry/cli-win32-i686": "npm:2.34.0" + "@sentry/cli-win32-x64": "npm:2.34.0" https-proxy-agent: "npm:^5.0.0" node-fetch: "npm:^2.6.7" progress: "npm:^2.0.3" @@ -5398,7 +5430,7 @@ __metadata: optional: true bin: sentry-cli: bin/sentry-cli - checksum: 10c0/2be7bef39f9740f1b4e126a66733077da990297c9988a3cbff89a00596cef6e71e9d44852fe313f3c07e4e5b771eb91f930464f1779bdf8a222a6ef734bee23a + checksum: 10c0/20507fa7cfd09e12f533926cc2270abe25cdc454d8e4787b698284011cc9d42387805ed725d989ccf9bb4a27329ee6a3a994c7134f44f82a9fe93d9472ac171b languageName: node linkType: hard @@ -5415,13 +5447,13 @@ __metadata: languageName: node linkType: hard -"@sentry/core@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/core@npm:7.110.1" +"@sentry/core@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/core@npm:7.119.0" dependencies: - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" - checksum: 10c0/8eee39697a1173f233a83fa07b5099c2fdc1f345ec0ac0304ed38c7159214e6a0615fb2fe4dcd4152dbe11cf5ec14bfe3d7da19706e90b13a8bd7984256c4b2f + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" + checksum: 10c0/6f2246a9a6ea5dbec8422fccd265aaf8e20582eaf03f1199ef526a41e5939b861cf5050a07975f17c0920c86b4c8cf3416e805131c713899da49d74d529d0697 languageName: node linkType: hard @@ -5436,26 +5468,26 @@ __metadata: languageName: node linkType: hard -"@sentry/hub@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/hub@npm:7.110.1" +"@sentry/hub@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/hub@npm:7.119.0" dependencies: - "@sentry/core": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" - checksum: 10c0/f1cee31fcd6a4fc7745eed0e6c900c3f82bce532d8fe5e503ed6e270ced020b2f1cade660c45531c4e97cd5136ba4bf3cf50c1c2e436c2ad053c18685f6ed1e9 + "@sentry/core": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" + checksum: 10c0/92d5799a9d8775c4d4a54629eee11c1d63d8c8f9cd08ac2a79f63a93e89292e5b21b8812e3ebd9e33eeb5713208d4540f74250f7ad62e0097843e734ec2b8495 languageName: node linkType: hard -"@sentry/integrations@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/integrations@npm:7.110.1" +"@sentry/integrations@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/integrations@npm:7.119.0" dependencies: - "@sentry/core": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" + "@sentry/core": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" localforage: "npm:^1.8.1" - checksum: 10c0/276c163411fb7ca0354a4316855de3448a9ff3f14fac4057cd02c39f8aff54fb462b69cb1df9e155b5118d21f66ea7c14439960307c9f0d4bcb6950ac009e3b4 + checksum: 10c0/1e539f0234067587380fbedb132ad4b11f715d229f1fe1571c4c545f23e6dae867d8484d825c271599e1f22d62dc66e481a78e86e6a8653fe60ddcb11b04d93b languageName: node linkType: hard @@ -5487,18 +5519,19 @@ __metadata: languageName: node linkType: hard -"@sentry/react-native@npm:5.22.0": - version: 5.22.0 - resolution: "@sentry/react-native@npm:5.22.0" +"@sentry/react-native@npm:5.31.1": + version: 5.31.1 + resolution: "@sentry/react-native@npm:5.31.1" dependencies: - "@sentry/browser": "npm:7.110.1" - "@sentry/cli": "npm:2.30.4" - "@sentry/core": "npm:7.110.1" - "@sentry/hub": "npm:7.110.1" - "@sentry/integrations": "npm:7.110.1" - "@sentry/react": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" + "@sentry/babel-plugin-component-annotate": "npm:2.20.1" + "@sentry/browser": "npm:7.119.0" + "@sentry/cli": "npm:2.34.0" + "@sentry/core": "npm:7.119.0" + "@sentry/hub": "npm:7.119.0" + "@sentry/integrations": "npm:7.119.0" + "@sentry/react": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" peerDependencies: expo: ">=49.0.0" react: ">=17.0.0" @@ -5508,34 +5541,34 @@ __metadata: optional: true bin: sentry-expo-upload-sourcemaps: scripts/expo-upload-sourcemaps.js - checksum: 10c0/0eaafbaa4b697ffdddb7fcd298655d7c4b582bb2c4bdb5acd8a7c67d0ef48bf01ed04094cc49a2bb33ba6a017950778208486a13949d6cca7ede5e450278c0cf + checksum: 10c0/19e452181ad20f248ca96b2f24f4830e3d58abb9db6ae928ffecaefb10050f7835083c154e80b09f86cadb1e19d05afa0c33c31e1dee45fed51562e58e0a091f languageName: node linkType: hard -"@sentry/react@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/react@npm:7.110.1" +"@sentry/react@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/react@npm:7.119.0" dependencies: - "@sentry/browser": "npm:7.110.1" - "@sentry/core": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" + "@sentry/browser": "npm:7.119.0" + "@sentry/core": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" hoist-non-react-statics: "npm:^3.3.2" peerDependencies: react: 15.x || 16.x || 17.x || 18.x - checksum: 10c0/f1ef241a53e3d676f65b53810af8203b7ad8a4eb665c6f50318bcb2bfc2888eb080eac838f701ccce7195863b9c85f6eac69ce5ae0a53a9807a04d1a36076774 + checksum: 10c0/4bfc7f2c4abc5495306baac192d4ec9bb324e35c8690a64148b19f1f7b3448285df0e124e1aaaebaa6282925ac77acfe2dc4b675afb4ed7aac789d354ab2507a languageName: node linkType: hard -"@sentry/replay@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/replay@npm:7.110.1" +"@sentry/replay@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/replay@npm:7.119.0" dependencies: - "@sentry-internal/tracing": "npm:7.110.1" - "@sentry/core": "npm:7.110.1" - "@sentry/types": "npm:7.110.1" - "@sentry/utils": "npm:7.110.1" - checksum: 10c0/ffb300d229d6447ea0f2b99a21ab3d6fae6136cdef33fb9daaac417b1a6b070f385139c934a2acff68562a6f5acdcf96a6e606ddf3893b7a9d44955597343841 + "@sentry-internal/tracing": "npm:7.119.0" + "@sentry/core": "npm:7.119.0" + "@sentry/types": "npm:7.119.0" + "@sentry/utils": "npm:7.119.0" + checksum: 10c0/fa861d0b0912ac55a462899931e238d957048cddf91e7ccbaf58afc94580fea147079d777993c63212aa923d36dd253daf595cf866144a92e1c7860900cb3348 languageName: node linkType: hard @@ -5559,10 +5592,10 @@ __metadata: languageName: node linkType: hard -"@sentry/types@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/types@npm:7.110.1" - checksum: 10c0/6892ae1bed6426ef10dba075d0bd68247bac7c024a7860f3385d320759e152bd9e7bb4b3eeec2600a58d81bb30084fd01e9586da09e372fb48d615c24c86fd10 +"@sentry/types@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/types@npm:7.119.0" + checksum: 10c0/b2ca256ef1d7fb156d455908aa3e021cb2f58100355961fca454d0c5e6c1b8d1a949c479c136dbceca2b76dabcd71cd950e089c576f7e424effbe60f0c0bbaa6 languageName: node linkType: hard @@ -5576,12 +5609,12 @@ __metadata: languageName: node linkType: hard -"@sentry/utils@npm:7.110.1": - version: 7.110.1 - resolution: "@sentry/utils@npm:7.110.1" +"@sentry/utils@npm:7.119.0": + version: 7.119.0 + resolution: "@sentry/utils@npm:7.119.0" dependencies: - "@sentry/types": "npm:7.110.1" - checksum: 10c0/ab84862283881808e94e68d4abe19a38024fbe8de0bd55ddbb1238123772ce633fd507af7f636427333c6376767a85f6e665ece647c43183fdcac6a8e7ba3c77 + "@sentry/types": "npm:7.119.0" + checksum: 10c0/5fd5e5bb0a45548d65baa6c4a04481e750433daa53ce2caa0baa0db19a912b74168290043f8605ed5c10cef7db744efdca2130020d9f59dca3a89d818492daf5 languageName: node linkType: hard @@ -6235,15 +6268,6 @@ __metadata: languageName: node linkType: hard -"@types/detox@npm:18.1.0": - version: 18.1.0 - resolution: "@types/detox@npm:18.1.0" - dependencies: - detox: "npm:*" - checksum: 10c0/bcee8734aeaf5ee3460e8236d606366a8b78816b1df46b6b41767efb62fc857cdefe457ecbbd866e036e447a264091b743a35fff5a08c25b6a4aac7e454673c9 - languageName: node - linkType: hard - "@types/estree@npm:^1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" @@ -6422,11 +6446,11 @@ __metadata: linkType: hard "@types/node@npm:^18.0.0": - version: 18.19.45 - resolution: "@types/node@npm:18.19.45" + version: 18.19.50 + resolution: "@types/node@npm:18.19.50" dependencies: undici-types: "npm:~5.26.4" - checksum: 10c0/79c324176411dcfa92f76b0ffc0673aa4bd8da82d003b44633e927c9493cdc46c35f04c0873b096b23b12bab090a6bbdea21242b3bbb2ea5dc1d9bf72adaa04f + checksum: 10c0/36e6bc9eb47213ce94a868dad9504465ad89fba6af9f7954e22bb27fb17a32ac495f263d0cf4fdaee74becd7b2629609a446ec8c2b59b7a07bd587567c8a4782 languageName: node linkType: hard @@ -7860,7 +7884,7 @@ __metadata: "@nomiclabs/hardhat-ethers": "npm:2.2.3" "@nomiclabs/hardhat-waffle": "npm:2.0.6" "@notifee/react-native": "npm:7.8.2" - "@rainbow-me/provider": "npm:0.0.12" + "@rainbow-me/provider": "npm:0.1.1" "@rainbow-me/react-native-animated-number": "npm:0.0.2" "@rainbow-me/swaps": "npm:0.26.0" "@react-native-async-storage/async-storage": "npm:1.23.1" @@ -7883,7 +7907,7 @@ __metadata: "@reservoir0x/reservoir-sdk": "npm:2.3.0" "@rnx-kit/align-deps": "npm:2.2.4" "@rudderstack/rudder-sdk-react-native": "npm:1.12.1" - "@sentry/react-native": "npm:5.22.0" + "@sentry/react-native": "npm:5.31.1" "@shopify/flash-list": "npm:1.7.0" "@shopify/react-native-skia": "npm:1.3.11" "@tanstack/query-async-storage-persister": "npm:4.2.1" @@ -7895,7 +7919,6 @@ __metadata: "@types/d3-scale": "npm:4.0.2" "@types/d3-shape": "npm:3.1.6" "@types/dedent": "npm:0.7.0" - "@types/detox": "npm:18.1.0" "@types/i18n-js": "npm:3.0.3" "@types/jest": "npm:29.5.12" "@types/lodash": "npm:4.14.168" @@ -7951,7 +7974,7 @@ __metadata: delay: "npm:4.4.0" depcheck: "npm:1.4.7" deprecated-react-native-prop-types: "npm:2.2.0" - detox: "npm:20.19.3" + detox: "npm:20.26.2" dns.js: "npm:1.0.1" domain-browser: "npm:1.2.0" dotenv: "npm:8.2.0" @@ -8030,7 +8053,7 @@ __metadata: react-native-gesture-handler: "npm:2.18.1" react-native-get-random-values: "npm:1.5.0" react-native-haptic-feedback: "npm:2.2.0" - react-native-image-crop-picker: "npm:0.41.0" + react-native-image-crop-picker: "npm:0.41.2" react-native-indicators: "npm:0.17.0" react-native-ios-context-menu: "npm:1.15.3" react-native-keyboard-area: "npm:1.0.6" @@ -11816,59 +11839,16 @@ __metadata: languageName: node linkType: hard -"detox@npm:*": - version: 20.25.1 - resolution: "detox@npm:20.25.1" - dependencies: - ajv: "npm:^8.6.3" - bunyan: "npm:^1.8.12" - bunyan-debug-stream: "npm:^3.1.0" - caf: "npm:^15.0.1" - chalk: "npm:^4.0.0" - child-process-promise: "npm:^2.2.0" - execa: "npm:^5.1.1" - find-up: "npm:^5.0.0" - fs-extra: "npm:^11.0.0" - funpermaproxy: "npm:^1.1.0" - glob: "npm:^8.0.3" - ini: "npm:^1.3.4" - jest-environment-emit: "npm:^1.0.8" - json-cycle: "npm:^1.3.0" - lodash: "npm:^4.17.11" - multi-sort-stream: "npm:^1.0.3" - multipipe: "npm:^4.0.0" - node-ipc: "npm:9.2.1" - proper-lockfile: "npm:^3.0.2" - resolve-from: "npm:^5.0.0" - sanitize-filename: "npm:^1.6.1" - semver: "npm:^7.0.0" - serialize-error: "npm:^8.0.1" - shell-quote: "npm:^1.7.2" - signal-exit: "npm:^3.0.3" - stream-json: "npm:^1.7.4" - strip-ansi: "npm:^6.0.1" - telnet-client: "npm:1.2.8" - tempfile: "npm:^2.0.0" - trace-event-lib: "npm:^1.3.1" - which: "npm:^1.3.1" - ws: "npm:^7.0.0" - yargs: "npm:^17.0.0" - yargs-parser: "npm:^21.0.0" - yargs-unparser: "npm:^2.0.0" - peerDependencies: - jest: 29.x.x || 28.x.x || ^27.2.5 - peerDependenciesMeta: - jest: - optional: true - bin: - detox: local-cli/cli.js - checksum: 10c0/fc84829d0e4a2b0d7c4c325949eae0915956df9642fa2365065e0a4275e9da7d2368bd5b31543ba5750ab27461ca84a66331ddecce5504c57fec85ac300e21e4 +"detox-copilot@npm:^0.0.0": + version: 0.0.0 + resolution: "detox-copilot@npm:0.0.0" + checksum: 10c0/9e29a017aa9a029f1bf235959c63f271612c20bfb55d254d6f3f88d62dc3c56479da7f0c3937484df70dac661ebd8f55572f3c148bedcb7ade464e02e6089f47 languageName: node linkType: hard -"detox@npm:20.19.3": - version: 20.19.3 - resolution: "detox@npm:20.19.3" +"detox@npm:20.26.2": + version: 20.26.2 + resolution: "detox@npm:20.26.2" dependencies: ajv: "npm:^8.6.3" bunyan: "npm:^1.8.12" @@ -11876,13 +11856,14 @@ __metadata: caf: "npm:^15.0.1" chalk: "npm:^4.0.0" child-process-promise: "npm:^2.2.0" + detox-copilot: "npm:^0.0.0" execa: "npm:^5.1.1" find-up: "npm:^5.0.0" fs-extra: "npm:^11.0.0" funpermaproxy: "npm:^1.1.0" glob: "npm:^8.0.3" ini: "npm:^1.3.4" - jest-environment-emit: "npm:^1.0.5" + jest-environment-emit: "npm:^1.0.8" json-cycle: "npm:^1.3.0" lodash: "npm:^4.17.11" multi-sort-stream: "npm:^1.0.3" @@ -11912,7 +11893,7 @@ __metadata: optional: true bin: detox: local-cli/cli.js - checksum: 10c0/69cd50f7efc62232a428b0955d2d79672e0cb49e66588507c01b4d63b0c4623a9911051f19aaf303321d15a45ac1a003f33650df473ca673e54ff0a13fbe3054 + checksum: 10c0/7601ed9678447c4d11e8c5ca5791a59d8a099bf53190aa3e224dd4ffe0b68af22ddefcbea618448ddf866a36c4ab9c2067225e7443cb2e95437ffdd2fc7738ba languageName: node linkType: hard @@ -12341,7 +12322,16 @@ __metadata: languageName: node linkType: hard -"envinfo@npm:^7.10.0, envinfo@npm:^7.7.3": +"envinfo@npm:^7.10.0": + version: 7.14.0 + resolution: "envinfo@npm:7.14.0" + bin: + envinfo: dist/cli.js + checksum: 10c0/059a031eee101e056bd9cc5cbfe25c2fab433fe1780e86cf0a82d24a000c6931e327da6a8ffb3dce528a24f83f256e7efc0b36813113eff8fdc6839018efe327 + languageName: node + linkType: hard + +"envinfo@npm:^7.7.3": version: 7.13.0 resolution: "envinfo@npm:7.13.0" bin: @@ -13470,13 +13460,13 @@ __metadata: linkType: hard "fast-xml-parser@npm:^4.0.12, fast-xml-parser@npm:^4.2.4": - version: 4.4.1 - resolution: "fast-xml-parser@npm:4.4.1" + version: 4.5.0 + resolution: "fast-xml-parser@npm:4.5.0" dependencies: strnum: "npm:^1.0.5" bin: fxparser: src/cli/cli.js - checksum: 10c0/7f334841fe41bfb0bf5d920904ccad09cefc4b5e61eaf4c225bf1e1bb69ee77ef2147d8942f783ee8249e154d1ca8a858e10bda78a5d78b8bed3f48dcee9bf33 + checksum: 10c0/71d206c9e137f5c26af88d27dde0108068a5d074401901d643c500c36e95dfd828333a98bda020846c41f5b9b364e2b0e9be5b19b0bdcab5cf31559c07b80a95 languageName: node linkType: hard @@ -16158,7 +16148,7 @@ __metadata: languageName: node linkType: hard -"jest-environment-emit@npm:^1.0.5, jest-environment-emit@npm:^1.0.8": +"jest-environment-emit@npm:^1.0.8": version: 1.0.8 resolution: "jest-environment-emit@npm:1.0.8" dependencies: @@ -21039,12 +21029,12 @@ __metadata: languageName: node linkType: hard -"react-native-image-crop-picker@npm:0.41.0": - version: 0.41.0 - resolution: "react-native-image-crop-picker@npm:0.41.0" +"react-native-image-crop-picker@npm:0.41.2": + version: 0.41.2 + resolution: "react-native-image-crop-picker@npm:0.41.2" peerDependencies: react-native: ">=0.40.0" - checksum: 10c0/04f8186ba3f721a9a7dccc0d3e1931bb6bb7c3c52ae5ff18f66a72aea9b5996b59174b0982378bae254966f1384a0ebb65bd23a11930f22da0c5adb86266f1fe + checksum: 10c0/8df9baa7107ce5e6f1f9f84e6a0766e3019c6df3bbc95eb88a4d261065959df81c81dcb566a097ca780f8d745e489bed7e390d4fdfedde207b102080bdce81ad languageName: node linkType: hard