From 6de8c40b002ba3341744f3bff019c60c24ca926f Mon Sep 17 00:00:00 2001 From: BrodyHughes <41711440+BrodyHughes@users.noreply.github.com> Date: Mon, 3 Jun 2024 12:40:26 -0500 Subject: [PATCH 1/6] parent 47cbd3c9581d1af09e36128351fe7628add08b1d author BrodyHughes <41711440+BrodyHughes@users.noreply.github.com> 1717436426 -0500 committer BrodyHughes <41711440+BrodyHughes@users.noreply.github.com> 1718422215 -0500 . . . lots of fixes to hardhat assets fix user assets and list out more tests start mocking add quote response mocks and fix testID tap remove global fetch okie remove custom type and consume directly QuoteParams type finish basic flow . . . comments . . clean up oop clean rm unused package bumps prettier -_- . . . :/ . . . . . . --- e2e/1_importAndWatchWalletsFlow.spec.ts | 7 +- e2e/3_homeScreen.spec.ts | 16 +- e2e/4_discoverSheetFlow.spec.ts | 3 +- e2e/5_sendSheetFlowContacts.spec.ts | 3 +- e2e/7_maliciousDappConnection.spec.ts | 2 +- e2e/8_swapSheetFlow1.spec.ts | 135 ++++ e2e/Disabled/deeplinks.disabled.ts | 155 ----- ...hardhatTransactionFlowSendAndWC.disable.js | 397 ----------- .../hardhatTransactionFlowSwaps.disabled.js | 419 ------------ e2e/Disabled/hiddenTokensFlow.disabled.js | 71 -- e2e/Disabled/registerENSFlow.disabled.js | 642 ------------------ e2e/Disabled/sendSheetFlow.disabled.ts | 159 ----- e2e/Disabled/swapSheetFlow1.disabled.js | 341 ---------- e2e/Disabled/swapSheetFlow2.disabled.js | 479 ------------- e2e/Disabled/walletAvatarOptions.disabled.js | 163 ----- e2e/helpers.ts | 3 +- e2e/init.js | 2 + e2e/jest.e2e.config.js | 25 +- jest.config.js | 35 +- package.json | 3 +- .../screens/Swap/components/SearchInput.tsx | 1 + .../Swap/components/SwapActionButton.tsx | 1 + .../Swap/components/UserAssetsSync.tsx | 12 +- .../screens/Swap/hooks/useAssetsToSell.ts | 8 +- .../Swap/hooks/useSwapInputsController.ts | 2 + src/__swaps__/types/chains.ts | 4 + src/components/activity-list/ActivityList.js | 1 + .../FastComponents/FastBalanceCoinRow.tsx | 2 +- src/references/chain-assets.json | 4 +- src/references/index.ts | 29 +- .../TransactionDetails.tsx | 2 +- tsconfig.jest.json | 6 - tsconfig.spec.json | 15 + 33 files changed, 234 insertions(+), 2913 deletions(-) create mode 100644 e2e/8_swapSheetFlow1.spec.ts delete mode 100644 e2e/Disabled/deeplinks.disabled.ts delete mode 100644 e2e/Disabled/hardhatTransactionFlowSendAndWC.disable.js delete mode 100644 e2e/Disabled/hardhatTransactionFlowSwaps.disabled.js delete mode 100644 e2e/Disabled/hiddenTokensFlow.disabled.js delete mode 100644 e2e/Disabled/registerENSFlow.disabled.js delete mode 100644 e2e/Disabled/sendSheetFlow.disabled.ts delete mode 100644 e2e/Disabled/swapSheetFlow1.disabled.js delete mode 100644 e2e/Disabled/swapSheetFlow2.disabled.js delete mode 100644 e2e/Disabled/walletAvatarOptions.disabled.js delete mode 100644 tsconfig.jest.json create mode 100644 tsconfig.spec.json diff --git a/e2e/1_importAndWatchWalletsFlow.spec.ts b/e2e/1_importAndWatchWalletsFlow.spec.ts index 311e6ce5987..431ea1452ad 100644 --- a/e2e/1_importAndWatchWalletsFlow.spec.ts +++ b/e2e/1_importAndWatchWalletsFlow.spec.ts @@ -12,6 +12,9 @@ import { } from './helpers'; import { WALLET_VARS } from './testVariables'; +// eslint-disable-next-line @typescript-eslint/no-var-requires +require('dotenv').config(); + const android = device.getPlatform() === 'android'; describe('Import from private key flow', () => { @@ -36,7 +39,7 @@ describe('Import from private key flow', () => { }); it('with 0x - Should show the "Add wallet modal" after tapping import with a valid private key"', async () => { - await typeText('import-sheet-input', process.env.DEV_PKEY); + await typeText('import-sheet-input', WALLET_VARS.PRIVATE_KEY_WALLET.SECRET); await checkIfElementHasString('import-sheet-button-label', 'Continue'); await waitAndTap('import-sheet-button'); await checkIfVisible('wallet-info-modal'); @@ -66,7 +69,7 @@ describe('Import from private key flow', () => { }); it('without 0x - Should show the "Add wallet modal" after tapping import with a valid private key"', async () => { - await typeText('import-sheet-input', WALLET_VARS.SEED_WALLET.PK.substring(2)); + await typeText('import-sheet-input', WALLET_VARS.EMPTY_WALLET.PK.substring(2)); await checkIfElementHasString('import-sheet-button-label', 'Continue'); await waitAndTap('import-sheet-button'); await checkIfVisible('wallet-info-modal'); diff --git a/e2e/3_homeScreen.spec.ts b/e2e/3_homeScreen.spec.ts index 145ce3798a3..94fea2546f0 100644 --- a/e2e/3_homeScreen.spec.ts +++ b/e2e/3_homeScreen.spec.ts @@ -5,8 +5,9 @@ import { checkIfExists, checkIfExistsByText, swipe, - waitAndTap, afterAllcleanApp, + tap, + delayTime, } from './helpers'; const RAINBOW_TEST_WALLET = 'rainbowtestwallet.eth'; @@ -41,19 +42,20 @@ describe('Home Screen', () => { }); it('tapping "Swap" opens the swap screen', async () => { - await waitAndTap('swap-button'); - await checkIfExists('exchange-modal-input-selection-button'); - await swipe('exchange-modal-notch', 'down', 'slow'); + await tap('swap-button'); + await delayTime('long'); + await checkIfExists('swap-screen'); + await swipe('swap-screen', 'down', 'fast'); }); it('tapping "Send" opens the send screen', async () => { - await waitAndTap('send-button'); + await tap('send-button'); await checkIfVisible('send-asset-form-field'); - await swipe('send-asset-form-field', 'down'); + await swipe('send-asset-form-field', 'down', 'fast'); }); it('tapping "Copy" shows copy address toast', async () => { - await waitAndTap('receive-button'); + await tap('receive-button'); await checkIfVisible('address-copied-toast'); }); }); diff --git a/e2e/4_discoverSheetFlow.spec.ts b/e2e/4_discoverSheetFlow.spec.ts index de0ad61f37e..b77fee00377 100644 --- a/e2e/4_discoverSheetFlow.spec.ts +++ b/e2e/4_discoverSheetFlow.spec.ts @@ -12,6 +12,7 @@ import { importWalletFlow, afterAllcleanApp, } from './helpers'; +import { WALLET_VARS } from './testVariables'; const ios = device.getPlatform() === 'ios'; @@ -23,7 +24,7 @@ describe('Discover Screen Flow', () => { await afterAllcleanApp({ hardhat: false }); }); it('Should import wallet and go to wallet screen', async () => { - await importWalletFlow(); + await importWalletFlow(WALLET_VARS.EMPTY_WALLET.PK); }); it('Should navigate to Discover screen after swiping left', async () => { diff --git a/e2e/5_sendSheetFlowContacts.spec.ts b/e2e/5_sendSheetFlowContacts.spec.ts index 0e64c4ae2ba..66971f77d01 100644 --- a/e2e/5_sendSheetFlowContacts.spec.ts +++ b/e2e/5_sendSheetFlowContacts.spec.ts @@ -13,6 +13,7 @@ import { delayTime, afterAllcleanApp, } from './helpers'; +import { WALLET_VARS } from './testVariables'; const android = device.getPlatform() === 'android'; @@ -25,7 +26,7 @@ describe('Send Sheet Interaction Flow Contacts', () => { }); it('Import a wallet and go to welcome', async () => { - await importWalletFlow(); + await importWalletFlow(WALLET_VARS.EMPTY_WALLET.PK); }); it('Should send ETH to test wallet"', async () => { diff --git a/e2e/7_maliciousDappConnection.spec.ts b/e2e/7_maliciousDappConnection.spec.ts index 0b6f49fd0bf..e32a809917b 100644 --- a/e2e/7_maliciousDappConnection.spec.ts +++ b/e2e/7_maliciousDappConnection.spec.ts @@ -23,7 +23,7 @@ describe('Check malicious dapp warning', () => { }); it('Should be able to watch a wallet and load the wallet screen', async () => { - await importWalletFlow(WALLET_VARS.SEED_WALLET.PK); + await importWalletFlow(WALLET_VARS.EMPTY_WALLET.PK); }); it('Should be able to navigate to the dapp browser', async () => { diff --git a/e2e/8_swapSheetFlow1.spec.ts b/e2e/8_swapSheetFlow1.spec.ts new file mode 100644 index 00000000000..9ebe24ab26a --- /dev/null +++ b/e2e/8_swapSheetFlow1.spec.ts @@ -0,0 +1,135 @@ +/* + * // TODO: + * - fix getNonceAndPerformSwap mocking + * - fix swap input auto fill validation (cannot import worklet `findNiceIncrement`) + * + * // Other tests to consider: + * - Flip assets + * - exchange button onPress + * - disable button states once https://github.com/rainbow-me/rainbow/pull/5785 gets merged + * - swap execution + * - token search (both from userAssets and output token list) + * - custom gas panel + * - flashbots + * - slippage + * - explainer sheets + * - switching wallets inside of swap screen + */ + +import { + importWalletFlow, + sendETHtoTestWallet, + checkIfVisible, + beforeAllcleanApp, + afterAllcleanApp, + fetchElementAttributes, + tap, + delayTime, + tapByText, +} from './helpers'; + +import { expect } from '@jest/globals'; +import { WALLET_VARS } from './testVariables'; + +describe('Swap Sheet Interaction Flow', () => { + beforeAll(async () => { + await beforeAllcleanApp({ hardhat: true }); + }); + afterAll(async () => { + await afterAllcleanApp({ hardhat: true }); + }); + + it('Import a wallet and go to welcome', async () => { + await importWalletFlow(WALLET_VARS.EMPTY_WALLET.PK); + }); + + it('Should send ETH to test wallet', async () => { + // send 20 eth + await sendETHtoTestWallet(); + }); + + it('Should show Hardhat Toast after pressing Connect To Hardhat', async () => { + await tap('dev-button-hardhat'); + await checkIfVisible('testnet-toast-Hardhat'); + + // validate it has the expected funds of 20 eth + const attributes = await fetchElementAttributes('fast-coin-info'); + expect(attributes.label).toContain('Ethereum'); + expect(attributes.label).toContain('20'); + }); + + it('Should open swap screen with 50% inputAmount for inputAsset', async () => { + await tap('swap-button'); + + // currently needed due to detox hanging on swap quotes + await device.disableSynchronization(); + await tap('token-to-buy-dai-1'); + const swapInput = await fetchElementAttributes('swap-asset-input'); + + // expect inputAsset === .5 * eth balance + expect(swapInput.elements[0].label).toContain('Ethereum'); + expect(swapInput.elements[0].label).toContain('10'); + }); + + it('Should be able to go to review and execute a swap', async () => { + await tapByText('Review'); + await delayTime('long'); + const reviewActionElements = await fetchElementAttributes('swap-action-button'); + expect(reviewActionElements.elements[0].label).toContain('ETH'); + expect(reviewActionElements.elements[1].label).toContain('DAI'); + expect(reviewActionElements.elements[2].label).toContain('Tap to Swap'); + await tapByText('Tap to Swap'); + }); + + it('Should be able to see pending swap in activity', async () => { + // allow swap to execute + await delayTime('long'); + const activityListElements = await fetchElementAttributes('wallet-activity-list'); + expect(activityListElements.label).toContain('ETH'); + expect(activityListElements.label).toContain('DAI'); + await tapByText('Swapping'); + await delayTime('long'); + const transactionSheet = await checkIfVisible('transaction-details-sheet'); + expect(transactionSheet).toBeTruthy(); + }); + + it('Should open swap screen from ProfileActionRowButton with largest user asset', async () => { + /** + * tap swap button + * wait for Swap header to be visible + * grab highest user asset balance from userAssetsStore + * expect inputAsset.uniqueId === highest user asset uniqueId + */ + }); + + it('Should open swap screen from asset chart with that asset selected', async () => { + /** + * tap any user asset (store const uniqueId here) + * wait for Swap header to be visible + * expect inputAsset.uniqueId === const uniqueId ^^ + */ + }); + + it('Should open swap screen from dapp browser control panel with largest user asset', async () => { + /** + * tap swap button + * wait for Swap header to be visible + * grab highest user asset balance from userAssetsStore + * expect inputAsset.uniqueId === highest user asset uniqueId + */ + }); + + it('Should not be able to type in output amount if cross-chain quote', async () => { + /** + * tap swap button + * wait for Swap header to be visible + * select different chain in output list chain selector + * select any asset in output token list + * focus output amount + * attempt to type any number in the SwapNumberPad + * attempt to remove a character as well + * + * ^^ expect both of those to not change the outputAmount + */ + }); +}); diff --git a/e2e/Disabled/deeplinks.disabled.ts b/e2e/Disabled/deeplinks.disabled.ts deleted file mode 100644 index af449e366af..00000000000 --- a/e2e/Disabled/deeplinks.disabled.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { exec } from 'child_process'; -import { device } from 'detox'; -import { - openDeeplinkColdStart, - openDeeplinkFromBackground, - checkIfVisible, - checkIfElementByTextIsVisible, - swipe, - waitAndTap, - checkIfExists, - typeText, - checkIfElementHasString, - disableSynchronization, - authenticatePin, - enableSynchronization, - tapAlertWithButton, -} from '../helpers'; - -const RAINBOW_WALLET_ADDRESS = '0x7a3d05c70581bD345fe117c06e45f9669205384f'; - -const android = device.getPlatform() === 'android'; - -const testEthereumDeeplink = async (url: string, coldStart = true) => { - coldStart ? await openDeeplinkColdStart(url) : await openDeeplinkFromBackground(url); - await checkIfVisible('send-sheet-confirm-action-button', 30000); - // Because we don't have ETH in this wallet - try { - await checkIfElementByTextIsVisible('􀕹 Review', 15000); - } catch (e) { - try { - await checkIfElementByTextIsVisible('Insufficient ETH', 15000); - } catch (e) { - await checkIfElementByTextIsVisible('Insufficient Funds', 15000); - } - } - await swipe('send-sheet', 'down'); -}; - -const escapeUrl = (url: string) => { - if (android) { - return url.replace(/&/g, '\\&'); - } else { - return url; - } -}; - -beforeAll(async () => { - if (android) { - // When opening deeplink to rainbow, Android asks if we want to do it in - // Chrome or the app. Detox is only able to control tapping within the app, - // so this blocks our tests. The only way we found to bypass this is to - // uninstall Chrome before. - exec('yarn adb-all shell pm disable-user com.android.chrome'); - } - await device.reloadReactNative(); -}); -afterAll(async () => { - await device.clearKeychain(); -}); - -describe.skip('Deeplinks spec', () => { - it('Should show the welcome screen', async () => { - await checkIfVisible('welcome-screen'); - }); - - it('Should show the "Add Wallet Sheet" after tapping on "I already have a wallet"', async () => { - await waitAndTap('already-have-wallet-button'); - await checkIfExists('add-wallet-sheet'); - }); - - it('Show the "Import Sheet" when tapping on "Restore with a recovery phrase or private key"', async () => { - await waitAndTap('restore-with-key-button'); - await checkIfExists('import-sheet'); - }); - - it('Should show the "Add wallet modal" after tapping import with a valid private key"', async () => { - await typeText('import-sheet-input', process.env.TEST_SEEDS, false); - await checkIfElementHasString('import-sheet-button-label', 'Continue'); - await waitAndTap('import-sheet-button'); - await checkIfVisible('wallet-info-modal'); - }); - - it('Should navigate to the Wallet screen after tapping on "Import Wallet"', async () => { - await disableSynchronization(); - await waitAndTap('wallet-info-submit-button'); - if (android) { - await checkIfVisible('pin-authentication-screen'); - // Set the pin - await authenticatePin('1234'); - // Confirm it - await authenticatePin('1234'); - } - await checkIfVisible('wallet-screen', 40000); - await enableSynchronization(); - }); - - it('should reject ethereum urls for assets that are not in the wallet', async () => { - const url = `ethereum:0xef2e9966eb61bb494e5375d5df8d67b7db8a780d@1/transfer?address=${RAINBOW_WALLET_ADDRESS}&uint256=1e15`; - await openDeeplinkFromBackground(url); - await checkIfElementByTextIsVisible('Ooops!', 30000); - await tapAlertWithButton('OK'); - }); - - it('should show the Profile Sheet for rainbow.me universal links with ENS names', async () => { - await openDeeplinkFromBackground('https://rainbow.me/profile/rainbowwallet.eth'); - await checkIfVisible('profile-sheet', 30000); - await checkIfElementByTextIsVisible('rainbowwallet.eth', 30000); - await swipe('profile-sheet', 'down'); - }); - - it('should show the Profile Sheet for rainbow.me universal links with 0x addresses', async () => { - await openDeeplinkFromBackground('https://rainbow.me/profile/0xE46aBAf75cFbFF815c0b7FfeD6F02B0760eA27f1'); - await checkIfVisible('profile-sheet', 30000); - await checkIfElementByTextIsVisible('0xE46aBAf75cFbFF815c0b7FfeD6F02B0760eA27f1', 30000); - await swipe('profile-sheet', 'down'); - }); - - it.skip('should be able to handle ethereum payments urls for ETH (mainnet)', async () => { - const url = escapeUrl(`ethereum:payment-${RAINBOW_WALLET_ADDRESS}@1?value=1e2`); - await testEthereumDeeplink(url, false); - }); - - it.skip('should be able to handle ethereum payments urls for ETH (optimism)', async () => { - const url = escapeUrl(`ethereum:payment-${RAINBOW_WALLET_ADDRESS}@10?value=1e15`); - await testEthereumDeeplink(url, false); - }); - - // FIXME: when doing open deeplinks with cold start, the account assets state - // comes back empty, find a fix and then change these tests to cold-start again - it('should be able to handle ethereum payments urls for DAI (mainnet)', async () => { - const url = escapeUrl(`ethereum:0x6b175474e89094c44da98b954eedeac495271d0f@1/transfer?address=${RAINBOW_WALLET_ADDRESS}&uint256=1e18`); - await testEthereumDeeplink(url, false); - }); - - // FIXME: when doing open deeplinks with cold start, the account assets state - // comes back empty, find a fix and then change these tests to cold-start again - it.skip('should be able to handle ethereum payments urls for ETH (arbitrum)', async () => { - const url = `ethereum:payment-${RAINBOW_WALLET_ADDRESS}@42161?value=1e15`; - await testEthereumDeeplink(url, false); - }); - - // FIXME: when doing open deeplinks with cold start, the account assets state - // comes back empty, find a fix and then change these tests to cold-start again - it.skip('should be able to handle ethereum payments urls for DAI (optimism)', async () => { - const url = escapeUrl(`ethereum:0xda10009cbd5d07dd0cecc66161fc93d7c9000da1@10/transfer?address=${RAINBOW_WALLET_ADDRESS}&uint256=1e15`); - await testEthereumDeeplink(url, false); - }); - - // FIXME: when doing open deeplinks with cold start, the account assets state - // comes back empty, find a fix and then change these tests to cold-start again - it.skip('should be able to handle ethereum payments urls for MATIC (polygon)', async () => { - const url = escapeUrl(`ethereum:payment-${RAINBOW_WALLET_ADDRESS}@137?value=1e15`); - await testEthereumDeeplink(url, false); - }); -}); diff --git a/e2e/Disabled/hardhatTransactionFlowSendAndWC.disable.js b/e2e/Disabled/hardhatTransactionFlowSendAndWC.disable.js deleted file mode 100644 index 078e7ef09d2..00000000000 --- a/e2e/Disabled/hardhatTransactionFlowSendAndWC.disable.js +++ /dev/null @@ -1,397 +0,0 @@ -import { Contract } from '@ethersproject/contracts'; -import WalletConnect from '@walletconnect/client'; -import { convertUtf8ToHex } from '@walletconnect/legacy-utils'; -import * as Helpers from '../helpers'; -import kittiesABI from '@/references/cryptokitties-abi.json'; -import erc20ABI from '@/references/erc20-abi.json'; -import { device } from 'detox'; - -let connector = null; -let uri = null; -let account = null; - -const ios = device.getPlatform() === 'ios'; -const android = device.getPlatform() === 'android'; - -const RAINBOW_WALLET_DOT_ETH = '0x7a3d05c70581bd345fe117c06e45f9669205384f'; -const TESTING_WALLET = '0x3Cb462CDC5F809aeD0558FBEe151eD5dC3D3f608'; - -const CRYPTOKITTIES_ADDRESS = '0x06012c8cf97BEaD5deAe237070F9587f8E7A266d'; -const ETH_ADDRESS = 'eth'; -const BAT_TOKEN_ADDRESS = '0x0d8775f648430679a709e98d2b0cb6250d2887ef'; - -const isNFTOwner = async address => { - const provider = Helpers.getProvider(); - const kittiesContract = new Contract(CRYPTOKITTIES_ADDRESS, kittiesABI, provider); - const ownerAddress = await kittiesContract.ownerOf('1368227'); - return ownerAddress?.toLowerCase() === address?.toLowerCase(); -}; - -const getOnchainBalance = async (address, tokenContractAddress) => { - const provider = Helpers.getProvider(); - if (tokenContractAddress === ETH_ADDRESS) { - const balance = await provider.getBalance(RAINBOW_WALLET_DOT_ETH); - return balance; - } else { - const tokenContract = new Contract(tokenContractAddress, erc20ABI, provider); - const balance = await tokenContract.balanceOf(address); - return balance; - } -}; - -beforeAll(async () => { - await Helpers.startHardhat(); - await Helpers.startIosSimulator(); -}); - -describe.skip('Hardhat Transaction Flow', () => { - it('Should show the welcome screen', async () => { - await Helpers.checkIfVisible('welcome-screen'); - }); - - it('Should show the "Add Wallet Sheet" after tapping on "I already have a wallet"', async () => { - await Helpers.waitAndTap('already-have-wallet-button'); - await Helpers.checkIfExists('add-wallet-sheet'); - }); - - it('show the "Import Sheet" when tapping on "Restore with a recovery phrase or private key"', async () => { - await Helpers.waitAndTap('restore-with-key-button'); - await Helpers.checkIfExists('import-sheet'); - }); - - it('Should show the "Add wallet modal" after tapping import with a valid seed"', async () => { - await Helpers.clearField('import-sheet-input'); - await Helpers.typeText('import-sheet-input', process.env.TEST_SEEDS, false); - await Helpers.checkIfElementHasString('import-sheet-button-label', 'Continue'); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.checkIfVisible('wallet-info-modal'); - }); - - it('Should navigate to the Wallet screen after tapping on "Import Wallet"', async () => { - await Helpers.disableSynchronization(); - await Helpers.waitAndTap('wallet-info-submit-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - // Set the pin - await Helpers.authenticatePin('1234'); - // Confirm it - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('wallet-screen', 80000); - await Helpers.enableSynchronization(); - }); - - it('Should send ETH to test wallet"', async () => { - await Helpers.sendETHtoTestWallet(); - }); - - it('Should show Hardhat Toast after pressing Connect To Hardhat', async () => { - await Helpers.waitAndTap('dev-button-hardhat'); - await Helpers.checkIfVisible('testnet-toast-Hardhat'); - }); - - it('Should open send sheet after tapping send fab', async () => { - await Helpers.waitAndTap('send-button'); - await Helpers.checkIfVisible('send-asset-form-field'); - }); - - // FIXME: This is the problem with a review button being tapped but detox not - // registering the action and timing out and leaving the state of the app in - // a place where all following tests are failing. - it.skip('Should send (Cryptokitties)', async () => { - await Helpers.typeTextAndHideKeyboard('send-asset-form-field', RAINBOW_WALLET_DOT_ETH); - await Helpers.waitAndTap('CryptoKitties-family-header'); - await Helpers.tapByText('Arun Cattybinky'); - await Helpers.waitAndTap('gas-speed-custom'); - await Helpers.waitAndTap('speed-pill-urgent'); - await Helpers.waitAndTap('gas-speed-done-button'); - await Helpers.checkIfVisible('send-sheet-confirm-action-button'); - // FIXME: This taps in the sim, but test never picks up the action - // confirmation - await Helpers.waitAndTap('send-sheet-confirm-action-button', 20000); - await Helpers.tapAndLongPress('send-confirmation-button'); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('profile-screen'); - const isOwnerRecipient = await isNFTOwner(RAINBOW_WALLET_DOT_ETH); - if (!isOwnerRecipient) { - throw new Error('Recepient did not recieve Cryptokitty'); - } - }); - - it.skip('Should show completed send NFT (Cryptokitties)', async () => { - try { - await Helpers.checkIfVisible('Sent-Arun Cattybinky-1.00 CryptoKitties'); - } catch (e) { - await Helpers.checkIfVisible('Sending-Arun Cattybinky-1.00 CryptoKitties'); - } - - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it.skip('Should send ERC20 (BAT)', async () => { - const preSendBalance = await getOnchainBalance(RAINBOW_WALLET_DOT_ETH, BAT_TOKEN_ADDRESS); - await Helpers.waitAndTap('send-button'); - await Helpers.typeTextAndHideKeyboard('send-asset-form-field', RAINBOW_WALLET_DOT_ETH); - await Helpers.waitAndTap('send-asset-BAT-mainnet'); - await Helpers.typeText('selected-asset-field-input', '1.02', true); - await Helpers.waitAndTap('send-sheet-confirm-action-button'); - await Helpers.tapAndLongPress('send-confirmation-button'); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('profile-screen'); - const postSendBalance = await getOnchainBalance(RAINBOW_WALLET_DOT_ETH, BAT_TOKEN_ADDRESS); - if (!postSendBalance.gt(preSendBalance)) { - throw new Error('Recepient did not recieve BAT'); - } - }); - - it.skip('Should show completed send ERC20 (BAT)', async () => { - try { - await Helpers.checkIfVisible('Sent-Basic Attention Token-1.02 BAT'); - } catch (e) { - await Helpers.checkIfVisible('Sending-Basic Attention Token-1.02 BAT'); - } - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it.skip('Should send ETH', async () => { - await Helpers.waitAndTap('send-button'); - await Helpers.typeTextAndHideKeyboard('send-asset-form-field', RAINBOW_WALLET_DOT_ETH); - const preSendBalance = await getOnchainBalance(RAINBOW_WALLET_DOT_ETH, ETH_ADDRESS); - await Helpers.waitAndTap('send-asset-ETH-mainnet'); - await Helpers.typeText('selected-asset-field-input', '0.003', true); - await Helpers.waitAndTap('send-sheet-confirm-action-button'); - await Helpers.tapAndLongPress('send-confirmation-button'); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('profile-screen'); - const postSendBalance = await getOnchainBalance(RAINBOW_WALLET_DOT_ETH, ETH_ADDRESS); - if (!postSendBalance.gt(preSendBalance)) { - throw new Error('Recepient did not recieve ETH'); - } - }); - - it.skip('Should show completed send ETH', async () => { - try { - await Helpers.checkIfVisible('Sent-Ethereum-0.003 ETH'); - } catch (e) { - await Helpers.checkIfVisible('Sending-Ethereum-0.003 ETH'); - } - await Helpers.checkIfVisible('profile-screen'); - }); - - // FIXME: we have converted to V2 - review and re-enable - if (ios) { - // TODO important - it('Should receive the WC connect request and approve it', async () => { - connector = new WalletConnect({ - bridge: 'https://bridge.walletconnect.org', - clientMeta: { - description: 'Connect with WalletConnect', - icons: ['https://walletconnect.org/walletconnect-logo.png'], - name: 'WalletConnect', - url: 'https://walletconnect.org', - }, - }); - - await connector.createSession(); - uri = connector.uri; - const connected = new Promise(async (resolve, reject) => { - connector.on('connect', (error, payload) => { - if (error) { - reject(error); - } - const { accounts } = payload.params[0]; - if (accounts[0] === TESTING_WALLET) { - account = accounts[0]; - resolve(true); - } else { - reject(false); - } - }); - }); - - const baseUrl = 'https://rnbwapp.com'; - const encodedUri = encodeURIComponent(uri); - const fullUrl = `${baseUrl}/wc?uri=${encodedUri}`; - - await Helpers.openDeeplinkFromBackground(fullUrl); - - await Helpers.checkIfVisible('wc-approval-sheet', 30000); - await Helpers.waitAndTap('wc-connect-action-button'); - const isConnected = await connected; - if (!isConnected) throw new Error('WC Connection failed'); - android && (await Helpers.delay(2137)); - await Helpers.checkIfVisible('wc-redirect-sheet'); - if (android) { - await device.pressBack(); - } else { - await Helpers.swipe('wc-redirect-sheet', 'down', 'fast'); - } - }); - - it('Should be able to sign personal messages via WC', async () => { - const result = connector.signPersonalMessage(['My msg', account]); - await Helpers.checkIfVisible('wc-request-sheet'); - await Helpers.waitAndTap('wc-confirm-action-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - if (!result) throw new Error('WC Connection failed'); - const signature = await result; - if ( - signature !== - '0x9b08221727750e582b43e14f50069083ac6d8a2670a9f28009f14cbef7e66ba16d3370330aed5b6744027bd6a0bef32cb97bb9da3db34c67ba2237b2ef5d1ec71b' - ) { - throw new Error('WC personal sign failed'); - } - }); - - it('Should be able to sign eth_sign messages via WC', async () => { - const message = `My email is john@doe.com`; - const hexMsg = convertUtf8ToHex(message); - const msgParams = [account, hexMsg]; - const result = connector.signMessage(msgParams); - await Helpers.checkIfVisible('wc-request-sheet'); - await Helpers.waitAndTap('wc-confirm-action-button'); - - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - - if (!result) throw new Error('WC Connection failed'); - const signature = await result; - // verify signature - if ( - signature !== - '0x141d62e1aaa2202ededb07f1684ef6d3d9958d334713010ea91df3831e3a3c99303a83f334d1e5e935c4edd7146a2f3f4301c5d509ccfeffd55f5db4e971958b1c' - ) { - throw new Error('WC eth_sign failed'); - } - }); - - it('Should be able to sign typed data messages via WC', async () => { - const msg = { - types: { - EIP712Domain: [ - { name: 'name', type: 'string' }, - { name: 'version', type: 'string' }, - { name: 'verifyingContract', type: 'address' }, - ], - RelayRequest: [ - { name: 'target', type: 'address' }, - { name: 'encodedFunction', type: 'bytes' }, - { name: 'gasData', type: 'GasData' }, - { name: 'relayData', type: 'RelayData' }, - ], - GasData: [ - { name: 'gasLimit', type: 'uint256' }, - { name: 'gasPrice', type: 'uint256' }, - { name: 'pctRelayFee', type: 'uint256' }, - { name: 'baseRelayFee', type: 'uint256' }, - ], - RelayData: [ - { name: 'senderAddress', type: 'address' }, - { name: 'senderNonce', type: 'uint256' }, - { name: 'relayWorker', type: 'address' }, - { name: 'paymaster', type: 'address' }, - ], - }, - domain: { - name: 'GSN Relayed Transaction', - version: '1', - chainId: 42, - verifyingContract: '0x6453D37248Ab2C16eBd1A8f782a2CBC65860E60B', - }, - primaryType: 'RelayRequest', - message: { - target: '0x9cf40ef3d1622efe270fe6fe720585b4be4eeeff', - encodedFunction: - '0xa9059cbb0000000000000000000000002e0d94754b348d208d64d52d78bcd443afa9fa520000000000000000000000000000000000000000000000000000000000000007', - gasData: { - gasLimit: '39507', - gasPrice: '1700000000', - pctRelayFee: '70', - baseRelayFee: '0', - }, - relayData: { - senderAddress: '0x22d491bde2303f2f43325b2108d26f1eaba1e32b', - senderNonce: '3', - relayWorker: '0x3baee457ad824c94bd3953183d725847d023a2cf', - paymaster: '0x957F270d45e9Ceca5c5af2b49f1b5dC1Abb0421c', - }, - }, - }; - - const result = connector.signTypedData([account, JSON.stringify(msg)]); - await Helpers.checkIfVisible('wc-request-sheet'); - await Helpers.waitAndTap('wc-confirm-action-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - - const signature = await result; - if ( - signature !== - '0xb78f17ff5779826ebfe4a7572a569a8802c02962242ff0195bd17bd4c07248b930a8c459276bc6eaa02dfb4523b8dc66d0020742d3f60a9209bde811aebb39351b' - ) { - throw new Error('WC typed data failed'); - } - }); - - it('Should be able to approve transactions via WC (Send)', async () => { - const preSendBalance = await getOnchainBalance(RAINBOW_WALLET_DOT_ETH, ETH_ADDRESS); - const result = connector.sendTransaction({ - from: account, - to: RAINBOW_WALLET_DOT_ETH, - value: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000', - data: '0x', - }); - await Helpers.checkIfVisible('wc-request-sheet'); - - await Helpers.waitAndTap('wc-confirm-action-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - - await Helpers.checkIfVisible('profile-screen'); - const hash = await result; - if (!hash) { - throw new Error('WC approving tx failed'); - } - - const postSendBalance = await getOnchainBalance(RAINBOW_WALLET_DOT_ETH, ETH_ADDRESS); - if (!postSendBalance.gt(preSendBalance)) throw new Error('Recepient did not recieve ETH'); - }); - - it('Should show completed send ETH (WC)', async () => { - try { - await Helpers.checkIfVisible('Sent-Ethereum-1.00 ETH'); - } catch (e) { - await Helpers.checkIfVisible('Sending-Ethereum-1.00 ETH'); - } - }); - } - - afterAll(async () => { - // Reset the app state - await connector?.killSession(); - connector = null; - await device.clearKeychain(); - await Helpers.killHardhat(); - }); -}); diff --git a/e2e/Disabled/hardhatTransactionFlowSwaps.disabled.js b/e2e/Disabled/hardhatTransactionFlowSwaps.disabled.js deleted file mode 100644 index aa2343731d9..00000000000 --- a/e2e/Disabled/hardhatTransactionFlowSwaps.disabled.js +++ /dev/null @@ -1,419 +0,0 @@ -import * as Helpers from '../helpers'; -import { device } from 'detox'; - -let connector = null; -const ios = device.getPlatform() === 'ios'; -const android = device.getPlatform() === 'android'; - -beforeAll(async () => { - await Helpers.startHardhat(); - await Helpers.startIosSimulator(); -}); - -const acceptAlertIfGasPriceIsHigh = async () => { - // Depending on current gas prices, we might get an alert - // saying that the fees are higher than the swap amount - try { - if (await Helpers.checkIfElementByTextIsVisible('Proceed Anyway')) { - await Helpers.tapAlertWithButton('Proceed Anyway'); - } - // eslint-disable-next-line no-empty - } catch (e) {} -}; - -// eslint-disable-next-line no-unused-vars -const checkIfSwapCompleted = async (assetName, amount) => { - // Disabling this because there's a view blocking (The portal) - // await Helpers.checkIfVisible(`Swapped-${assetName}-${amount}`); - return true; -}; - -// FIXME: Mainnet DAI doesn't show up in the swap search results -// This might be related to @Jin's latest work on changes to hardhat as -// part of the addy's REST API migration -// -// marking the test as SKIP for now -describe.skip('Hardhat Transaction Flow', () => { - it('Should show the welcome screen', async () => { - await Helpers.checkIfVisible('welcome-screen'); - }); - - it('Should show the "Add Wallet Sheet" after tapping on "I already have a wallet"', async () => { - await Helpers.waitAndTap('already-have-wallet-button'); - await Helpers.checkIfExists('add-wallet-sheet'); - }); - - it('show the "Import Sheet" when tapping on "Restore with a recovery phrase or private key"', async () => { - await Helpers.waitAndTap('restore-with-key-button'); - await Helpers.checkIfExists('import-sheet'); - }); - - it('Should show the "Add wallet modal" after tapping import with a valid seed"', async () => { - await Helpers.clearField('import-sheet-input'); - await Helpers.typeText('import-sheet-input', process.env.TEST_SEEDS, false); - await Helpers.checkIfElementHasString('import-sheet-button-label', 'Continue'); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.checkIfVisible('wallet-info-modal'); - }); - - it('Should navigate to the Wallet screen after tapping on "Import Wallet"', async () => { - await Helpers.disableSynchronization(); - await Helpers.waitAndTap('wallet-info-submit-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - // Set the pin - await Helpers.authenticatePin('1234'); - // Confirm it - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('wallet-screen', 80000); - await Helpers.enableSynchronization(); - }); - - it('Should send ETH to test wallet"', async () => { - await Helpers.sendETHtoTestWallet(); - }); - - it('Should show Hardhat Toast after pressing Connect To Hardhat', async () => { - await Helpers.waitAndTap('dev-button-hardhat'); - await Helpers.checkIfVisible('testnet-toast-Hardhat'); - }); - - it.skip('Should deposit DAI (via Compound)', async () => { - await Helpers.tap('Savings-list-header'); - await Helpers.waitAndTap('savings-list-row-DAI'); - await Helpers.waitAndTap('deposit-action-button'); - await Helpers.typeText('deposit-modal-input', '5', true, true); - await Helpers.tapAndLongPress('deposit-modal-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - try { - await Helpers.checkIfVisible('Deposited-Dai-5.00 DAI'); - } catch (e) { - await Helpers.checkIfVisible('Depositing-Dai-5.00 DAI'); - } - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should be able to do a cross chain swap', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('exchange-modal-output-selection-button'); - await Helpers.waitAndTap('network-switcher-item-optimism'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-USDC-optimism'); - await Helpers.typeText('exchange-modal-input', '0.001', true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - }); - - it('Should be able to do a bridge', async () => { - await Helpers.swipe('profile-screen', 'left', 'slow'); - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-USDC-mainnet'); - await Helpers.waitAndTap('exchange-modal-output-selection-button'); - await Helpers.waitAndTap('network-switcher-item-optimism'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-USDC-optimism'); - await Helpers.typeText('exchange-modal-input', '0.01', true); - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - await Helpers.tapAndLongPress('swap-details-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it.skip('Should withdraw DAI (via Compound)', async () => { - await Helpers.waitAndTap('savings-list-row-DAI'); - await Helpers.waitAndTap('withdraw-action-button'); - await Helpers.typeText('withdraw-modal-input', '1', true, true); - await Helpers.tapAndLongPress('withdraw-modal-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - try { - await Helpers.checkIfVisible('Withdrew-Dai-1.00 DAI'); - } catch (e) { - await Helpers.checkIfVisible('Withdrawing-Dai-1.00 DAI'); - } - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should be able to search random tokens (like SWYF) via address and swap them', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.waitAndTap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', '0xefa6903aa49cd539c079ac4b0a090db432615822', true); - }); - - it('Should be able to search random tokens (like SWYF) via address and swap them 2', async () => { - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-SWYF-mainnet'); - await Helpers.tapByText('Continue'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input', '0.001', true, true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - - await checkIfSwapCompleted('Ethereum', '0.001 ETH'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should be able to wrap ETH -> WETH', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'WETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-WETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input', '0.001', true, true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(3000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('Ethereum', '0.001 ETH'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - it('Should be able to unwrap WETH -> ETH', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'WETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-WETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input', '0.0005', true, true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('Wrapper Ether', '0.0005 WETH'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - it('Should swap WETH -> DAI including approval (via tokenToToken)', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'WETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-WETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.typeText('exchange-modal-input', '0.0005', true, true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('Wrapper Ether', '0.0005 WETH'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should swap DAI -> USDC (via tokenToTokenWithPermit)', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.tap('currency-select-list-exchange-coin-row-USDC-mainnet'); - await Helpers.typeText('exchange-modal-input', '10', true, true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('DAI', '4 DAI'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should swap DAI -> ETH (via tokenToETH)', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.typeText('exchange-modal-input', '4', true, true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('DAI', '4 DAI'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should swap ETH -> USDC (via ethToToken)', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.tap('currency-select-list-exchange-coin-row-USDC-mainnet'); - await Helpers.typeText('exchange-modal-input', '0.005', true, true); - await Helpers.delay(1000); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('Ethereum', '0.005 ETH'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - it('Should swap USDC -> WETH (via tokenToTokenWithPermit)', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.tap('currency-select-list-exchange-coin-row-USDC-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'WETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-WETH-mainnet'); - await Helpers.typeText('exchange-modal-input', '14', true, true); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('USD Coin', '25 USDC'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should swap USDC -> ETH (via tokenToETH)', async () => { - await Helpers.tap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.tap('currency-select-list-exchange-coin-row-USDC-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.typeText('exchange-modal-input', '10', true, true); - await Helpers.delay(1000); - if (ios) { - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - } else { - await Helpers.tap('exchange-modal-confirm-button'); - } - await Helpers.tapAndLongPress('swap-details-confirm-button'); - await acceptAlertIfGasPriceIsHigh(); - if (android) { - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await checkIfSwapCompleted('USD Coin', '20 USDC'); - await acceptAlertIfGasPriceIsHigh(); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - afterAll(async () => { - // Reset the app state - await connector?.killSession(); - connector = null; - await device.clearKeychain(); - await Helpers.killHardhat(); - }); -}); diff --git a/e2e/Disabled/hiddenTokensFlow.disabled.js b/e2e/Disabled/hiddenTokensFlow.disabled.js deleted file mode 100644 index a0e6f2659a0..00000000000 --- a/e2e/Disabled/hiddenTokensFlow.disabled.js +++ /dev/null @@ -1,71 +0,0 @@ -import * as Helpers from '../helpers'; -import { device, element, by, waitFor } from 'detox'; - -const android = device.getPlatform() === 'android'; - -describe.skip('Hidden tokens flow', () => { - it('boots and loads wallet screen', async () => { - await Helpers.waitAndTap('already-have-wallet-button'); - await Helpers.waitAndTap('restore-with-key-button'); - await Helpers.clearField('import-sheet-input'); - await Helpers.typeText('import-sheet-input', process.env.TEST_SEEDS, false); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.disableSynchronization(); - await Helpers.waitAndTap('wallet-info-submit-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - // Set the pin - await Helpers.authenticatePin('1234'); - // Confirm it - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('wallet-screen', 80000); - await Helpers.enableSynchronization(); - }); - - it('NFT is hideable', async () => { - // open ENS and tap on our ENS NFT - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.tap('token-family-header-ENS'); - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.waitAndTap('wrapped-nft-rainbowtestwallet.eth'); - await Helpers.waitAndTap('unique-mainnet-expanded-state-context-menu-button'); - - if (android) { - await waitFor(element(by.text('Hide'))) - .toBeVisible() - .withTimeout(2000); - await element(by.text('Hide')).tap(); - } else { - await waitFor(element(by.label('Hide')).atIndex(1)).toBeVisible(); - await element(by.label('Hide')).atIndex(1).tap(); - } - }); - - it('NFT shows in Hidden collection', async () => { - // open ENS and tap on our ENS NFT - await waitFor(element(by.id('token-family-header-Hidden'))).toBeVisible(); - }); - - it('NFT is unhideable', async () => { - // open ENS and tap on our ENS NFT - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.tap('token-family-header-Hidden'); - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.waitAndTap('wrapped-nft-rainbowtestwallet.eth'); - await Helpers.waitAndTap('unique-mainnet-expanded-state-context-menu-button'); - - await waitFor(element(by.text('Unhide'))) - .toBeVisible() - .withTimeout(2000); - await element(by.text('Unhide')).tap(); - - await waitFor(element(by.id('token-family-header-Hidden'))).toNotExist(); - - await Helpers.checkIfVisible('wrapped-nft-rainbowtestwallet.eth'); - }); - - afterAll(async () => { - await device.clearKeychain(); - }); -}); diff --git a/e2e/Disabled/registerENSFlow.disabled.js b/e2e/Disabled/registerENSFlow.disabled.js deleted file mode 100644 index a177ab85c65..00000000000 --- a/e2e/Disabled/registerENSFlow.disabled.js +++ /dev/null @@ -1,642 +0,0 @@ -import { hash } from '@ensdomains/eth-ens-namehash'; -import { Contract } from '@ethersproject/contracts'; -import * as Helpers from '../helpers'; -import registrarABI from '@/references/ens/ENSETHRegistrarController.json'; -import publicResolverABI from '@/references/ens/ENSPublicResolver.json'; -import registryWithFallbackABI from '@/references/ens/ENSRegistryWithFallback.json'; -import { device } from 'detox'; - -const ensETHRegistrarControllerAddress = '0x283Af0B28c62C092C9727F1Ee09c02CA627EB7F5'; -const ensPublicResolverAddress = '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41'; -const ensRegistryAddress = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'; - -const RANDOM_NAME = 'randomname321'; -const RANDOM_NAME_ETH = RANDOM_NAME + '.eth'; -const RAINBOW_TEST_WALLET_NAME = 'rainbowtestwallet.eth'; -const RAINBOW_TEST_WALLET_ADDRESS = '0x3Cb462CDC5F809aeD0558FBEe151eD5dC3D3f608'; -const RAINBOW_WALLET_NAME = 'rainbowwallet.eth'; -const RAINBOW_WALLET_ADDRESS = '0x7a3d05c70581bD345fe117c06e45f9669205384f'; -const RECORD_BIO = 'my bio'; -const RECORD_NAME = 'random'; -const RECORD_CONTENTHASH = 'ipfs://QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4'; -const RECORD_TWITTER = 'twitter123'; -const RECORD_EMAIL = 'abc@abc.com'; -const RECORD_INSTAGRAM = 'insta123'; -const RECORD_DISCORD = 'abc#8133'; -const RECORD_GITHUB = 'github-123'; -const RECORD_SNAPCHAT = 'snapchat123'; -const RECORD_TELEGRAM = 'telegram123'; -const RECORD_REDDIT = 'reddit123'; -const RECORD_PRONOUNS = 'they/them'; -const RECORD_NOTICE = 'notice123'; -const RECORD_KEYWORDS = 'keywords123'; -const RECORD_URL = 'abc123.com'; -const EIP155_FORMATTED_AVATAR_RECORD = 'eip155:1/erc721:0x06012c8cf97bead5deae237070f9587f8e7a266d/1368227'; -const WALLET_AVATAR_COORDS = { x: 210, y: 125 }; - -const ios = device.getPlatform() === 'ios'; -const android = device.getPlatform() === 'android'; - -const address = (address, start, finish) => [address.substring(0, start), address.substring(address.length - finish)].join('...'); - -const nameIsAvailable = async name => { - const provider = Helpers.getProvider(); - const registrarContract = new Contract(ensETHRegistrarControllerAddress, registrarABI, provider); - const nameIsAvailable = await registrarContract.available(name); - return !!nameIsAvailable; -}; - -const getNameOwner = async ensName => { - const provider = Helpers.getProvider(); - const registry = new Contract(ensRegistryAddress, registryWithFallbackABI, provider); - const owner = await registry.owner(hash(ensName)); - return owner; -}; - -const getRecords = async ensName => { - const provider = Helpers.getProvider(); - const publicResolver = new Contract(ensPublicResolverAddress, publicResolverABI, provider); - const resolver = await provider.getResolver(ensName); - const hashName = hash(ensName); - const [avatar, contenthash, description, name, url, twitter, email, instagram, discord, github, snapchat, telegram, reddit] = - await Promise.all([ - publicResolver.text(hashName, 'avatar'), - resolver.getContentHash(ensName), - publicResolver.text(hashName, 'description'), - publicResolver.text(hashName, 'name'), - publicResolver.text(hashName, 'url'), - publicResolver.text(hashName, 'com.twitter'), - publicResolver.text(hashName, 'email'), - publicResolver.text(hashName, 'com.instagram'), - publicResolver.text(hashName, 'com.discord'), - publicResolver.text(hashName, 'com.github'), - publicResolver.text(hashName, 'com.snapchat'), - publicResolver.text(hashName, 'org.telegram'), - publicResolver.text(hashName, 'com.reddit'), - ]); - return { - avatar, - contenthash, - description, - discord, - email, - github, - instagram, - name, - reddit, - snapchat, - telegram, - twitter, - url, - }; -}; - -const resolveName = async ensName => { - const provider = Helpers.getProvider(); - const address = await provider.resolveName(ensName); - const primaryName = await provider.lookupAddress(address); - return { address, primaryName }; -}; - -const validatePrimaryName = async name => { - const { address: rainbowAddress, primaryName: rainbowPrimaryName } = await resolveName(RAINBOW_TEST_WALLET_NAME); - const { address: randomAddress, primaryName: randomPrimaryName } = await resolveName(RANDOM_NAME_ETH); - - if (rainbowAddress !== randomAddress || rainbowAddress !== RAINBOW_TEST_WALLET_ADDRESS || randomAddress !== RAINBOW_TEST_WALLET_ADDRESS) - throw new Error('Resolved address is wrong'); - - if (rainbowPrimaryName !== randomPrimaryName || rainbowPrimaryName !== name || randomPrimaryName !== name) - throw new Error('Resolved name is wrong'); -}; - -beforeAll(async () => { - await Helpers.startHardhat(); - await Helpers.startIosSimulator(); -}); - -describe.skip('Register ENS Flow', () => { - it('Should show the welcome screen', async () => { - await Helpers.checkIfVisible('welcome-screen'); - }); - - it('Should show the "Add Wallet Sheet" after tapping on "I already have a wallet"', async () => { - await Helpers.waitAndTap('already-have-wallet-button'); - await Helpers.checkIfExists('add-wallet-sheet'); - }); - - it('show the "Import Sheet" when tapping on "Restore with a recovery phrase or private key"', async () => { - await Helpers.waitAndTap('restore-with-key-button'); - await Helpers.checkIfExists('import-sheet'); - }); - - it('Should show the "Add wallet modal" after tapping import with a valid seed"', async () => { - await Helpers.clearField('import-sheet-input'); - await Helpers.typeText('import-sheet-input', process.env.TEST_SEEDS, false); - await Helpers.checkIfElementHasString('import-sheet-button-label', 'Continue'); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.checkIfVisible('wallet-info-modal'); - }); - - it('Should navigate to the Wallet screen after tapping on "Import Wallet"', async () => { - await Helpers.disableSynchronization(); - await Helpers.waitAndTap('wallet-info-submit-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - // Set the pin - await Helpers.authenticatePin('1234'); - // Confirm it - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('wallet-screen', 80000); - await Helpers.enableSynchronization(); - }); - - it('Should send ETH to test wallet"', async () => { - await Helpers.sendETHtoTestWallet(); - }); - - it('Should show Hardhat Toast after pressing Connect To Hardhat', async () => { - await Helpers.waitAndTap('dev-button-hardhat'); - await Helpers.checkIfVisible('testnet-toast-Hardhat'); - }); - - it('Should navigate to the Discover sheet screen after swiping left', async () => { - await Helpers.swipe('wallet-screen', 'left', 'slow'); - await Helpers.checkIfVisible('discover-header'); - }); - - it('Should go to ENS search screen by pressing the ENS search banner', async () => { - await Helpers.waitAndTap('ens-register-name-banner'); - await Helpers.checkIfVisible('ens-search-input'); - await Helpers.swipe('ens-search-sheet', 'down'); - }); - - it('Should go to ENS flow pressing the ENS banner', async () => { - device.getPlatform() === 'android' && (await Helpers.delay(2000)); - await Helpers.swipe('discover-sheet', 'up', 'slow', 0.2); - await Helpers.waitAndTap('ens-create-profile-card'); - await Helpers.checkIfVisible('ens-intro-sheet'); - }); - - it('Should be able to press a profile and continue to the ENS search screen', async () => { - await Helpers.waitAndTap('ens-intro-sheet-search-new-name-button-action-button'); - }); - - it('Should be able to type a name that is not available', async () => { - await Helpers.checkIfVisible('ens-search-input'); - await Helpers.typeText('ens-search-input', 'rainbowwallet', false); - await Helpers.waitAndTap('ens-search-clear-button'); - }); - - it('Should be able to type a name that has special characters', async () => { - await Helpers.checkIfVisible('ens-search-input'); - await Helpers.typeText('ens-search-input', '/invalidname', false); - await Helpers.waitAndTap('ens-search-clear-button'); - await Helpers.typeText('ens-search-input', '&&&ivalidname', false); - await Helpers.waitAndTap('ens-search-clear-button'); - await Helpers.typeText('ens-search-input', '/invalidname/', false); - await Helpers.waitAndTap('ens-search-clear-button'); - }); - - it('Should be able to type a name that is available and wait for fees', async () => { - await Helpers.checkIfVisible('ens-search-input'); - await Helpers.typeText('ens-search-input', RANDOM_NAME, false); - }); - - it('Should be able to see network fees and name rent price', async () => { - await Helpers.checkIfVisible('ens-search-input'); - await Helpers.checkIfVisible('ens-registration-fees'); - await Helpers.checkIfVisible('ens-registration-price'); - }); - - // FIXME: This is the problem with a review button being tapped but detox not - // registering the action and timing out and leaving the state of the app in - // a place where all following tests are failing. - it('Should go to view to set records', async () => { - await Helpers.checkIfVisible('ens-search-continue-action-button'); - await Helpers.waitAndTap('ens-search-continue-action-button'); - await Helpers.checkIfVisible('ens-text-record-name'); - if (android) { - await Helpers.waitAndTap('ens-text-record-name'); - await Helpers.tapByText('Got it'); - } - await Helpers.typeText('ens-text-record-name', RECORD_NAME, false); - if (ios) { - await Helpers.tapByText('Got it'); - } - await Helpers.checkIfVisible('ens-text-record-description'); - await Helpers.typeText('ens-text-record-description', RECORD_BIO, false); - await Helpers.clearField('ens-text-record-name'); - await Helpers.waitAndTap('use-select-image-avatar'); - await Helpers.tapByText('CryptoKitties'); - await Helpers.tapByText('Arun Cattybinky'); - await Helpers.checkIfVisible('ens-assign-records-review-action-button'); - await Helpers.delay(2000); - await Helpers.waitAndTap('ens-assign-records-review-action-button'); - }); - - it('Should display change gas to Urgent', async () => { - await Helpers.waitAndTap('gas-speed-custom'); - await Helpers.waitAndTap('speed-pill-urgent'); - await Helpers.waitAndTap('gas-speed-done-button'); - }); - - it('Should go to review registration and start it', async () => { - await Helpers.delay(2000); - await Helpers.checkIfVisible(`ens-transaction-action-COMMIT`); - if (ios) { - await Helpers.waitAndTap(`ens-transaction-action-COMMIT`); - } else { - await Helpers.tapAndLongPress('ens-transaction-action-COMMIT'); - } - await Helpers.delay(3000); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - await Helpers.delay(2000); - if (ios) { - await Helpers.checkIfVisible(`ens-confirm-register-label-WAIT_ENS_COMMITMENT`); - } - await Helpers.delay(65000); - }); - - it('Should see confirm registration screen', async () => { - await Helpers.checkIfVisible(`ens-transaction-action-REGISTER`); - if (ios) { - await Helpers.waitAndTap(`ens-transaction-action-REGISTER`); - } else { - await Helpers.tapAndLongPress('ens-transaction-action-REGISTER'); - await Helpers.delay(2000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - }); - - if (ios) { - // TODO - it('Should confirm that the name is not available anymore', async () => { - const ensAvailable = await nameIsAvailable(RANDOM_NAME); - if (ensAvailable) throw new Error('ENS name is available'); - }); - - it('Should confirm that the bio record is set', async () => { - const { description, name, avatar } = await getRecords(RANDOM_NAME_ETH); - if (description !== RECORD_BIO) throw new Error('ENS description is wrong'); - if (name === RECORD_NAME) throw new Error('ENS name is wrong'); - if (typeof avatar === 'string' && avatar.toLowerCase() !== EIP155_FORMATTED_AVATAR_RECORD) throw new Error('ENS avatar is wrong'); - }); - - it('Should confirm RANDOM_NAME is primary name', async () => { - await validatePrimaryName(RANDOM_NAME_ETH); - }); - } - - it('Should check new wallet name is the new ENS on profile screen and change wallet screen', async () => { - await Helpers.swipe('profile-screen', 'left', 'slow'); - await Helpers.checkIfVisible('wallet-screen'); - await Helpers.checkIfExists(`profile-name-${RANDOM_NAME_ETH}`); - await Helpers.tap(`profile-name-${RANDOM_NAME_ETH}`); - await Helpers.checkIfVisible(`change-wallet-address-row-label-${RANDOM_NAME_ETH}`); - await Helpers.swipe('change-wallet-sheet-title', 'down', 'fast'); - await Helpers.swipe('wallet-screen', 'right', 'slow'); - await Helpers.tapAtPoint('profile-screen', { x: 210, y: 185 }); - await Helpers.checkIfVisible(`change-wallet-address-row-label-${RANDOM_NAME_ETH}`); - await Helpers.swipe('change-wallet-sheet-title', 'down', 'fast'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should open ENS rainbowtestwallet.eth', async () => { - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.tapByText('CryptoKitties'); - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.waitAndTap('token-family-header-ENS'); - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.waitAndTap('wrapped-nft-rainbowtestwallet.eth'); - }); - - it('Should be able to navigate to the Edit screen', async () => { - await Helpers.waitAndTap('edit-action-button'); - await Helpers.checkIfVisible('ens-assign-records-sheet'); - await Helpers.swipe('ens-assign-records-sheet', 'down'); - }); - - it('Should use rainbowtestwallet.eth as primary name', async () => { - await Helpers.delay(2000); - await Helpers.swipe('unique-mainnet-expanded-state', 'up', 'slow'); - await Helpers.waitAndTap('ens-reverse-record-switch'); - await Helpers.checkIfVisible(`ens-transaction-action-SET_NAME`); - if (ios) { - await Helpers.waitAndTap(`ens-transaction-action-SET_NAME`); - } else { - await Helpers.tapAndLongPress('ens-transaction-action-SET_NAME'); - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - }); - - it('Should confirm rainbowtestwallet.eth is primary name', async () => { - await validatePrimaryName(RAINBOW_TEST_WALLET_NAME); - }); - - it('Should check wallet name is the new ENS set as primary on profile screen and change wallet screen', async () => { - await Helpers.swipe('profile-screen', 'left', 'slow'); - await Helpers.checkIfVisible('wallet-screen'); - await Helpers.checkIfExists(`profile-name-${RAINBOW_TEST_WALLET_NAME}`); - await Helpers.swipe('wallet-screen', 'right', 'slow'); - await Helpers.tapAtPoint('profile-screen', { x: 210, y: 185 }); - await Helpers.checkIfVisible(`change-wallet-address-row-label-${RAINBOW_TEST_WALLET_NAME}`); - await Helpers.swipe('change-wallet-sheet-title', 'down', 'fast'); - }); - - it('Should open the View Profile Sheet after tapping "View Profile"', async () => { - await Helpers.tapAtPoint('profile-screen', WALLET_AVATAR_COORDS); - await Helpers.checkIfExistsByText('View Profile'); - await Helpers.tapByText('View Profile'); - await Helpers.checkIfExists('profile-sheet'); - await Helpers.delay(2000); - await Helpers.checkIfExistsByText('rainbowtestwallet.eth'); - await Helpers.checkIfExistsByText('Test 2'); - await Helpers.swipe('profile-sheet', 'down'); - await Helpers.delay(1000); - }); - - it('Should open the Edit Profile Sheet after tapping "Edit Profile"', async () => { - await Helpers.tapAtPoint('profile-screen', WALLET_AVATAR_COORDS); - await Helpers.checkIfExistsByText('Edit Profile'); - await Helpers.tapByText('Edit Profile'); - await Helpers.checkIfExists('ens-edit-records-sheet'); - await Helpers.checkIfExistsByText('rainbowtestwallet.eth'); - await Helpers.checkIfExistsByText('Name'); - await Helpers.checkIfExistsByText('Bio'); - }); - - it('Should select ENS attributes in the Edit Profile Sheet', async () => { - // Select all the attributes - await Helpers.waitAndTap('ens-selectable-attribute-website'); - await Helpers.waitAndTap('ens-selectable-attribute-twitter'); - await Helpers.waitAndTap('ens-selectable-attribute-email'); - await Helpers.waitAndTap('ens-selectable-attribute-instagram'); - await Helpers.waitAndTap('ens-selectable-attribute-discord'); - await Helpers.waitAndTap('ens-selectable-attribute-github'); - await Helpers.waitAndTap('ens-selectable-attribute-btc'); - await Helpers.waitAndTap('ens-selectable-attribute-dots'); - await Helpers.waitAndTap('ens-selectable-attribute-snapchat'); - await Helpers.waitAndTap('ens-selectable-attribute-telegram'); - await Helpers.waitAndTap('ens-selectable-attribute-reddit'); - await Helpers.waitAndTap('ens-selectable-attribute-pronouns'); - await Helpers.waitAndTap('ens-selectable-attribute-notice'); - await Helpers.waitAndTap('ens-selectable-attribute-keywords'); - await Helpers.waitAndTap('ens-selectable-attribute-ltc'); - await Helpers.waitAndTap('ens-selectable-attribute-doge'); - await Helpers.waitAndTap('ens-selectable-attribute-contenthash'); - - // Dismiss the bottom attribute sheet - await Helpers.swipe('ens-additional-records-sheet', 'down'); - }); - - it('Should fill & validate the fields', async () => { - await Helpers.delay(2000); - // Fill "Website" field - await Helpers.checkIfVisible('ens-text-record-url'); - await Helpers.typeText('ens-text-record-url', 'abc', false); - await Helpers.waitAndTap('ens-text-record-url-error'); - await Helpers.checkIfElementByTextToExist('Invalid URL'); - await Helpers.tapByText('OK'); - await Helpers.typeText('ens-text-record-url', '123.com', false); - await Helpers.delay(1000); - await Helpers.checkIfNotVisible('ens-text-record-url-error'); - - // Fill "Twitter" field - await Helpers.typeText('ens-text-record-com.twitter', RECORD_TWITTER, false); - - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15); - - // Fill "Email" field - await Helpers.typeText('ens-text-record-email', RECORD_EMAIL.slice(0, 3), false); - await Helpers.waitAndTap('ens-text-record-email-error'); - await Helpers.checkIfElementByTextToExist('Invalid email'); - await Helpers.tapByText('OK'); - await Helpers.typeText('ens-text-record-email', RECORD_EMAIL.slice(3), false); - await Helpers.delay(1000); - await Helpers.checkIfNotVisible('ens-text-record-email-error'); - - if (android) { - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? 0.15 : 0.3); - } - // Fill "Instagram" field - await Helpers.typeText('ens-text-record-com.instagram', RECORD_INSTAGRAM, false); - - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? 0.15 : 0.3); - - // Fill "Discord" field - await Helpers.typeText('ens-text-record-com.discord', RECORD_DISCORD.slice(0, 3), false); - await Helpers.waitAndTap('ens-text-record-com.discord-error'); - await Helpers.checkIfElementByTextToExist('Invalid Discord username'); - await Helpers.tapByText('OK'); - await Helpers.typeText('ens-text-record-com.discord', RECORD_DISCORD.slice(3), false); - await Helpers.delay(1000); - await Helpers.checkIfNotVisible('ens-text-record-com.discord-error'); - - // Fill "GitHub" field - await Helpers.typeText('ens-text-record-com.github', RECORD_GITHUB, false); - - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? undefined : 0.3); - }); - - it('Should fill & validate the fields 2', async () => { - // Fill "Bitcoin" field - await Helpers.typeText('ens-text-record-BTC', '1F1', false); - await Helpers.waitAndTap('ens-text-record-BTC-error'); - await Helpers.checkIfElementByTextToExist('Invalid BTC address'); - await Helpers.tapByText('OK'); - await Helpers.typeText('ens-text-record-BTC', 'tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX', false); - await Helpers.delay(3000); - await Helpers.checkIfNotVisible('ens-text-record-BTC-error'); - }); - - it('Should fill & validate the fields 3', async () => { - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? undefined : 0.3); - - // Fill "Snapchat" field - await Helpers.typeText('ens-text-record-com.snapchat', RECORD_SNAPCHAT, false); - - if (!ios) { - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.3, 0.3); - } - - // Fill "Telegram" field - await Helpers.typeText('ens-text-record-org.telegram', RECORD_TELEGRAM, false); - - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? undefined : 0.3); - - // Fill "Reddit" field - await Helpers.typeText('ens-text-record-com.reddit', RECORD_REDDIT, false); - - // Fill "Pronouns" field - await Helpers.typeText('ens-text-record-pronouns', RECORD_PRONOUNS, false); - - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? undefined : 0.3); - - // Fill "Notice" field - await Helpers.typeText('ens-text-record-notice', RECORD_NOTICE, false); - - // Fill "Keywords" field - await Helpers.typeText('ens-text-record-keywords', RECORD_KEYWORDS, false); - - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? undefined : 0.3); - await Helpers.swipe('ens-edit-records-sheet', 'up', 'slow', 0.15, ios ? undefined : 0.3); - }); - - it('Should fill & validate the fields 4', async () => { - // Fill "Litecoin" field - await Helpers.typeText('ens-text-record-LTC', 'MGx', false); - await Helpers.waitAndTap('ens-text-record-LTC-error'); - await Helpers.checkIfElementByTextToExist('Invalid LTC address'); - await Helpers.tapByText('OK'); - await Helpers.typeText('ens-text-record-LTC', 'NPPB7eBoWPUaprtX9v9CXJZoD2465zN', false); - await Helpers.delay(3000); - await Helpers.checkIfNotVisible('ens-text-record-LTC-error'); - - // Fill "Content" field - await Helpers.typeText('ens-text-record-contenthash', RECORD_CONTENTHASH.slice(0, 3), false); - await Helpers.waitAndTap('ens-text-record-contenthash-error'); - await Helpers.checkIfElementByTextToExist('Invalid content hash'); - await Helpers.tapByText('OK'); - await Helpers.typeText('ens-text-record-contenthash', RECORD_CONTENTHASH.slice(3), false); - await Helpers.delay(3000); - await Helpers.checkIfNotVisible('ens-text-record-contenthash-error'); - }); - - it('Should unselect a field', async () => { - await Helpers.swipe('ens-edit-records-sheet', 'down'); - await Helpers.waitAndTap('hide-keyboard-button'); - await Helpers.waitAndTap('ens-selectable-attribute-bio'); - await Helpers.checkIfNotVisible('ens-text-record-description'); - }); - - it('Should update a field', async () => { - await Helpers.typeText('ens-text-record-name', ' Guy', false); - await Helpers.waitAndTap('hide-keyboard-button'); - }); - - it('Should submit updated fields', async () => { - await Helpers.checkIfVisible('ens-assign-records-review-action-button'); - await Helpers.waitAndTap('ens-assign-records-review-action-button'); - await Helpers.checkIfVisible(`ens-transaction-action-EDIT`); - if (ios) { - await Helpers.waitAndTap(`ens-transaction-action-EDIT`); - } else { - await Helpers.tapAndLongPress('ens-transaction-action-EDIT'); - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - }); - - if (ios) { - // TODO - it('Should confirm the update was successful', async () => { - const { contenthash, description, discord, email, github, instagram, reddit, snapchat, telegram, twitter, url } = - await getRecords(RAINBOW_TEST_WALLET_NAME); - if (description) throw new Error('description should be empty'); - if (discord !== RECORD_DISCORD) throw new Error('discord is incorrect.', discord); - if (email !== RECORD_EMAIL) throw new Error('email is incorrect.', email); - if (github !== RECORD_GITHUB) throw new Error('github is incorrect.', github); - if (instagram !== RECORD_INSTAGRAM) throw new Error('instagram is incorrect.', instagram); - if (reddit !== RECORD_REDDIT) throw new Error('reddit is incorrect.', reddit); - if (snapchat !== RECORD_SNAPCHAT) throw new Error('snapchat is incorrect.', snapchat); - if (telegram !== RECORD_TELEGRAM) throw new Error('telegram is incorrect.', telegram); - if (twitter !== RECORD_TWITTER) throw new Error('twitter is incorrect.', twitter); - if (url !== RECORD_URL) throw new Error('url is incorrect.', url); - if (contenthash !== RECORD_CONTENTHASH) throw new Error('contenthash is incorrect.', contenthash); - }); - } - - it('Should navigate to the Wallet screen to renew', async () => { - await Helpers.swipe('profile-screen', 'left', 'slow'); - await Helpers.checkIfVisible('wallet-screen'); - }); - - it('Should open ENS rainbowtestwallet.eth to renew', async () => { - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.waitAndTap('wrapped-nft-rainbowtestwallet.eth'); - }); - - it('Should renew rainbowtestwallet.eth', async () => { - await Helpers.waitAndTap('unique-mainnet-expanded-state-extend-duration'); - await Helpers.checkIfVisible(`ens-transaction-action-RENEW`); - if (ios) { - await Helpers.waitAndTap(`ens-transaction-action-RENEW`); - } else { - await Helpers.tapAndLongPress('ens-transaction-action-RENEW'); - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - }); - - it('Should navigate to the Wallet screen to send ENS from renew tx', async () => { - await Helpers.swipe('profile-screen', 'left', 'slow'); - await Helpers.checkIfVisible('wallet-screen'); - }); - - it('Should open ENS rainbowtestwallet.eth to send ENS', async () => { - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.tapByText('CryptoKitties'); - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.swipe('wallet-screen', 'up', 'slow'); - await Helpers.waitAndTap('wrapped-nft-rainbowtestwallet.eth'); - await Helpers.waitAndTap('send-action-button'); - }); - - it('Should go to review send ENS', async () => { - await Helpers.typeText('send-asset-form-field', 'rainbowwallet.eth\n'); - await Helpers.waitAndTap('gas-speed-custom'); - await Helpers.waitAndTap('speed-pill-urgent'); - await Helpers.waitAndTap('gas-speed-done-button'); - await Helpers.waitAndTap('send-sheet-confirm-action-button'); - }); - - it('Should press all ENS options', async () => { - await Helpers.waitAndTap('clear-records'); - await Helpers.waitAndTap('set-address'); - await Helpers.waitAndTap('transfer-control'); - if (ios) { - await Helpers.waitAndTap(`send-confirmation-button`); - } else { - await Helpers.tapAndLongPress('send-confirmation-button'); - await Helpers.delay(1000); - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - } - }); - - it.skip('Should confirm the ENS was sent correctly', async () => { - await Helpers.delay(1000); - const { name } = await getRecords(RAINBOW_TEST_WALLET_NAME); - const { address, primaryName } = await resolveName(RAINBOW_TEST_WALLET_NAME); - const owner = await getNameOwner(RAINBOW_TEST_WALLET_NAME); - if (address !== RAINBOW_WALLET_ADDRESS) throw new Error('Resolved address is wrong'); - if (primaryName !== RAINBOW_WALLET_NAME) throw new Error('Resolved primary name is wrong'); - if (name) throw new Error('name is wrong'); - if (owner !== RAINBOW_WALLET_ADDRESS) throw new Error('Owner not set correctly'); - }); - - it.skip('Should check address is the new label on profile screen and change wallet screen', async () => { - const TRUNCATED_ADDRESS = address(RAINBOW_TEST_WALLET_ADDRESS, 4, 4); - const WALLET_ROW_TRUNCATED_ADDRESS = address(RAINBOW_TEST_WALLET_ADDRESS, 6, 4); - await Helpers.swipe('profile-screen', 'left', 'slow'); - await Helpers.checkIfVisible('wallet-screen'); - await Helpers.checkIfExists(`profile-name-sticky-${TRUNCATED_ADDRESS}`); - await Helpers.waitAndTap(`profile-name-sticky-${TRUNCATED_ADDRESS}`); - await Helpers.checkIfVisible(`change-wallet-address-row-label-${WALLET_ROW_TRUNCATED_ADDRESS}`); - }); - - afterAll(async () => { - // Reset the app state - await device.clearKeychain(); - await Helpers.killHardhat(); - }); -}); diff --git a/e2e/Disabled/sendSheetFlow.disabled.ts b/e2e/Disabled/sendSheetFlow.disabled.ts deleted file mode 100644 index 93b50f7091a..00000000000 --- a/e2e/Disabled/sendSheetFlow.disabled.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { device } from 'detox'; -import { - startHardhat, - killHardhat, - importWalletFlow, - sendETHtoTestWallet, - waitAndTap, - checkIfVisible, - checkIfElementByTextIsVisible, - typeText, - checkIfNotVisible, - clearField, - replaceTextInField, -} from '../helpers'; - -describe.skip('Send Sheet Interaction Flow', () => { - beforeAll(async () => { - await device.reloadReactNative(); - await startHardhat(); - }); - afterAll(async () => { - await device.clearKeychain(); - await killHardhat(); - }); - - it('Import a wallet and go to welcome', async () => { - await importWalletFlow(); - }); - - it('Should send ETH to test wallet"', async () => { - await sendETHtoTestWallet(); - }); - - it('Should show Hardhat Toast after pressing Connect To Hardhat', async () => { - await waitAndTap('dev-button-hardhat'); - await checkIfVisible('testnet-toast-Hardhat'); - }); - - it('Should open send sheet after tapping send button', async () => { - await waitAndTap('send-button'); - await checkIfVisible('send-asset-form-field'); - }); - - it('Should do nothing on typing jibberish send address', async () => { - await typeText('send-asset-form-field', 'gvuabefhiwdnomks', false); - await checkIfNotVisible('send-asset-ETH-mainnet'); - }); - - // FIXME: typing in address in sim has a glitch where the asset-list doesn't - // populate - // - // SKIPPING all tests after this one, as the app is in the wrong state - it('Should show show Contact Button & Asset List on valid public address', async () => { - await clearField('send-asset-form-field'); - await checkIfVisible('send-asset-form-field'); - await replaceTextInField('send-asset-form-field', '0xF0f21ab2012731542731df194cfF6c77d29cB31A'); - await checkIfVisible('send-asset-list', 20000); - }); - - it('Should show show Contact Button & Asset List on valid ENS & Unstoppable addresses', async () => { - await clearField('send-asset-form-field'); - await checkIfVisible('send-asset-form-field'); - await typeText('send-asset-form-field', 'neverselling.wallet\n', false); - await checkIfVisible('send-asset-list'); - await clearField('send-asset-form-field'); - await device.disableSynchronization(); - await typeText('send-asset-form-field', 'rainbowwallet.eth\n', false); - await device.enableSynchronization(); - await checkIfVisible('send-asset-list'); - }); - - it('Should display Asset Form after tapping on asset', async () => { - await checkIfVisible('send-asset-DAI-mainnet'); - await waitAndTap('send-asset-DAI-mainnet'); - await checkIfVisible('selected-asset-field-input'); - }); - - it('Should display max button on asset input focus', async () => { - await checkIfVisible('selected-asset-field-input'); - await waitAndTap('selected-asset-field-input'); - await checkIfElementByTextIsVisible('Max'); - }); - - it('Should display max button on asset quantity input focus', async () => { - await checkIfVisible('selected-asset-quantity-field-input'); - await waitAndTap('selected-asset-quantity-field-input'); - await checkIfElementByTextIsVisible('Max'); - }); - - it('Should display Insufficient Funds button if exceeds asset balance', async () => { - await checkIfVisible('selected-asset-field-input'); - await waitAndTap('selected-asset-field-input'); - await typeText('selected-asset-field-input', '9999', false); - await checkIfElementByTextIsVisible('Insufficient Funds'); - }); - - it('Should prepend a 0 to quantity field on input of .', async () => { - await waitAndTap('send-asset-form-DAI-mainnet'); - await waitAndTap('send-asset-DAI-mainnet'); - await checkIfVisible('selected-asset-quantity-field-input'); - await waitAndTap('selected-asset-quantity-field-input'); - await typeText('selected-asset-quantity-field-input', '.', true); - await checkIfElementByTextIsVisible('0.'); - }); - - it('Should only show a max of 2 decimals in quantity field', async () => { - await waitAndTap('send-asset-form-DAI-mainnet'); - await waitAndTap('send-asset-ETH-mainnet'); - await checkIfVisible('selected-asset-quantity-field-input'); - await waitAndTap('selected-asset-quantity-field-input'); - await typeText('selected-asset-quantity-field-input', '8.1219', true); - await checkIfElementByTextIsVisible('8.12'); - await waitAndTap('send-asset-form-ETH-mainnet'); - }); - - it('Should display Asset Form after tapping on asset ETH', async () => { - await checkIfVisible('send-asset-ETH-mainnet'); - await waitAndTap('send-asset-ETH-mainnet'); - await checkIfVisible('selected-asset-field-input'); - }); - - it('Should display max button on asset input focus ETH', async () => { - await checkIfVisible('selected-asset-field-input'); - await waitAndTap('selected-asset-field-input'); - await checkIfElementByTextIsVisible('Max'); - }); - - it('Should display max button on asset quantity input focus ETH', async () => { - await checkIfVisible('selected-asset-quantity-field-input'); - await waitAndTap('selected-asset-quantity-field-input'); - await checkIfElementByTextIsVisible('Max'); - }); - - it('Should display Insufficient Funds button if exceeds asset balance ETH', async () => { - await checkIfVisible('selected-asset-field-input'); - await waitAndTap('selected-asset-field-input'); - await typeText('selected-asset-field-input', '9999', true); - await checkIfElementByTextIsVisible('Insufficient Funds'); - }); - - it('Should prepend a 0 to quantity field on input of . ETH', async () => { - await waitAndTap('send-asset-form-ETH-mainnet'); - await waitAndTap('send-asset-ETH-mainnet'); - await checkIfVisible('selected-asset-quantity-field-input'); - await waitAndTap('selected-asset-quantity-field-input'); - await typeText('selected-asset-quantity-field-input', '.', true); - await checkIfElementByTextIsVisible('0.'); - }); - - it('Should only show a max of 2 decimals in quantity field ETH', async () => { - await waitAndTap('send-asset-form-ETH-mainnet'); - await waitAndTap('send-asset-ETH-mainnet'); - await checkIfVisible('selected-asset-quantity-field-input'); - await waitAndTap('selected-asset-quantity-field-input'); - await typeText('selected-asset-quantity-field-input', '8.1219', true); - await checkIfElementByTextIsVisible('8.12'); - await waitAndTap('send-asset-form-ETH-mainnet'); - }); -}); diff --git a/e2e/Disabled/swapSheetFlow1.disabled.js b/e2e/Disabled/swapSheetFlow1.disabled.js deleted file mode 100644 index afb1aec1841..00000000000 --- a/e2e/Disabled/swapSheetFlow1.disabled.js +++ /dev/null @@ -1,341 +0,0 @@ -import * as Helpers from '../helpers'; -import { device } from 'detox'; - -const ios = device.getPlatform() === 'ios'; -const android = device.getPlatform() === 'android'; - -// all relevant flows skipped at the moment -// removing this test from the flow until we fix - -describe.skip('Swap Sheet Interaction Flow', () => { - beforeAll(async () => { - await Helpers.startHardhat(); - }); - afterAll(async () => { - await device.clearKeychain(); - await Helpers.killHardhat(); - }); - - it('Import a wallet and go to welcome', async () => { - await Helpers.importWalletFlow(); - }); - - it('Should send ETH to test wallet"', async () => { - await Helpers.sendETHtoTestWallet(); - }); - - it('Should show Hardhat Toast after pressing Connect To Hardhat', async () => { - await Helpers.delayTime('very-long'); - await Helpers.waitAndTap('dev-button-hardhat'); - await Helpers.checkIfVisible('testnet-toast-Hardhat'); - }); - - // FIXME: Mainnet DAI doesn't show up in the swap search results - // This might be related to @Jin's latest work on changes to hardhat as - // part of the addy's REST API migration - // - // marking the test as SKIP for now - it('Should go to swap and open review sheet on mainnet swap', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('exchange-modal-input-max'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.delay(ios ? 2000 : 5000); - await Helpers.checkIfVisible('exchange-modal-confirm-button'); - await Helpers.waitAndTap('exchange-modal-confirm-button'); - await Helpers.checkIfVisible('swaps-details-value-row'); - await Helpers.checkIfVisible('swaps-details-fee-row'); - await Helpers.waitAndTap('swaps-details-show-details-button'); - await Helpers.checkIfVisible('swaps-details-price-row'); - await Helpers.swipe(ios ? 'swap-details-sheet' : 'swap-details-header', 'down', 'fast'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: This test doesn't clear the "currency-select-search-input" when - // coming back from exchange modal and then fails to actually tap the review - // button - it('Should go to swap and open review sheet on optimism swap', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'OP', true); - await Helpers.tap('currency-select-list-exchange-coin-row-OP-optimism'); - await Helpers.waitAndTap('exchange-modal-input-max'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.typeText('currency-select-search-input', 'ETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-optimism'); - await Helpers.delay(ios ? 2000 : 5000); - await Helpers.checkIfVisible('exchange-modal-confirm-button'); - await Helpers.waitAndTap('exchange-modal-confirm-button'); - await Helpers.checkIfVisible('swaps-details-value-row'); - await Helpers.checkIfVisible('swaps-details-fee-row'); - await Helpers.waitAndTap('swaps-details-show-details-button'); - await Helpers.checkIfVisible('swaps-details-price-row'); - await Helpers.swipe(ios ? 'swap-details-sheet' : 'swap-details-header', 'down', 'fast'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: This test doesn't clear the "currency-select-search-input" when - // coming back from exchange modal and then fails to actually tap the review - // button - it('Should go to swap and open review sheet on polygon swap', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-polygon'); - await Helpers.waitAndTap('exchange-modal-input-max'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.typeText('currency-select-search-input', 'WETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-WETH-polygon'); - await Helpers.delay(ios ? 2000 : 5000); - await Helpers.checkIfVisible('exchange-modal-confirm-button'); - await Helpers.waitAndTap('exchange-modal-confirm-button'); - await Helpers.checkIfVisible('swaps-details-value-row'); - await Helpers.checkIfVisible('swaps-details-fee-row'); - await Helpers.waitAndTap('swaps-details-show-details-button'); - await Helpers.checkIfVisible('swaps-details-price-row'); - await Helpers.swipe(ios ? 'swap-details-sheet' : 'swap-details-header', 'down', 'fast'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: This test doesn't clear the "currency-select-search-input" when - // coming back from exchange modal and then fails to actually tap the review - // button - it('Should go to swap and open review sheet on arbitrum swap', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-arbitrum'); - await Helpers.waitAndTap('exchange-modal-input-max'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.typeText('currency-select-search-input', 'ETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-arbitrum'); - await Helpers.delay(ios ? 2000 : 5000); - await Helpers.checkIfVisible('exchange-modal-confirm-button'); - await Helpers.waitAndTap('exchange-modal-confirm-button'); - await Helpers.checkIfVisible('swaps-details-value-row'); - await Helpers.checkIfVisible('swaps-details-fee-row'); - await Helpers.waitAndTap('swaps-details-show-details-button'); - await Helpers.checkIfVisible('swaps-details-price-row'); - await Helpers.swipe(ios ? 'swap-details-sheet' : 'swap-details-header', 'down', 'fast'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should display currency selection screen on swap-button press', async () => { - await Helpers.checkIfVisible('wallet-screen'); - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should toggle through token networks and show the respective tokens', async () => { - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.checkIfVisible('network-switcher-1'); - await Helpers.waitAndTap('network-switcher-item-optimism'); - await Helpers.checkIfVisible('network-switcher-10'); - await Helpers.waitAndTap('network-switcher-item-arbitrum'); - await Helpers.checkIfVisible('network-switcher-42161'); - await Helpers.waitAndTap('currency-select-header-back-button'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.checkIfVisible('network-switcher-1'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should update input value after tapping Max Button', async () => { - await Helpers.typeText('currency-select-search-input', 'BAT', true); - await Helpers.tap('currency-select-list-exchange-coin-row-BAT-mainnet'); - await Helpers.delay(ios ? 2000 : 5000); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.waitAndTap('exchange-modal-input-max'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should display Swap Asset List after tapping Input Section Button', async () => { - await Helpers.waitAndTap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - if (android) { - await device.pressBack(); - await device.pressBack(); - } else { - await Helpers.waitAndTap('currency-select-header-back-button'); - } - }); - - // FIXME: Dependent on a state from the previous test - it('Should reset all fields on selection of new input currency', async () => { - await Helpers.waitAndTap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should change Currency Select List on search entry', async () => { - await Helpers.waitAndTap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'SOCKS\n', true); - await Helpers.checkIfNotVisible('currency-select-list-exchange-coin-row-ETH-mainnet'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should reset Currency Select List on clearing search field', async () => { - await Helpers.clearField('currency-select-search-input'); - await Helpers.checkIfVisible('currency-select-list-exchange-coin-row-ETH-mainnet'); - if (android) { - await device.pressBack(); - await device.pressBack(); - } else { - await Helpers.waitAndTap('currency-select-header-back-button'); - } - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should show Choose Token Button if input & output are same token(ETH)', async () => { - if (!ios) { - // TODO - return; - } - await Helpers.waitAndTap('balance-coin-row-Ethereum'); - await Helpers.waitAndTap('swap-action-button'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfElementHasString('exchange-modal-input-selection-button-text', 'Choose Token'); - await Helpers.tap('exchange-modal-output-selection-button'); - if (android) { - await device.pressBack(); - } else { - await Helpers.waitAndTap('currency-select-header-back-button'); - } - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should clear inputs when typing a number in inputs and then clearing it', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI\n', true); - await Helpers.checkIfVisible('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - - await Helpers.checkIfElementHasString('exchange-modal-input-selection-button-text', 'DAI'); - await Helpers.checkIfElementHasString('exchange-modal-output-selection-button-text', 'ETH'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input', '24', true); - await Helpers.clearField('exchange-modal-input-24'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.typeText('exchange-modal-output', '24', true); - await Helpers.clearField('exchange-modal-output-24'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input-native', '24', true); - await Helpers.clearField('exchange-modal-input-native-24'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should clear inputs when typing a number in inputs and then clearing it optimism', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'ETH\n', true); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-optimism'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('network-switcher-10'); - await Helpers.tap('currency-select-list-exchange-coin-row-OP-optimism'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input', '24', false); - await Helpers.clearField('exchange-modal-input-24'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.typeText('exchange-modal-output', '24', false); - await Helpers.clearField('exchange-modal-output-24'); - await Helpers.checkIfVisible('exchange-modal-input'); - if (ios) { - await Helpers.checkForElementByLabel('Enter an Amount'); - } - await Helpers.typeText('exchange-modal-input-native', '24', false); - await Helpers.clearField('exchange-modal-input-native-24'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfVisible('exchange-modal-output'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should show settings routes picker but not flashbots on Optimism', async () => { - await Helpers.waitAndTap('exchange-settings-button'); - await Helpers.checkIfVisible('swap-settings-header'); - await Helpers.checkIfVisible('swap-settings-routes-label'); - await Helpers.checkIfNotVisible('swap-settings-flashbots-label'); - await Helpers.swipe('swap-settings-header', 'down', 'fast'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should clear inputs when typing a number in inputs and then clearing it arbitrum', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'ETH\n', true); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-arbitrum'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('network-switcher-42161'); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-arbitrum'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input', '24\n', false); - await Helpers.clearField('exchange-modal-input-24'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.typeText('exchange-modal-input-native', '24\n', false); - await Helpers.clearField('exchange-modal-input-native-24'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should clear inputs when typing a number in inputs and then clearing it polygon', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'WETH', true); - await Helpers.tap('currency-select-list-exchange-coin-row-WETH-polygon'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('network-switcher-137'); - await Helpers.tap('currency-select-list-exchange-coin-row-MATIC-polygon'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input', '24', false); - await Helpers.clearField('exchange-modal-input-24'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.typeText('exchange-modal-output', '24', false); - await Helpers.clearField('exchange-modal-output-24'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.typeText('exchange-modal-input-native', '24', false); - await Helpers.clearField('exchange-modal-input-native-24'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfVisible('exchange-modal-output'); - }); - - // FIXME: Dependent on a state from the previous test - it('Should show settings routes picker but notflashbots on Polygon', async () => { - await Helpers.waitAndTap('exchange-settings-button'); - await Helpers.checkIfVisible('swap-settings-header'); - await Helpers.checkIfVisible('swap-settings-routes-label'); - await Helpers.checkIfNotVisible('swap-settings-flashbots-label'); - await Helpers.swipe('swap-settings-header', 'down', 'fast'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); -}); diff --git a/e2e/Disabled/swapSheetFlow2.disabled.js b/e2e/Disabled/swapSheetFlow2.disabled.js deleted file mode 100644 index 0a86a585faa..00000000000 --- a/e2e/Disabled/swapSheetFlow2.disabled.js +++ /dev/null @@ -1,479 +0,0 @@ -import * as Helpers from '../helpers'; -import { device } from 'detox'; - -beforeAll(async () => { - await Helpers.startHardhat(); -}); - -const ios = device.getPlatform() === 'ios'; -const android = device.getPlatform() === 'android'; - -// FIXME: Mainnet DAI doesn't show up in the swap search results -// This might be related to @Jin's latest work on changes to hardhat as -// part of the addy's REST API migration -// -// marking the test as SKIP for now -describe.skip('Swap Sheet Interaction Flow', () => { - it('Should show the welcome screen', async () => { - await Helpers.checkIfVisible('welcome-screen'); - }); - - it('Should show the "Add Wallet Sheet" after tapping on "I already have a wallet"', async () => { - await Helpers.waitAndTap('already-have-wallet-button'); - await Helpers.checkIfExists('add-wallet-sheet'); - }); - - it('show the "Import Sheet" when tapping on "Restore with a recovery phrase or private key"', async () => { - await Helpers.waitAndTap('restore-with-key-button'); - await Helpers.checkIfExists('import-sheet'); - }); - - it('Should show the "Add wallet modal" after tapping import with a valid seed"', async () => { - await Helpers.clearField('import-sheet-input'); - await Helpers.typeText('import-sheet-input', process.env.TEST_SEEDS, false); - await Helpers.checkIfElementHasString('import-sheet-button-label', 'Continue'); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.checkIfVisible('wallet-info-modal'); - }); - - it('Should navigate to the Wallet screen after tapping on "Import Wallet"', async () => { - await Helpers.disableSynchronization(); - await Helpers.waitAndTap('wallet-info-submit-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - // Set the pin - await Helpers.authenticatePin('1234'); - // Confirm it - await Helpers.authenticatePin('1234'); - } - await Helpers.checkIfVisible('wallet-screen', 40000); - await Helpers.enableSynchronization(); - }); - - it('Should send ETH to test wallet"', async () => { - await Helpers.sendETHtoTestWallet(); - }); - - it('Should show Hardhat Toast after pressing Connect To Hardhat', async () => { - // need to wait for balances to be fetched - await Helpers.delay(10000); - await Helpers.waitAndTap('dev-button-hardhat'); - await Helpers.checkIfVisible('testnet-toast-Hardhat'); - }); - - it('Should connect to hardhat', async () => { - await Helpers.swipe('wallet-screen', 'right', 'slow'); - await Helpers.checkIfVisible('profile-screen'); - await Helpers.waitAndTap('settings-button'); - await Helpers.checkIfVisible('settings-sheet'); - await Helpers.scrollTo('settings-menu-container', 'bottom'); - await Helpers.waitAndTap('developer-section'); - await Helpers.swipeUntilVisible('alert-section', 'developer-settings-sheet', 'up'); - await Helpers.waitAndTap('hardhat-section'); - await Helpers.checkIfVisible('testnet-toast-Hardhat'); - await Helpers.swipe('profile-screen', 'left', 'slow'); - }); - - it('Should go to swap and try different cross chain swaps', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('exchange-modal-input-max'); - await Helpers.checkIfVisible(`exchange-modal-input-DAI-mainnet`); - await Helpers.checkIfVisible(`exchange-modal-output-empty-empty`); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.tap('network-switcher-item-optimism'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-optimism'); - await Helpers.checkIfVisible(`exchange-modal-input-DAI-mainnet`); - await Helpers.checkIfVisible(`exchange-modal-output-DAI-optimism`); - - await Helpers.swipe('exchange-modal-notch', 'down', 'slow'); - }); - - it('Should show explainer sheet when selecting output input for cross chain swaps', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.typeText('currency-select-search-input', 'DAI', true); - await Helpers.tap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('exchange-modal-input-max'); - await Helpers.checkIfVisible(`exchange-modal-input-DAI-mainnet`); - await Helpers.checkIfVisible(`exchange-modal-output-empty-empty`); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.tap('network-switcher-item-optimism'); - await Helpers.typeText('currency-select-search-input', 'USDC', true); - await Helpers.tap('currency-select-list-exchange-coin-row-USDC-optimism'); - await Helpers.checkIfVisible(`exchange-modal-input-DAI-mainnet`); - await Helpers.checkIfVisible(`exchange-modal-output-USDC-optimism`); - await Helpers.waitAndTap('exchange-modal-output-USDC-optimism'); - await Helpers.waitAndTap('explainer-sheet-accent-action-button'); - await Helpers.tapAndLongPress('exchange-modal-confirm-button'); - await Helpers.checkIfVisible('swaps-details-value-row'); - await Helpers.checkIfNotVisible('swaps-details-refuel-row'); - await Helpers.waitAndTap('swaps-details-protocols-row'); - await Helpers.waitAndTap('swaps-details-protocols-row'); - await Helpers.checkIfVisible('swaps-details-fee-row'); - await Helpers.swipe('swap-details-header', 'down', 'slow'); - await Helpers.swipe('exchange-modal-notch', 'down', 'slow'); - }); - - it('Should swap input & output and clear form on ETH -> ERC20 when selecting ETH as output', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI\n', true); - await Helpers.checkIfVisible('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfElementHasString('exchange-modal-input-selection-button-text', 'DAI'); - await Helpers.checkIfElementHasString('exchange-modal-output-selection-button-text', 'ETH'); - await Helpers.swipe('exchange-modal-notch', 'down', 'slow'); - }); - - it('Should swap input & output and clear form on ETH -> ERC20 when selecting ERC20 as input', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI\n', true); - await Helpers.checkIfVisible('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.checkIfElementHasString('exchange-modal-input-selection-button-text', 'DAI'); - await Helpers.checkIfElementHasString('exchange-modal-output-selection-button-text', 'ETH'); - await Helpers.delay(4000); - }); - - it('Should display Enter an Amount Button once input & output currencies are selected', async () => { - if (ios) { - // TODO - await Helpers.checkForElementByLabel('Enter an Amount'); - } - await Helpers.swipe('exchange-modal-notch', 'down', 'slow'); - }); - - it('Should update native input & output after input field change', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'ZRX\n', false); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ZRX-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input-native'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.typeText('exchange-modal-input', '0.246\n', false); - await Helpers.checkIfVisible('exchange-modal-input-0.246'); - await Helpers.checkIfNotVisible('exchange-modal-input-native'); - if (ios) { - // TODO - await Helpers.checkIfNotVisible('exchange-modal-output'); - } - await Helpers.swipe('exchange-modal-notch', 'down', 'slow'); - }); - - it('Should update input & output after native input field change', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'ZRX', false); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ZRX-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.typeText('exchange-modal-input-native', '0.246', false); - await Helpers.checkIfVisible('exchange-modal-input-native-0.24'); - if (ios) { - // TODO - await Helpers.checkIfNotVisible('exchange-modal-input'); - await Helpers.checkIfNotVisible('exchange-modal-output'); - } - await Helpers.swipe('exchange-modal-notch', 'down', 'slow'); - }); - - it('Should update input & output after native input field change and output DAI', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI', false); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfVisible('exchange-modal-output'); - await Helpers.typeText('exchange-modal-input-native', '246', false); - await Helpers.checkIfVisible('exchange-modal-input-native-246'); - if (ios) { - // TODO - await Helpers.checkIfNotVisible('exchange-modal-input'); - await Helpers.checkIfNotVisible('exchange-modal-output'); - } - }); - - it('Should show Hold to Swap Button & Swap Info Button on completion of all input fields', async () => { - await Helpers.checkIfVisible('exchange-modal-confirm-button'); - await Helpers.checkIfVisible('exchange-settings-button'); - }); - - it('Should show Swap Settings State on Settings Button press', async () => { - await Helpers.waitAndTap('exchange-settings-button'); - await Helpers.checkIfVisible('swap-settings-header'); - }); - - it('Should show and toggle swap routes on Mainnet', async () => { - await Helpers.waitAndTap('swap-settings-routes-label'); - await Helpers.checkIfVisible('explain-sheet-routeSwaps'); - await Helpers.swipe('explain-sheet-routeSwaps', 'down', 'fast'); - await Helpers.waitAndTap('swap-settings-routes-current-rainbow'); - await Helpers.tapByText('0x'); - await Helpers.checkIfVisible('swap-settings-routes-current-0x'); - }); - - // skipping until flashbots is enabled again after the merge - it.skip('Should show and toggle flashbots on Mainnet', async () => { - await Helpers.waitAndTap('swap-settings-flashbots-switch-false'); - await Helpers.checkIfVisible('swap-settings-flashbots-switch-true'); - await Helpers.waitAndTap('swap-settings-flashbots-label'); - // await Helpers.checkIfVisible('explain-sheet-flashbots'); - await Helpers.swipe('explain-sheet-flashbots', 'down', 'fast'); - }); - - it('Should show and update slippage on Mainnet', async () => { - if (ios) { - // TODO - await Helpers.clearField('swap-slippage-input-2'); - await Helpers.typeText('swap-slippage-input-', '10', false); - await Helpers.checkIfVisible('swap-slippage-input-10'); - await Helpers.waitAndTap('swap-slippage-label'); - await Helpers.checkIfVisible('explain-sheet-slippage'); - await Helpers.swipe('explain-sheet-slippage', 'down', 'fast'); - } - }); - - it('Should restore swap setting defaults on Mainnet', async () => { - await Helpers.waitAndTap('swap-settings-defaults-button'); - await Helpers.checkIfVisible('swap-settings-routes-current-rainbow'); - // restore after merge etc. - // await Helpers.checkIfVisible('swap-settings-flashbots-switch-false'); - if (ios) { - // TODO - await Helpers.checkIfVisible('swap-slippage-input-2'); - } - - await Helpers.swipe('swap-settings-header', 'down', 'fast'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - it('Should update input & native input after output field change', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'ZRX', false); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ZRX-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.checkIfVisible('exchange-modal-input-native'); - await Helpers.typeText('exchange-modal-output', '0.246', false); - await Helpers.checkIfVisible('exchange-modal-output-0.246'); - if (ios) { - // TODO - await Helpers.checkIfNotVisible('exchange-modal-input'); - await Helpers.checkIfNotVisible('exchange-modal-input-native'); - } - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - it('Should show Insufficient Funds on input greater than balance', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'ZRX', false); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ZRX-mainnet'); - if (ios) { - // TODO - await Helpers.typeText('exchange-modal-input', '500000000000', false); - await Helpers.checkForElementByLabel('Insufficient Funds'); - } - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - it('Should prepend 0. to input field on typing .', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI\n', true); - await Helpers.checkIfVisible('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.typeText('exchange-modal-input', '.', false); - await Helpers.checkIfVisible('exchange-modal-input-0.'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - it('Should prepend 0. to native input field on typing .', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI\n', true); - await Helpers.checkIfVisible('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.typeText('exchange-modal-input-native', '.', false); - await Helpers.checkIfVisible('exchange-modal-input-native-0.'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - it('Should prepend 0. to output field on typing .', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'DAI\n', true); - await Helpers.checkIfVisible('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-DAI-mainnet'); - await Helpers.typeText('exchange-modal-output', '.', false); - await Helpers.checkIfVisible('exchange-modal-output-0.'); - await Helpers.swipe('exchange-modal-notch', 'down', 'fast'); - }); - - it('Should display Gas Button on Fast by default', async () => { - await Helpers.waitAndTap('swap-button'); - await Helpers.tap('exchange-modal-input-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.tap('currency-select-list-exchange-coin-row-ETH-mainnet'); - await Helpers.checkIfVisible('exchange-modal-input'); - await Helpers.tap('exchange-modal-output-selection-button'); - await Helpers.checkIfVisible('currency-select-list'); - await Helpers.typeText('currency-select-search-input', 'ZRX\n', false); - await Helpers.waitAndTap('currency-select-list-exchange-coin-row-ZRX-mainnet'); - await Helpers.checkIfVisible('exchange-modal-gas'); - await Helpers.checkIfElementByTextIsVisible('Fast'); - }); - - it('Should display warning on invalid custom gas price', async () => { - await Helpers.waitAndTap('gas-speed-custom'); - await Helpers.checkIfVisible('speed-pill-fast'); - await Helpers.checkIfVisible('speed-pill-custom'); - await Helpers.clearField('max-base-fee-input'); - await Helpers.typeText('max-base-fee-input', '\n', false); - if (ios) { - // TODO - await Helpers.checkIfElementByTextIsVisible('Low · likely to fail'); - } - }); - - it('Should rotate between Normal, Fast, Urgent, & Custom', async () => { - await Helpers.waitAndTap('speed-pill-fast'); - await Helpers.waitAndTap('speed-pill-urgent'); - await Helpers.waitAndTap('speed-pill-custom'); - await Helpers.waitAndTap('speed-pill-normal'); - }); - - it.skip('Should display warning on high custom base fee price', async () => { - await Helpers.clearField('max-base-fee-input'); - await Helpers.typeText('max-base-fee-input', '9999\n', false); - await Helpers.checkIfElementByTextToExist('High · overpaying'); - await Helpers.waitAndTap('speed-pill-normal'); - }); - - it.skip('Should display alert on high custom base fee price', async () => { - await Helpers.waitAndTap('speed-pill-custom'); - await Helpers.waitAndTap('gas-speed-done-button'); - await Helpers.checkIfElementByTextToExist('High max base fee!'); - await Helpers.tapByText('Edit Max Base Fee'); - await Helpers.waitAndTap('speed-pill-normal'); - await Helpers.clearField('max-base-fee-input'); - await Helpers.typeText('max-base-fee-input', `200\n`, false); - await Helpers.waitAndTap('speed-pill-normal'); - }); - - it('Should display warning on low custom base fee price', async () => { - await Helpers.clearField('max-base-fee-input'); - await Helpers.typeText('max-base-fee-input', '1\n', false); - await Helpers.checkIfElementByTextToExist('Low · likely to fail'); - }); - - it('Should display alert on low custom base fee price', async () => { - await Helpers.waitAndTap('gas-speed-done-button'); - await Helpers.checkIfElementByTextToExist('Low max base fee–transaction may get stuck!'); - await Helpers.tapByText('Edit Max Base Fee'); - await Helpers.clearField('max-base-fee-input'); - await Helpers.typeText('max-base-fee-input', '200\n', false); - }); - - it.skip('Should display warning on high custom priority fee price', async () => { - await Helpers.clearField('max-priority-fee-input'); - await Helpers.typeText('max-priority-fee-input', '999\n', false); - await Helpers.checkIfElementByTextToExist('High · overpaying'); - await Helpers.waitAndTap('speed-pill-normal'); - }); - - it.skip('Should display alert on high custom priority fee price', async () => { - await Helpers.waitAndTap('speed-pill-custom'); - await Helpers.waitAndTap('gas-speed-done-button'); - await Helpers.checkIfElementByTextToExist('High miner tip!'); - await Helpers.tapByText('Edit Miner Tip'); - await Helpers.waitAndTap('speed-pill-normal'); - await Helpers.clearField('max-base-fee-input'); - await Helpers.typeText('max-base-fee-input', '200\n', false); - await Helpers.clearField('max-priority-fee-input'); - await Helpers.typeText('max-priority-fee-input', `2\n`, false); - await Helpers.waitAndTap('speed-pill-normal'); - }); - - it.skip('Should display warning on low custom priority fee price', async () => { - await Helpers.clearField('max-base-fee-input'); - await Helpers.typeText('max-base-fee-input', '200\n', false); - await Helpers.clearField('max-priority-fee-input'); - await Helpers.typeText('max-priority-fee-input', '0.01\n', false); - await Helpers.checkIfElementByTextToExist('Low · likely to fail'); - }); - - it.skip('Should display alert on low custom priority fee price', async () => { - await Helpers.swipe('custom-gas-header', 'down', 'fast'); - await Helpers.checkIfElementByTextToExist('Low miner tip–transaction may get stuck!'); - await Helpers.tapByText('Edit Miner Tip'); - await Helpers.clearField('max-priority-fee-input'); - await Helpers.typeText('max-priority-fee-input', '2\n', false); - }); - - afterAll(async () => { - // Reset the app state - await device.clearKeychain(); - await Helpers.killHardhat(); - }); -}); diff --git a/e2e/Disabled/walletAvatarOptions.disabled.js b/e2e/Disabled/walletAvatarOptions.disabled.js deleted file mode 100644 index f6720fcf9b5..00000000000 --- a/e2e/Disabled/walletAvatarOptions.disabled.js +++ /dev/null @@ -1,163 +0,0 @@ -import * as Helpers from '../helpers'; -import { device, element, by } from 'detox'; - -const WALLET_AVATAR_COORDS = { x: 210, y: 125 }; -const WALLET_ADDRESS_COORDS = { x: 210, y: 185 }; -const PROFILE_AVATAR_COORDS = { x: 210, y: 125 }; -const PROFILE_ADDRESS_COORDS = { x: 210, y: 185 }; -const DISMISS_AVATAR_BUILDER_COORDS = { x: 20, y: 90 }; -const RAINBOW_TEST_WALLET = 'rainbowtestwallet.eth'; -const RAINBOW_WALLET = 'rainbowwallet.eth'; -const EMPTY_WALLET = '0x6791da9CCd95405e73d6a1117d02Dc81c4E58775'; - -const android = device.getPlatform() === 'android'; - -describe('Wallet avatar options', () => { - it('watch wallet without ENS', async () => { - await Helpers.checkIfVisible('welcome-screen'); - await Helpers.waitAndTap('already-have-wallet-button'); - await Helpers.waitAndTap('watch-address-button'); - await Helpers.typeText('import-sheet-input', EMPTY_WALLET, false); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.waitAndTap('wallet-info-submit-button'); - await Helpers.checkIfVisible('wallet-screen', 40000); - await Helpers.swipe('wallet-screen', 'left', 'slow'); - await Helpers.swipe('discover-home', 'left', 'slow'); - await Helpers.checkIfVisible('profile-screen', 40000); - }); - - it('test watched wallet without ENS', async () => { - // TODO: verify that wallet address matches the EMPTY_WALLET. - - await Helpers.tapAtPoint('profile-screen', WALLET_AVATAR_COORDS); - await Helpers.checkIfExistsByText('Choose from Library'); - - if (android) { - await Helpers.checkIfExistsByText('Shuffle Emoji'); - await element(by.text('Shuffle Emoji')).tap(); - } else { - await Helpers.checkIfExistsByText('Pick an Emoji'); - await Helpers.tapByText('Pick an Emoji'); - await Helpers.checkIfVisible('avatar-builder'); - await Helpers.tapAtPoint('avatar-builder', DISMISS_AVATAR_BUILDER_COORDS); - } - }); - - it('import wallet without ENS', async () => { - await Helpers.tapAtPoint('profile-screen', WALLET_ADDRESS_COORDS); - await Helpers.waitAndTap('add-another-wallet-button'); - await Helpers.waitAndTap('create-new-button'); - await Helpers.waitAndTap('wallet-info-submit-button'); - if (android) { - await Helpers.checkIfVisible('pin-authentication-screen'); - await Helpers.authenticatePin('1234'); - await Helpers.authenticatePin('1234'); - } - // Remove this once https://github.com/rainbow-me/rainbow/pull/4115 is merged. - await Helpers.relaunchApp(); - await Helpers.swipe('wallet-screen', 'left', 'slow'); - await Helpers.swipe('discover-home', 'left', 'slow'); - await Helpers.checkIfVisible('profile-screen', 40000); - - // TODO: check that wallet has different address (otherwise it means that creating wallet failed!). - }); - - it('test imported wallet without ENS', async () => { - await Helpers.tapAtPoint('profile-screen', WALLET_AVATAR_COORDS); - await Helpers.checkIfExistsByText('Choose from Library'); - if (android) { - await Helpers.checkIfExistsByText('Shuffle Emoji'); - await element(by.text('Shuffle Emoji')).tap(); - } else { - await Helpers.checkIfExistsByText('Pick an Emoji'); - await Helpers.tapByText('Pick an Emoji'); - await Helpers.tapAtPoint('avatar-builder', DISMISS_AVATAR_BUILDER_COORDS); - } - }); - - it('watch wallet with ENS but without ENS avatar', async () => { - await Helpers.tapAtPoint('profile-screen', WALLET_ADDRESS_COORDS); - await Helpers.waitAndTap('add-another-wallet-button'); - await Helpers.waitAndTap('watch-address-button'); - await Helpers.typeText('import-sheet-input', RAINBOW_TEST_WALLET, false); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.waitAndTap('wallet-info-submit-button'); - await Helpers.relaunchApp(); - }); - - it('test watched wallet with ens but without ens avatar', async () => { - await Helpers.tapAtPoint('wallet-screen', PROFILE_AVATAR_COORDS); - await Helpers.checkIfExistsByText('Choose from Library'); - if (android) { - await Helpers.checkIfExistsByText('Shuffle Emoji'); - } else { - await Helpers.checkIfExistsByText('Pick an Emoji'); - } - await Helpers.checkIfExistsByText('View Profile'); - if (!android) { - await Helpers.tapByText('Pick an Emoji'); - await Helpers.checkIfVisible('avatar-builder'); - await Helpers.tapAtPoint('avatar-builder', DISMISS_AVATAR_BUILDER_COORDS); - await Helpers.tapAtPoint('wallet-screen', PROFILE_AVATAR_COORDS); - } - await Helpers.tapByText('View Profile'); - await Helpers.checkIfVisible('profile-sheet'); - await Helpers.swipe('profile-sheet', 'down', 'slow'); - }); - - it('import wallet with ens but without ens avatar', async () => { - await Helpers.tapAtPoint('wallet-screen', PROFILE_ADDRESS_COORDS); - await Helpers.waitAndTap('add-another-wallet-button'); - await Helpers.waitAndTap('restore-with-key-button'); - await Helpers.typeText('import-sheet-input', process.env.TEST_SEEDS, false); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.waitAndTap('wallet-info-submit-button'); - await Helpers.relaunchApp(); - }); - - it('test imported wallet with ens but without ens avatar', async () => { - await Helpers.tapAtPoint('wallet-screen', PROFILE_AVATAR_COORDS); - await Helpers.checkIfExistsByText('Choose from Library'); - if (android) { - await Helpers.checkIfExistsByText('Shuffle Emoji'); - } else { - await Helpers.checkIfExistsByText('Pick an Emoji'); - } - await Helpers.checkIfExistsByText('View Profile'); - await Helpers.checkIfExistsByText('Edit Profile'); - if (!android) { - await Helpers.tapByText('Pick an Emoji'); - await Helpers.checkIfVisible('avatar-builder'); - await Helpers.tapAtPoint('avatar-builder', DISMISS_AVATAR_BUILDER_COORDS); - await Helpers.tapAtPoint('wallet-screen', PROFILE_AVATAR_COORDS); - } - await Helpers.tapByText('View Profile'); - await Helpers.checkIfVisible('profile-sheet'); - await Helpers.waitAndSwipe('profile-sheet', 'down'); - await Helpers.tapAtPoint('wallet-screen', PROFILE_AVATAR_COORDS); - await Helpers.tapByText('Edit Profile'); - await Helpers.checkIfExists('ens-edit-records-sheet'); - await Helpers.swipe('ens-edit-records-sheet', 'down', 'slow'); - }); - - it('import wallet with ens avatar', async () => { - await Helpers.tapAtPoint('wallet-screen', PROFILE_ADDRESS_COORDS); - await Helpers.waitAndTap('add-another-wallet-button'); - await Helpers.waitAndTap('watch-address-button'); - await Helpers.typeText('import-sheet-input', RAINBOW_WALLET, false); - await Helpers.waitAndTap('import-sheet-button'); - await Helpers.waitAndTap('wallet-info-submit-button'); - await Helpers.relaunchApp(); - }); - - it('test watched wallet with ens avatar', async () => { - await Helpers.tapAtPoint('wallet-screen', PROFILE_AVATAR_COORDS); - await Helpers.checkIfVisible('profile-sheet'); - }); - - // missing case: imported wallet with ENS avatar - - afterAll(async () => { - await device.clearKeychain(); - }); -}); diff --git a/e2e/helpers.ts b/e2e/helpers.ts index 55344f6052c..69cdde81e99 100644 --- a/e2e/helpers.ts +++ b/e2e/helpers.ts @@ -5,7 +5,7 @@ import { Wallet } from '@ethersproject/wallet'; import { expect, device, element, by, waitFor } from 'detox'; import { parseEther } from '@ethersproject/units'; -const TESTING_WALLET = '0x3Cb462CDC5F809aeD0558FBEe151eD5dC3D3f608'; +const TESTING_WALLET = '0x3637f053D542E6D00Eee42D656dD7C59Fa33a62F'; const DEFAULT_TIMEOUT = 20_000; const android = device.getPlatform() === 'android'; @@ -59,6 +59,7 @@ export async function beforeAllcleanApp({ hardhat }: { hardhat?: boolean }) { export async function afterAllcleanApp({ hardhat }: { hardhat?: boolean }) { await device.clearKeychain(); hardhat && (await killHardhat()); + jest.resetAllMocks(); } export async function tap(elementId: string | RegExp) { diff --git a/e2e/init.js b/e2e/init.js index a6d016ad6b6..234eef3d4ca 100644 --- a/e2e/init.js +++ b/e2e/init.js @@ -4,6 +4,8 @@ import { device } from 'detox'; require('dotenv').config({ path: '.env' }); +// jest.mock('src/__swaps__/utils/swap.ts', () => require('./mocks/worklets.mock.js')); + beforeAll(async () => { if (device.getPlatform() === 'android') { // connecting to metro diff --git a/e2e/jest.e2e.config.js b/e2e/jest.e2e.config.js index cdd8d0519cd..dfdf939e292 100644 --- a/e2e/jest.e2e.config.js +++ b/e2e/jest.e2e.config.js @@ -1,24 +1,7 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */ -const { pathsToModuleNameMapper } = require('ts-jest'); -const { compilerOptions } = require('../tsconfig'); +const baseConfig = require('../jest.config'); +/** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { - setupFilesAfterEnv: ['./init.js'], - testEnvironment: './environment', - - globalSetup: 'detox/runners/jest/globalSetup', - globalTeardown: 'detox/runners/jest/globalTeardown', - reporters: ['detox/runners/jest/reporter'], - - testTimeout: 300_000, - testRegex: '\\.spec\\.[jt]sx?$', - verbose: false, - transform: { - '\\.[jt]sx?$': 'ts-jest', - }, - moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { - prefix: '../', - }), - setupFiles: ['dotenv/config'], + ...baseConfig, + testMatch: ['/**/*.spec.ts'], }; diff --git a/jest.config.js b/jest.config.js index bbaecbd2a99..c82393941e5 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,24 +1,25 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -const { pathsToModuleNameMapper } = require('ts-jest'); -const { compilerOptions } = require('./tsconfig'); - +/** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { - preset: 'react-native', - setupFiles: ['./config/test/jest-setup.js'], - testPathIgnorePatterns: ['node_modules', 'e2e'], - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.jest.json', - }, - }, + preset: 'ts-jest', transform: { - // https://kulshekhar.github.io/ts-jest/docs/28.0/guides/react-native - '\\.tsx?$': 'ts-jest', + '^.+\\.tsx?$': 'ts-jest', + '^.+\\.jsx?$': 'ts-jest', + '^.+\\.js$': 'ts-jest', + }, + testEnvironment: 'node', + testTimeout: 120_000, + maxWorkers: 1, + globalSetup: 'detox/runners/jest/globalSetup', + globalTeardown: 'detox/runners/jest/globalTeardown', + reporters: ['detox/runners/jest/reporter'], + testEnvironment: 'detox/runners/jest/testEnvironment', + verbose: true, + moduleNameMapper: { + '^@/__swaps__/(.*)$': '/../src/__swaps__/$1', + '^@/(.*)$': '/../src/$1', }, + setupFiles: ['dotenv/config'], transformIgnorePatterns: [ 'node_modules/(?!((jest-)?react-native|react-native-keyboard-area|imgix-core-js|react-native-payments|@react-native-firebase|@react-native(-community)?)/)', ], - moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { - prefix: '', - }), }; diff --git a/package.json b/package.json index fee4475140a..1d8f601ab67 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,9 @@ "nuke": "./scripts/nuke.sh", "detox:android": "detox build -c android.emu.debug && detox test -c android.emu.debug --loglevel verbose", "detox:android:release": "detox build -c android.emu.release && detox test -c android.emu.release", + "detox:ios:build": "detox build -c ios.sim.debug | xcpretty --color ", "detox:ios:tests": "detox test -c ios.sim.debug --maxWorkers 2 -- --bail 1", - "detox:ios": "detox build -c ios.sim.debug | xcpretty --color && yarn detox:ios:tests", + "detox:ios": "yarn detox:ios:build && yarn detox:ios:tests", "detox:ios:release": "detox build -c ios.sim.release && detox test -c ios.sim.release --maxWorkers 2 -- --bail 1", "ds:install": "yarn install --cwd src/design-system/docs", "ds": "cd src/design-system/docs && yarn dev", diff --git a/src/__swaps__/screens/Swap/components/SearchInput.tsx b/src/__swaps__/screens/Swap/components/SearchInput.tsx index f4d9086bfb6..564b0060f7f 100644 --- a/src/__swaps__/screens/Swap/components/SearchInput.tsx +++ b/src/__swaps__/screens/Swap/components/SearchInput.tsx @@ -136,6 +136,7 @@ export const SearchInput = ({ { diff --git a/src/__swaps__/screens/Swap/components/SwapActionButton.tsx b/src/__swaps__/screens/Swap/components/SwapActionButton.tsx index f447a42eff8..3219599cfc2 100644 --- a/src/__swaps__/screens/Swap/components/SwapActionButton.tsx +++ b/src/__swaps__/screens/Swap/components/SwapActionButton.tsx @@ -108,6 +108,7 @@ export const SwapActionButton = ({ }} > state.associatedWalletAddress); const isSwapsOpen = useSwapsStore(state => state.isSwapsOpen); @@ -18,6 +21,7 @@ export const UserAssetsSync = memo(function UserAssetsSync() { { address: currentAddress as Address, currency: currentCurrency, + testnetMode: connectedToHardhat, }, { enabled: !isSwapsOpen || userAssetsWalletAddress !== currentAddress, @@ -41,4 +45,4 @@ export const UserAssetsSync = memo(function UserAssetsSync() { ); return null; -}); +}; diff --git a/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts b/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts index 13f6d54e02d..d5c6e57f2f8 100644 --- a/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts +++ b/src/__swaps__/screens/Swap/hooks/useAssetsToSell.ts @@ -10,6 +10,7 @@ import { useUserAssets } from '@/__swaps__/screens/Swap/resources/assets'; import { ParsedAssetsDictByChain, ParsedSearchAsset, UserAssetFilter } from '@/__swaps__/types/assets'; import { useAccountSettings, useDebounce } from '@/hooks'; import { userAssetsStore } from '@/state/assets/userAssets'; +import { getCachedProviderForNetwork, isHardHat } from '@/handlers/web3'; const sortBy = (by: UserAssetFilter) => { switch (by) { @@ -21,7 +22,11 @@ const sortBy = (by: UserAssetFilter) => { }; export const useAssetsToSell = () => { - const { accountAddress: currentAddress, nativeCurrency: currentCurrency } = useAccountSettings(); + const { accountAddress: currentAddress, nativeCurrency: currentCurrency, network: currentNetwork } = useAccountSettings(); + + const provider = getCachedProviderForNetwork(currentNetwork); + const providerUrl = provider?.connection?.url ?? ''; + const connectedToHardhat = isHardHat(providerUrl); const filter = userAssetsStore(state => state.filter); const searchQuery = userAssetsStore(state => state.inputSearchQuery); @@ -32,6 +37,7 @@ export const useAssetsToSell = () => { { address: currentAddress as Address, currency: currentCurrency, + testnetMode: connectedToHardhat, }, { select: data => diff --git a/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts b/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts index 48ec9effda2..aa8d8e9cd12 100644 --- a/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts +++ b/src/__swaps__/screens/Swap/hooks/useSwapInputsController.ts @@ -489,6 +489,8 @@ export function useSwapInputsController({ }), ]); + console.log(quoteResponse); + const quotedInputAmount = lastTypedInputParam === 'outputAmount' ? Number( diff --git a/src/__swaps__/types/chains.ts b/src/__swaps__/types/chains.ts index c61c29adbdd..feaea2a5c11 100644 --- a/src/__swaps__/types/chains.ts +++ b/src/__swaps__/types/chains.ts @@ -100,6 +100,7 @@ export enum ChainName { celo = 'celo', degen = 'degen', gnosis = 'gnosis', + goerli = 'goerli', linea = 'linea', manta = 'manta', optimism = 'optimism', @@ -169,6 +170,7 @@ export const chainNameToIdMapping: { [ChainName.celo]: ChainId.celo, [ChainName.degen]: ChainId.degen, [ChainName.gnosis]: ChainId.gnosis, + [ChainName.goerli]: chain.goerli.id, [ChainName.linea]: ChainId.linea, [ChainName.manta]: ChainId.manta, [ChainName.optimism]: ChainId.optimism, @@ -208,6 +210,7 @@ export const chainIdToNameMapping: { [ChainId.celo]: ChainName.celo, [ChainId.degen]: ChainName.degen, [ChainId.gnosis]: ChainName.gnosis, + [chain.goerli.id]: ChainName.goerli, [ChainId.linea]: ChainName.linea, [ChainId.manta]: ChainName.manta, [ChainId.optimism]: ChainName.optimism, @@ -249,6 +252,7 @@ export const ChainNameDisplay = { [ChainId.scroll]: chain.scroll.name, [ChainId.zora]: 'Zora', [ChainId.mainnet]: 'Ethereum', + [chain.goerli.id]: 'Goerli', [ChainId.hardhat]: 'Hardhat', [ChainId.hardhatOptimism]: chainHardhatOptimism.name, [ChainId.sepolia]: chain.sepolia.name, diff --git a/src/components/activity-list/ActivityList.js b/src/components/activity-list/ActivityList.js index 4367a80af1a..98df923fbd2 100644 --- a/src/components/activity-list/ActivityList.js +++ b/src/components/activity-list/ActivityList.js @@ -125,6 +125,7 @@ const ActivityList = ({ nativeCurrency, pendingTransactionsCount, }} + testID={'wallet-activity-list'} getItemLayout={getItemLayout} initialNumToRender={12} keyExtractor={keyExtractor} diff --git a/src/components/asset-list/RecyclerAssetList2/FastComponents/FastBalanceCoinRow.tsx b/src/components/asset-list/RecyclerAssetList2/FastComponents/FastBalanceCoinRow.tsx index 942fc40a041..08d6b42844e 100644 --- a/src/components/asset-list/RecyclerAssetList2/FastComponents/FastBalanceCoinRow.tsx +++ b/src/components/asset-list/RecyclerAssetList2/FastComponents/FastBalanceCoinRow.tsx @@ -91,7 +91,7 @@ const MemoizedBalanceCoinRow = React.memo( const valueColor = nativeDisplay ? theme.colors.dark : theme.colors.blueGreyLight; return ( - + diff --git a/src/references/chain-assets.json b/src/references/chain-assets.json index 44548600043..8e14b5ac633 100644 --- a/src/references/chain-assets.json +++ b/src/references/chain-assets.json @@ -9,7 +9,7 @@ }, "decimals": 18, "icon_url": "https://s3.amazonaws.com/icons.assets/ETH.png", - "name": "Ether", + "name": "Goerli", "network": "goerli", "price": { "changed_at": 1582568575, @@ -31,7 +31,7 @@ }, "decimals": 18, "icon_url": "https://s3.amazonaws.com/icons.assets/ETH.png", - "name": "Ether", + "name": "Ethereum", "network": "mainnet", "price": { "changed_at": 1582568575, diff --git a/src/references/index.ts b/src/references/index.ts index b0fa576c50d..ae5b3378c9d 100644 --- a/src/references/index.ts +++ b/src/references/index.ts @@ -227,21 +227,10 @@ export const SUPPORTED_MAINNET_CHAINS: Chain[] = [mainnet, polygon, optimism, ar name: ChainNameDisplay[chain.id], })); -export const SUPPORTED_CHAINS = ({ testnetMode = false }: { testnetMode?: boolean }): Chain[] => - [ - // In default order of appearance - mainnet, - base, - optimism, - arbitrum, - polygon, - zora, - blast, - degen, - avalanche, - bsc, +export const SUPPORTED_CHAINS = ({ testnetMode = false }: { testnetMode?: boolean }): Chain[] => { + const mainnetChains: Chain[] = [mainnet, base, optimism, arbitrum, polygon, zora, blast, degen, avalanche, bsc]; - // Testnets + const testnetChains: Chain[] = [ goerli, holesky, sepolia, @@ -253,12 +242,12 @@ export const SUPPORTED_CHAINS = ({ testnetMode = false }: { testnetMode?: boolea zoraSepolia, avalancheFuji, bscTestnet, - ].reduce((chainList, chain) => { - if (testnetMode || !chain.testnet) { - chainList.push({ ...chain, name: ChainNameDisplay[chain.id] }); - } - return chainList; - }, [] as Chain[]); + ]; + + const allChains = mainnetChains.concat(testnetMode ? testnetChains : []); + + return allChains.map(chain => ({ ...chain, name: ChainNameDisplay[chain.id] ?? chain.name })); +}; export const SUPPORTED_CHAIN_IDS = ({ testnetMode = false }: { testnetMode?: boolean }) => SUPPORTED_CHAINS({ testnetMode }).map(chain => chain.id); diff --git a/src/screens/transaction-details/TransactionDetails.tsx b/src/screens/transaction-details/TransactionDetails.tsx index e81de10c8b3..54b61dca03d 100644 --- a/src/screens/transaction-details/TransactionDetails.tsx +++ b/src/screens/transaction-details/TransactionDetails.tsx @@ -62,7 +62,7 @@ export const TransactionDetails = () => { deferredHeight={IS_ANDROID} showsVerticalScrollIndicator={false} > - + diff --git a/tsconfig.jest.json b/tsconfig.jest.json deleted file mode 100644 index ec83611f0c5..00000000000 --- a/tsconfig.jest.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "jsx": "react" - } -} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 00000000000..50975ba4a82 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"], + "@/__swaps__/*": ["src/__swaps__/*"] + }, + "compilerOptions": { + "jsx": "react", + "module": "commonjs", + "types": ["jest", "node"], + "noEmit": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "e2e/**/*.ts"] +} From c040ae9d0427fd02736ecb6e499cd3c505656b8a Mon Sep 17 00:00:00 2001 From: BrodyHughes <41711440+BrodyHughes@users.noreply.github.com> Date: Fri, 14 Jun 2024 23:39:55 -0500 Subject: [PATCH 2/6] restore missing work --- e2e/helpers.ts | 28 +++ e2e/init.js | 35 --- ios/Rainbow.xcodeproj/project.pbxproj | 338 +++++++++++++------------- src/config/experimental.ts | 4 +- 4 files changed, 199 insertions(+), 206 deletions(-) delete mode 100644 e2e/init.js diff --git a/e2e/helpers.ts b/e2e/helpers.ts index 69cdde81e99..ac74d2fba51 100644 --- a/e2e/helpers.ts +++ b/e2e/helpers.ts @@ -4,9 +4,25 @@ import { JsonRpcProvider } from '@ethersproject/providers'; import { Wallet } from '@ethersproject/wallet'; import { expect, device, element, by, waitFor } from 'detox'; import { parseEther } from '@ethersproject/units'; +import { AndroidElementAttributes, IosElementAttributes } from 'detox/detox'; const TESTING_WALLET = '0x3637f053D542E6D00Eee42D656dD7C59Fa33a62F'; +const blacklistUrls = [ + '.*api.thegraph.com.*', + '.*raw.githubusercontent.com.*', + '.*api.coingecko.com.*', + '.*rainbow.imgix.net.*', + '.*infura.io.*', + '.*rainbow.me.*', + '.*rainbowjiumask.dataplane.rudderstack.com*', + '.*rainbowme-res.cloudinary.com*', + '.*rainbow-proxy-rpc.rainbowdotme.workers.*', + '.*localhost:8081/assets/src/assets*.', + '.*arc-graphql.rainbowdotme.workers.dev*.', + '.*googleapis.com*.', +]; + const DEFAULT_TIMEOUT = 20_000; const android = device.getPlatform() === 'android'; @@ -52,6 +68,9 @@ export async function importWalletFlow(customSeed?: string) { } export async function beforeAllcleanApp({ hardhat }: { hardhat?: boolean }) { + await device.clearKeychain(); + await device.launchApp({ newInstance: true, delete: true }); + await device.setURLBlacklist(blacklistUrls); jest.resetAllMocks(); hardhat && (await startHardhat()); } @@ -476,3 +495,12 @@ export async function openDeeplinkFromBackground(url: string) { url, }); } +interface CustomElementAttributes { + elements: Array; +} + +type ElementAttributes = IosElementAttributes & AndroidElementAttributes & CustomElementAttributes; + +export const fetchElementAttributes = async (testId: string): Promise => { + return (await element(by.id(testId)).getAttributes()) as ElementAttributes; +}; diff --git a/e2e/init.js b/e2e/init.js deleted file mode 100644 index 234eef3d4ca..00000000000 --- a/e2e/init.js +++ /dev/null @@ -1,35 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { exec } from 'child_process'; -import { device } from 'detox'; - -require('dotenv').config({ path: '.env' }); - -// jest.mock('src/__swaps__/utils/swap.ts', () => require('./mocks/worklets.mock.js')); - -beforeAll(async () => { - if (device.getPlatform() === 'android') { - // connecting to metro - await device.reverseTcpPort(8081); - // connecting to hardhat - await device.reverseTcpPort(8545); // TODO: WIP for android connecting in dev - - // make sure we don't have gesture navigation what might cause collisions - exec('yarn adb-all shell cmd overlay enable com.android.internal.systemui.navbar.threebutton'); - } - await device.clearKeychain(); - await device.launchApp({ newInstance: true, delete: true }); - await device.setURLBlacklist([ - '.*api.thegraph.com.*', - '.*raw.githubusercontent.com.*', - '.*api.coingecko.com.*', - '.*rainbow.imgix.net.*', - '.*infura.io.*', - '.*rainbow.me.*', - '.*rainbowjiumask.dataplane.rudderstack.com*', - '.*rainbowme-res.cloudinary.com*', - '.*rainbow-proxy-rpc.rainbowdotme.workers.*', - '.*localhost:8081/assets/src/assets*.', - '.*arc-graphql.rainbowdotme.workers.dev*.', - '.*googleapis.com*.', - ]); -}); diff --git a/ios/Rainbow.xcodeproj/project.pbxproj b/ios/Rainbow.xcodeproj/project.pbxproj index 1a4a7a7f214..2f89c357a32 100644 --- a/ios/Rainbow.xcodeproj/project.pbxproj +++ b/ios/Rainbow.xcodeproj/project.pbxproj @@ -25,9 +25,8 @@ 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 */; }; - 3758FD8049A862CD237CECF6 /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A4B4CE352CDA14DBECF587F8 /* libPods-PriceWidgetExtension.a */; }; + 3EDBD05433B06E9A7325D8A4 /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3995DB4B4E5FE6FBE2D6CBC /* libPods-ImageNotification.a */; }; 4D098C2F2811A9A5006A801A /* RNStartTime.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D098C2E2811A9A5006A801A /* RNStartTime.m */; }; - 50753A42C2CF61D786CA9C8E /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5526CB5354739B8B1A8EDEF3 /* libPods-SelectTokenIntent.a */; }; 6630540924A38A1900E5B030 /* RainbowText.m in Sources */ = {isa = PBXBuildFile; fileRef = 6630540824A38A1900E5B030 /* RainbowText.m */; }; 6635730624939991006ACFA6 /* SafeStoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 6635730524939991006ACFA6 /* SafeStoreReview.m */; }; 6655FFB425BB2B0700642961 /* ThemeModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 6655FFB325BB2B0700642961 /* ThemeModule.m */; }; @@ -36,7 +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 */; }; - 9E80A0E147C17A8660545C53 /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AB5DCDA4FE1A125B8A8E8F5 /* libPods-ImageNotification.a */; }; + 965EAE50F50C0C3CD3B685F7 /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F9585C657B5F4024B1FD16 /* libPods-Rainbow.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 */; }; @@ -130,8 +129,9 @@ C1EB01302731B68400830E70 /* TokenDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EB012E2731B68400830E70 /* TokenDetails.swift */; }; C1EB01312731B68400830E70 /* TokenDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EB012E2731B68400830E70 /* TokenDetails.swift */; }; C72F456C99A646399192517D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 98AED33BAB4247CEBEF8464D /* libz.tbd */; }; - C85BADF4CAE1A2FA1D99C521 /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 13F1E920F312479DF774F1FB /* libPods-Rainbow.a */; }; C97EAD8D2BD6C6DF00322D53 /* RCTDeviceUUID.m in Sources */ = {isa = PBXBuildFile; fileRef = C97EAD8B2BD6C6DF00322D53 /* RCTDeviceUUID.m */; }; + D21573A3059BD62A9B6AFFFC /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 111A1785A4AF1A278E2AA241 /* libPods-SelectTokenIntent.a */; }; + E9E71335C00CEA1AB08D1E32 /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F70C354A0CFDC973C4551727 /* libPods-PriceWidgetExtension.a */; }; ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; /* End PBXBuildFile section */ @@ -179,21 +179,19 @@ 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 = ""; }; + 022BFD1CABBB7DCBA07AB67B /* 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 = ""; }; 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; }; - 0822A29EAE2A9DB31B63F09C /* 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 = ""; }; - 0997D767D71C97EDD252FBAA /* 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 = ""; }; - 12CF66CF097C5CF43C4104A9 /* 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 = ""; }; + 111A1785A4AF1A278E2AA241 /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 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 = ""; }; - 13F1E920F312479DF774F1FB /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 152643462B9AD97E004AC9AA /* InjectedJSBundle.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = InjectedJSBundle.js; path = ../InjectedJSBundle.js; 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 = ""; }; @@ -213,7 +211,6 @@ 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 = ""; }; - 195104C9C8AD1E9AD7D9E251 /* 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 = ""; }; 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 = ""; }; @@ -226,14 +223,15 @@ 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 = ""; }; - 24B7F83F5B6AE6CC50475FAB /* 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 = ""; }; - 2DF2E7E5E8EBF67B7D76EBB7 /* 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 = ""; }; - 37F6B56063C2058828AB7581 /* 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 = ""; }; + 375CAE07EF1BD0F0C5AB9591 /* 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 = ""; }; + 3984284D65A2156D95DAD88D /* 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 = ""; }; 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 = ""; }; + 43F9585C657B5F4024B1FD16 /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 48205DEC0E4A5B82DB57F4EA /* 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 = ""; }; 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 = ""; }; - 5526CB5354739B8B1A8EDEF3 /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5E1C9C0E2AC234BF45AFAFA1 /* 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 = ""; }; @@ -249,18 +247,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; }; - 6F617D61295D631C114591F1 /* 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 = ""; }; - 81B1ABAE830F43197C151440 /* 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 = ""; }; - 85AFE2DF6FF5EDED9206A888 /* 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 = ""; }; - 97B48B5316D08943F5948472 /* 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 = ""; }; + 690F44215F3330E5E8DA95EF /* 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 = ""; }; + 6FC04CC17E5C2131ADCCEC02 /* 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 = ""; }; + 7786EDC110B1C877335776BE /* 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 = ""; }; + 7E883DBE50C93CA603E974D3 /* 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 = ""; }; + 8AFB86DF09CD978FF5014EC6 /* 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 = ""; }; 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; }; - 9AB5DCDA4FE1A125B8A8E8F5 /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9B9DC8BF178A1B3F725E8C91 /* 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 = ""; }; 9DEADFA4826D4D0BAA950D21 /* libRNFIRMessaging.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFIRMessaging.a; sourceTree = ""; }; - 9FB7EAA41A4E503343522E69 /* 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 = ""; }; + 9FB0402D9D1A572B0F432368 /* 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 = ""; }; A4277D9E23CBD1910042BAF4 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; A4277DA223CFE85F0042BAF4 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; - A4B4CE352CDA14DBECF587F8 /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; AA0B1CB82B00C5E100EAF77D /* SF-Mono-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SF-Mono-Semibold.otf"; path = "../src/assets/fonts/SF-Mono-Semibold.otf"; sourceTree = ""; }; @@ -272,7 +268,6 @@ 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 = ""; }; - AD44EBDC206B400071C250EA /* 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 = ""; }; 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 = ""; }; @@ -294,6 +289,8 @@ 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 = ""; }; + B7A4E2AA064FB0EAE3D2355D /* 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 = ""; }; + BE0C2DEE8472D95D7753D58F /* 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 = ""; }; 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 = ""; }; @@ -321,13 +318,16 @@ 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 = ""; }; + C604213C72316CC4AE2D5BA4 /* 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 = ""; }; 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 = ""; }; - CBE43422951BC4BC1A49163C /* 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 = ""; }; + D3995DB4B4E5FE6FBE2D6CBC /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; D755E71324B04FEE9C691D14 /* libRNFirebase.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFirebase.a; sourceTree = ""; }; + ECE7A52EAFCE0754884A1405 /* 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 = ""; }; 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; }; - F021581B09845FCF9AC5313F /* 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 = ""; }; + F4DBFFC3E27DF0EEB34E3F30 /* 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 = ""; }; + F70C354A0CFDC973C4551727 /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -335,7 +335,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9E80A0E147C17A8660545C53 /* libPods-ImageNotification.a in Frameworks */, + 3EDBD05433B06E9A7325D8A4 /* libPods-ImageNotification.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -345,7 +345,7 @@ files = ( ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, C72F456C99A646399192517D /* libz.tbd in Frameworks */, - C85BADF4CAE1A2FA1D99C521 /* libPods-Rainbow.a in Frameworks */, + 965EAE50F50C0C3CD3B685F7 /* libPods-Rainbow.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -355,7 +355,7 @@ files = ( C16DCF60272BA6EF00FF5C78 /* SwiftUI.framework in Frameworks */, C16DCF5E272BA6EF00FF5C78 /* WidgetKit.framework in Frameworks */, - 3758FD8049A862CD237CECF6 /* libPods-PriceWidgetExtension.a in Frameworks */, + E9E71335C00CEA1AB08D1E32 /* libPods-PriceWidgetExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -364,7 +364,7 @@ buildActionMask = 2147483647; files = ( C16DCF81272BAB9500FF5C78 /* Intents.framework in Frameworks */, - 50753A42C2CF61D786CA9C8E /* libPods-SelectTokenIntent.a in Frameworks */, + D21573A3059BD62A9B6AFFFC /* libPods-SelectTokenIntent.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -525,10 +525,10 @@ C16DCF5F272BA6EF00FF5C78 /* SwiftUI.framework */, C16DCF80272BAB9500FF5C78 /* Intents.framework */, C16DCF8B272BAB9600FF5C78 /* IntentsUI.framework */, - 9AB5DCDA4FE1A125B8A8E8F5 /* libPods-ImageNotification.a */, - A4B4CE352CDA14DBECF587F8 /* libPods-PriceWidgetExtension.a */, - 13F1E920F312479DF774F1FB /* libPods-Rainbow.a */, - 5526CB5354739B8B1A8EDEF3 /* libPods-SelectTokenIntent.a */, + D3995DB4B4E5FE6FBE2D6CBC /* libPods-ImageNotification.a */, + F70C354A0CFDC973C4551727 /* libPods-PriceWidgetExtension.a */, + 43F9585C657B5F4024B1FD16 /* libPods-Rainbow.a */, + 111A1785A4AF1A278E2AA241 /* libPods-SelectTokenIntent.a */, ); name = Frameworks; sourceTree = ""; @@ -679,22 +679,22 @@ C640359C0E6575CE0A7ECD73 /* Pods */ = { isa = PBXGroup; children = ( - 195104C9C8AD1E9AD7D9E251 /* Pods-ImageNotification.debug.xcconfig */, - AD44EBDC206B400071C250EA /* Pods-ImageNotification.release.xcconfig */, - 81B1ABAE830F43197C151440 /* Pods-ImageNotification.localrelease.xcconfig */, - 24B7F83F5B6AE6CC50475FAB /* Pods-ImageNotification.staging.xcconfig */, - 2DF2E7E5E8EBF67B7D76EBB7 /* Pods-PriceWidgetExtension.debug.xcconfig */, - 37F6B56063C2058828AB7581 /* Pods-PriceWidgetExtension.release.xcconfig */, - F021581B09845FCF9AC5313F /* Pods-PriceWidgetExtension.localrelease.xcconfig */, - 6F617D61295D631C114591F1 /* Pods-PriceWidgetExtension.staging.xcconfig */, - 0822A29EAE2A9DB31B63F09C /* Pods-Rainbow.debug.xcconfig */, - 85AFE2DF6FF5EDED9206A888 /* Pods-Rainbow.release.xcconfig */, - 9FB7EAA41A4E503343522E69 /* Pods-Rainbow.localrelease.xcconfig */, - 12CF66CF097C5CF43C4104A9 /* Pods-Rainbow.staging.xcconfig */, - 0997D767D71C97EDD252FBAA /* Pods-SelectTokenIntent.debug.xcconfig */, - 97B48B5316D08943F5948472 /* Pods-SelectTokenIntent.release.xcconfig */, - CBE43422951BC4BC1A49163C /* Pods-SelectTokenIntent.localrelease.xcconfig */, - 9B9DC8BF178A1B3F725E8C91 /* Pods-SelectTokenIntent.staging.xcconfig */, + F4DBFFC3E27DF0EEB34E3F30 /* Pods-ImageNotification.debug.xcconfig */, + B7A4E2AA064FB0EAE3D2355D /* Pods-ImageNotification.release.xcconfig */, + BE0C2DEE8472D95D7753D58F /* Pods-ImageNotification.localrelease.xcconfig */, + 8AFB86DF09CD978FF5014EC6 /* Pods-ImageNotification.staging.xcconfig */, + 6FC04CC17E5C2131ADCCEC02 /* Pods-PriceWidgetExtension.debug.xcconfig */, + 3984284D65A2156D95DAD88D /* Pods-PriceWidgetExtension.release.xcconfig */, + ECE7A52EAFCE0754884A1405 /* Pods-PriceWidgetExtension.localrelease.xcconfig */, + 022BFD1CABBB7DCBA07AB67B /* Pods-PriceWidgetExtension.staging.xcconfig */, + 48205DEC0E4A5B82DB57F4EA /* Pods-Rainbow.debug.xcconfig */, + 5E1C9C0E2AC234BF45AFAFA1 /* Pods-Rainbow.release.xcconfig */, + C604213C72316CC4AE2D5BA4 /* Pods-Rainbow.localrelease.xcconfig */, + 7E883DBE50C93CA603E974D3 /* Pods-Rainbow.staging.xcconfig */, + 9FB0402D9D1A572B0F432368 /* Pods-SelectTokenIntent.debug.xcconfig */, + 7786EDC110B1C877335776BE /* Pods-SelectTokenIntent.release.xcconfig */, + 375CAE07EF1BD0F0C5AB9591 /* Pods-SelectTokenIntent.localrelease.xcconfig */, + 690F44215F3330E5E8DA95EF /* Pods-SelectTokenIntent.staging.xcconfig */, ); path = Pods; sourceTree = ""; @@ -721,11 +721,11 @@ isa = PBXNativeTarget; buildConfigurationList = 0299CE842886202800B5C7E7 /* Build configuration list for PBXNativeTarget "ImageNotification" */; buildPhases = ( - DDC1F900901D67300326DB77 /* [CP] Check Pods Manifest.lock */, + FCDE797257E7EA2002F70A1C /* [CP] Check Pods Manifest.lock */, 0299CE732886202800B5C7E7 /* Sources */, 0299CE742886202800B5C7E7 /* Frameworks */, 0299CE752886202800B5C7E7 /* Resources */, - 95234EF86890908CDEA4E4F0 /* [CP] Copy Pods Resources */, + 8488BD2547A6D24DCFC12BB9 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -740,17 +740,17 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Rainbow" */; buildPhases = ( - 46C507B3ED19BA3B1F39F57B /* [CP] Check Pods Manifest.lock */, + 48A1A39614FDE41E341B1AD6 /* [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 */, - CFB633058A072452C3752385 /* [CP] Embed Pods Frameworks */, - 61D4A7846DF93949534B6861 /* [CP] Copy Pods Resources */, - 5EDED8E482C7CB890DEAAB55 /* [CP-User] [RNFB] Core Configuration */, - 10D0E70A972DC543765ABCEC /* [CP-User] [RNFB] Crashlytics Configuration */, + F7DE981F0941D47C3CC5A6E1 /* [CP] Embed Pods Frameworks */, + 5BA5FC9E512AC62D3FA38C14 /* [CP] Copy Pods Resources */, + 58C7A2DEEBEE66238CC75EAE /* [CP-User] [RNFB] Core Configuration */, + 50D85322C1FA6E9E896504EC /* [CP-User] [RNFB] Crashlytics Configuration */, ); buildRules = ( ); @@ -768,11 +768,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF6E272BA6F100FF5C78 /* Build configuration list for PBXNativeTarget "PriceWidgetExtension" */; buildPhases = ( - D3AD079188ACB4391355DA53 /* [CP] Check Pods Manifest.lock */, + C7F570C1E2AD1517E748AF62 /* [CP] Check Pods Manifest.lock */, C16DCF58272BA6EF00FF5C78 /* Sources */, C16DCF59272BA6EF00FF5C78 /* Frameworks */, C16DCF5A272BA6EF00FF5C78 /* Resources */, - 641E658E05461865FFF1A7BE /* [CP] Copy Pods Resources */, + 3FAAC47B9787889EB13CF06B /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -787,11 +787,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF9F272BAB9600FF5C78 /* Build configuration list for PBXNativeTarget "SelectTokenIntent" */; buildPhases = ( - C376C557908CA6999B4A924D /* [CP] Check Pods Manifest.lock */, + 524A2517E787200D2B98C840 /* [CP] Check Pods Manifest.lock */, C16DCF7B272BAB9500FF5C78 /* Sources */, C16DCF7C272BAB9500FF5C78 /* Frameworks */, C16DCF7D272BAB9500FF5C78 /* Resources */, - 80D8F721A002E83C9C8E5A29 /* [CP] Copy Pods Resources */, + 4F5F88F5CABB2437D524338B /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -959,21 +959,43 @@ shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport EXTRA_PACKAGER_ARGS=\"--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map\"\nset -e\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; }; - 10D0E70A972DC543765ABCEC /* [CP-User] [RNFB] Crashlytics Configuration */ = { + 3FAAC47B9787889EB13CF06B /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", - "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + "${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseABTesting_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseRemoteConfig_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", ); - name = "[CP-User] [RNFB] Crashlytics 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#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh\"\n"; + showEnvVarsInLog = 0; }; - 46C507B3ED19BA3B1F39F57B /* [CP] Check Pods Manifest.lock */ = { + 48A1A39614FDE41E341B1AD6 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -995,26 +1017,13 @@ 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; }; - 5EDED8E482C7CB890DEAAB55 /* [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"; - }; - 61D4A7846DF93949534B6861 /* [CP] Copy Pods Resources */ = { + 4F5F88F5CABB2437D524338B /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh", + "${PODS_ROOT}/Target Support Files/Pods-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", @@ -1025,15 +1034,6 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Rudder/Rudder.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -1047,64 +1047,68 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Rudder.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 641E658E05461865FFF1A7BE /* [CP] Copy Pods Resources */ = { + 50D85322C1FA6E9E896504EC /* [CP-User] [RNFB] Crashlytics Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + ); + name = "[CP-User] [RNFB] Crashlytics 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#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; + }; + 524A2517E787200D2B98C840 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseABTesting_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseRemoteConfig_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "$(DERIVED_FILE_DIR)/Pods-SelectTokenIntent-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 80D8F721A002E83C9C8E5A29 /* [CP] Copy Pods Resources */ = { + 58C7A2DEEBEE66238CC75EAE /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh", + "$(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"; + }; + 5BA5FC9E512AC62D3FA38C14 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", @@ -1115,6 +1119,15 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Rudder/Rudder.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -1128,13 +1141,22 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Rudder.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 95234EF86890908CDEA4E4F0 /* [CP] Copy Pods Resources */ = { + 8488BD2547A6D24DCFC12BB9 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1187,7 +1209,7 @@ shellPath = /bin/sh; shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym\n"; }; - C376C557908CA6999B4A924D /* [CP] Check Pods Manifest.lock */ = { + C7F570C1E2AD1517E748AF62 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1202,14 +1224,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; }; - CFB633058A072452C3752385 /* [CP] Embed Pods Frameworks */ = { + F7DE981F0941D47C3CC5A6E1 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1229,29 +1251,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D3AD079188ACB4391355DA53 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(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; - }; - DDC1F900901D67300326DB77 /* [CP] Check Pods Manifest.lock */ = { + FCDE797257E7EA2002F70A1C /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1416,7 +1416,7 @@ /* Begin XCBuildConfiguration section */ 0299CE802886202800B5C7E7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 195104C9C8AD1E9AD7D9E251 /* Pods-ImageNotification.debug.xcconfig */; + baseConfigurationReference = F4DBFFC3E27DF0EEB34E3F30 /* Pods-ImageNotification.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1466,7 +1466,7 @@ }; 0299CE812886202800B5C7E7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AD44EBDC206B400071C250EA /* Pods-ImageNotification.release.xcconfig */; + baseConfigurationReference = B7A4E2AA064FB0EAE3D2355D /* Pods-ImageNotification.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1514,7 +1514,7 @@ }; 0299CE822886202800B5C7E7 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 81B1ABAE830F43197C151440 /* Pods-ImageNotification.localrelease.xcconfig */; + baseConfigurationReference = BE0C2DEE8472D95D7753D58F /* Pods-ImageNotification.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1562,7 +1562,7 @@ }; 0299CE832886202800B5C7E7 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 24B7F83F5B6AE6CC50475FAB /* Pods-ImageNotification.staging.xcconfig */; + baseConfigurationReference = 8AFB86DF09CD978FF5014EC6 /* Pods-ImageNotification.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1610,7 +1610,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0822A29EAE2A9DB31B63F09C /* Pods-Rainbow.debug.xcconfig */; + baseConfigurationReference = 48205DEC0E4A5B82DB57F4EA /* Pods-Rainbow.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1687,7 +1687,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 85AFE2DF6FF5EDED9206A888 /* Pods-Rainbow.release.xcconfig */; + baseConfigurationReference = 5E1C9C0E2AC234BF45AFAFA1 /* Pods-Rainbow.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1795,7 +1795,7 @@ }; 2C6A799821127ED9003AFB37 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 12CF66CF097C5CF43C4104A9 /* Pods-Rainbow.staging.xcconfig */; + baseConfigurationReference = 7E883DBE50C93CA603E974D3 /* Pods-Rainbow.staging.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1903,7 +1903,7 @@ }; 2C87B79A2197FA1900682EC4 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FB7EAA41A4E503343522E69 /* Pods-Rainbow.localrelease.xcconfig */; + baseConfigurationReference = C604213C72316CC4AE2D5BA4 /* Pods-Rainbow.localrelease.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2061,7 +2061,7 @@ }; C16DCF6A272BA6F100FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2DF2E7E5E8EBF67B7D76EBB7 /* Pods-PriceWidgetExtension.debug.xcconfig */; + baseConfigurationReference = 6FC04CC17E5C2131ADCCEC02 /* Pods-PriceWidgetExtension.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2110,7 +2110,7 @@ }; C16DCF6B272BA6F100FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 37F6B56063C2058828AB7581 /* Pods-PriceWidgetExtension.release.xcconfig */; + baseConfigurationReference = 3984284D65A2156D95DAD88D /* Pods-PriceWidgetExtension.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2157,7 +2157,7 @@ }; C16DCF6C272BA6F100FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F021581B09845FCF9AC5313F /* Pods-PriceWidgetExtension.localrelease.xcconfig */; + baseConfigurationReference = ECE7A52EAFCE0754884A1405 /* Pods-PriceWidgetExtension.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2204,7 +2204,7 @@ }; C16DCF6D272BA6F100FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6F617D61295D631C114591F1 /* Pods-PriceWidgetExtension.staging.xcconfig */; + baseConfigurationReference = 022BFD1CABBB7DCBA07AB67B /* Pods-PriceWidgetExtension.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2251,7 +2251,7 @@ }; C16DCFA0272BAB9600FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0997D767D71C97EDD252FBAA /* Pods-SelectTokenIntent.debug.xcconfig */; + baseConfigurationReference = 9FB0402D9D1A572B0F432368 /* Pods-SelectTokenIntent.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2298,7 +2298,7 @@ }; C16DCFA1272BAB9600FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 97B48B5316D08943F5948472 /* Pods-SelectTokenIntent.release.xcconfig */; + baseConfigurationReference = 7786EDC110B1C877335776BE /* Pods-SelectTokenIntent.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2343,7 +2343,7 @@ }; C16DCFA2272BAB9600FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CBE43422951BC4BC1A49163C /* Pods-SelectTokenIntent.localrelease.xcconfig */; + baseConfigurationReference = 375CAE07EF1BD0F0C5AB9591 /* Pods-SelectTokenIntent.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2388,7 +2388,7 @@ }; C16DCFA3272BAB9600FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9B9DC8BF178A1B3F725E8C91 /* Pods-SelectTokenIntent.staging.xcconfig */; + baseConfigurationReference = 690F44215F3330E5E8DA95EF /* Pods-SelectTokenIntent.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; diff --git a/src/config/experimental.ts b/src/config/experimental.ts index 05276e215f7..411d7e9adb2 100644 --- a/src/config/experimental.ts +++ b/src/config/experimental.ts @@ -58,8 +58,8 @@ export const defaultConfig: Record = { [REMOTE_PROMO_SHEETS]: { settings: true, value: false }, [REMOTE_CARDS]: { settings: true, value: false }, [POINTS_NOTIFICATIONS_TOGGLE]: { settings: true, value: false }, - [DAPP_BROWSER]: { settings: true, value: IS_TEST ? true : false }, - [SWAPS_V2]: { settings: true, value: false }, + [DAPP_BROWSER]: { settings: true, value: !!IS_TEST }, + [SWAPS_V2]: { settings: true, value: !!IS_TEST }, }; const storageKey = 'config'; From cbd23027ed76e0520f846d8ea692688e45e8e733 Mon Sep 17 00:00:00 2001 From: BrodyHughes <41711440+BrodyHughes@users.noreply.github.com> Date: Mon, 17 Jun 2024 11:30:09 -0500 Subject: [PATCH 3/6] remove xcodeproj --- ios/Rainbow.xcodeproj/project.pbxproj | 338 +++++++++++++------------- 1 file changed, 169 insertions(+), 169 deletions(-) diff --git a/ios/Rainbow.xcodeproj/project.pbxproj b/ios/Rainbow.xcodeproj/project.pbxproj index 2f89c357a32..1a4a7a7f214 100644 --- a/ios/Rainbow.xcodeproj/project.pbxproj +++ b/ios/Rainbow.xcodeproj/project.pbxproj @@ -25,8 +25,9 @@ 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 */; }; - 3EDBD05433B06E9A7325D8A4 /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3995DB4B4E5FE6FBE2D6CBC /* libPods-ImageNotification.a */; }; + 3758FD8049A862CD237CECF6 /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A4B4CE352CDA14DBECF587F8 /* libPods-PriceWidgetExtension.a */; }; 4D098C2F2811A9A5006A801A /* RNStartTime.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D098C2E2811A9A5006A801A /* RNStartTime.m */; }; + 50753A42C2CF61D786CA9C8E /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5526CB5354739B8B1A8EDEF3 /* libPods-SelectTokenIntent.a */; }; 6630540924A38A1900E5B030 /* RainbowText.m in Sources */ = {isa = PBXBuildFile; fileRef = 6630540824A38A1900E5B030 /* RainbowText.m */; }; 6635730624939991006ACFA6 /* SafeStoreReview.m in Sources */ = {isa = PBXBuildFile; fileRef = 6635730524939991006ACFA6 /* SafeStoreReview.m */; }; 6655FFB425BB2B0700642961 /* ThemeModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 6655FFB325BB2B0700642961 /* ThemeModule.m */; }; @@ -35,7 +36,7 @@ 66A1FEB624AB641100C3F539 /* RNCMScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 66A1FEB324AB641100C3F539 /* RNCMScreen.m */; }; 66A1FEBC24ACBBE600C3F539 /* RNCMPortal.m in Sources */ = {isa = PBXBuildFile; fileRef = 66A1FEBB24ACBBE600C3F539 /* RNCMPortal.m */; }; 66A28EB024CAF1B500410A88 /* TestFlight.m in Sources */ = {isa = PBXBuildFile; fileRef = 66A28EAF24CAF1B500410A88 /* TestFlight.m */; }; - 965EAE50F50C0C3CD3B685F7 /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F9585C657B5F4024B1FD16 /* libPods-Rainbow.a */; }; + 9E80A0E147C17A8660545C53 /* libPods-ImageNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AB5DCDA4FE1A125B8A8E8F5 /* 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 */; }; @@ -129,9 +130,8 @@ C1EB01302731B68400830E70 /* TokenDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EB012E2731B68400830E70 /* TokenDetails.swift */; }; C1EB01312731B68400830E70 /* TokenDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EB012E2731B68400830E70 /* TokenDetails.swift */; }; C72F456C99A646399192517D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 98AED33BAB4247CEBEF8464D /* libz.tbd */; }; + C85BADF4CAE1A2FA1D99C521 /* libPods-Rainbow.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 13F1E920F312479DF774F1FB /* libPods-Rainbow.a */; }; C97EAD8D2BD6C6DF00322D53 /* RCTDeviceUUID.m in Sources */ = {isa = PBXBuildFile; fileRef = C97EAD8B2BD6C6DF00322D53 /* RCTDeviceUUID.m */; }; - D21573A3059BD62A9B6AFFFC /* libPods-SelectTokenIntent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 111A1785A4AF1A278E2AA241 /* libPods-SelectTokenIntent.a */; }; - E9E71335C00CEA1AB08D1E32 /* libPods-PriceWidgetExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F70C354A0CFDC973C4551727 /* libPods-PriceWidgetExtension.a */; }; ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; /* End PBXBuildFile section */ @@ -179,19 +179,21 @@ 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 = ""; }; - 022BFD1CABBB7DCBA07AB67B /* 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 = ""; }; 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; }; - 111A1785A4AF1A278E2AA241 /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 0822A29EAE2A9DB31B63F09C /* 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 = ""; }; + 0997D767D71C97EDD252FBAA /* 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 = ""; }; + 12CF66CF097C5CF43C4104A9 /* 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 = ""; }; 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 = ""; }; 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 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 = ""; }; + 13F1E920F312479DF774F1FB /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 152643462B9AD97E004AC9AA /* InjectedJSBundle.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = InjectedJSBundle.js; path = ../InjectedJSBundle.js; 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 = ""; }; @@ -211,6 +213,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 = ""; }; + 195104C9C8AD1E9AD7D9E251 /* 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 = ""; }; 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 = ""; }; @@ -223,15 +226,14 @@ 24979E7C20F84004007EB0DA /* FirebaseCoreDiagnostics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FirebaseCoreDiagnostics.framework; path = Frameworks/FirebaseCoreDiagnostics.framework; sourceTree = ""; }; 24979E7D20F84005007EB0DA /* module.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = Frameworks/module.modulemap; sourceTree = ""; }; 24979E7E20F84005007EB0DA /* nanopb.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = nanopb.framework; path = Frameworks/nanopb.framework; sourceTree = ""; }; - 375CAE07EF1BD0F0C5AB9591 /* 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 = ""; }; - 3984284D65A2156D95DAD88D /* 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 = ""; }; + 24B7F83F5B6AE6CC50475FAB /* 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 = ""; }; + 2DF2E7E5E8EBF67B7D76EBB7 /* 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 = ""; }; + 37F6B56063C2058828AB7581 /* 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 = ""; }; 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 = ""; }; - 43F9585C657B5F4024B1FD16 /* libPods-Rainbow.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Rainbow.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 48205DEC0E4A5B82DB57F4EA /* 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 = ""; }; 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 = ""; }; - 5E1C9C0E2AC234BF45AFAFA1 /* 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 = ""; }; + 5526CB5354739B8B1A8EDEF3 /* libPods-SelectTokenIntent.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SelectTokenIntent.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6630540824A38A1900E5B030 /* RainbowText.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RainbowText.m; sourceTree = ""; }; 6635730524939991006ACFA6 /* SafeStoreReview.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SafeStoreReview.m; sourceTree = ""; }; 664612EC2748489B00B43F5A /* PriceWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PriceWidgetExtension.entitlements; sourceTree = ""; }; @@ -247,16 +249,18 @@ 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; }; - 690F44215F3330E5E8DA95EF /* 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 = ""; }; - 6FC04CC17E5C2131ADCCEC02 /* 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 = ""; }; - 7786EDC110B1C877335776BE /* 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 = ""; }; - 7E883DBE50C93CA603E974D3 /* 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 = ""; }; - 8AFB86DF09CD978FF5014EC6 /* 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 = ""; }; + 6F617D61295D631C114591F1 /* 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 = ""; }; + 81B1ABAE830F43197C151440 /* 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 = ""; }; + 85AFE2DF6FF5EDED9206A888 /* 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 = ""; }; + 97B48B5316D08943F5948472 /* 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 = ""; }; 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; }; + 9AB5DCDA4FE1A125B8A8E8F5 /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9B9DC8BF178A1B3F725E8C91 /* 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 = ""; }; 9DEADFA4826D4D0BAA950D21 /* libRNFIRMessaging.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFIRMessaging.a; sourceTree = ""; }; - 9FB0402D9D1A572B0F432368 /* 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 = ""; }; + 9FB7EAA41A4E503343522E69 /* 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 = ""; }; A4277D9E23CBD1910042BAF4 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; A4277DA223CFE85F0042BAF4 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; + A4B4CE352CDA14DBECF587F8 /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; AA0B1CB82B00C5E100EAF77D /* SF-Mono-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "SF-Mono-Semibold.otf"; path = "../src/assets/fonts/SF-Mono-Semibold.otf"; sourceTree = ""; }; @@ -268,6 +272,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 = ""; }; + AD44EBDC206B400071C250EA /* 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 = ""; }; 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 = ""; }; @@ -289,8 +294,6 @@ 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 = ""; }; - B7A4E2AA064FB0EAE3D2355D /* 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 = ""; }; - BE0C2DEE8472D95D7753D58F /* 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 = ""; }; 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 = ""; }; @@ -318,16 +321,13 @@ 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 = ""; }; - C604213C72316CC4AE2D5BA4 /* 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 = ""; }; 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 = ""; }; - D3995DB4B4E5FE6FBE2D6CBC /* libPods-ImageNotification.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ImageNotification.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + CBE43422951BC4BC1A49163C /* 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 = ""; }; D755E71324B04FEE9C691D14 /* libRNFirebase.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFirebase.a; sourceTree = ""; }; - ECE7A52EAFCE0754884A1405 /* 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 = ""; }; 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; }; - F4DBFFC3E27DF0EEB34E3F30 /* 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 = ""; }; - F70C354A0CFDC973C4551727 /* libPods-PriceWidgetExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-PriceWidgetExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + F021581B09845FCF9AC5313F /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -335,7 +335,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3EDBD05433B06E9A7325D8A4 /* libPods-ImageNotification.a in Frameworks */, + 9E80A0E147C17A8660545C53 /* libPods-ImageNotification.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -345,7 +345,7 @@ files = ( ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, C72F456C99A646399192517D /* libz.tbd in Frameworks */, - 965EAE50F50C0C3CD3B685F7 /* libPods-Rainbow.a in Frameworks */, + C85BADF4CAE1A2FA1D99C521 /* libPods-Rainbow.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -355,7 +355,7 @@ files = ( C16DCF60272BA6EF00FF5C78 /* SwiftUI.framework in Frameworks */, C16DCF5E272BA6EF00FF5C78 /* WidgetKit.framework in Frameworks */, - E9E71335C00CEA1AB08D1E32 /* libPods-PriceWidgetExtension.a in Frameworks */, + 3758FD8049A862CD237CECF6 /* libPods-PriceWidgetExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -364,7 +364,7 @@ buildActionMask = 2147483647; files = ( C16DCF81272BAB9500FF5C78 /* Intents.framework in Frameworks */, - D21573A3059BD62A9B6AFFFC /* libPods-SelectTokenIntent.a in Frameworks */, + 50753A42C2CF61D786CA9C8E /* libPods-SelectTokenIntent.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -525,10 +525,10 @@ C16DCF5F272BA6EF00FF5C78 /* SwiftUI.framework */, C16DCF80272BAB9500FF5C78 /* Intents.framework */, C16DCF8B272BAB9600FF5C78 /* IntentsUI.framework */, - D3995DB4B4E5FE6FBE2D6CBC /* libPods-ImageNotification.a */, - F70C354A0CFDC973C4551727 /* libPods-PriceWidgetExtension.a */, - 43F9585C657B5F4024B1FD16 /* libPods-Rainbow.a */, - 111A1785A4AF1A278E2AA241 /* libPods-SelectTokenIntent.a */, + 9AB5DCDA4FE1A125B8A8E8F5 /* libPods-ImageNotification.a */, + A4B4CE352CDA14DBECF587F8 /* libPods-PriceWidgetExtension.a */, + 13F1E920F312479DF774F1FB /* libPods-Rainbow.a */, + 5526CB5354739B8B1A8EDEF3 /* libPods-SelectTokenIntent.a */, ); name = Frameworks; sourceTree = ""; @@ -679,22 +679,22 @@ C640359C0E6575CE0A7ECD73 /* Pods */ = { isa = PBXGroup; children = ( - F4DBFFC3E27DF0EEB34E3F30 /* Pods-ImageNotification.debug.xcconfig */, - B7A4E2AA064FB0EAE3D2355D /* Pods-ImageNotification.release.xcconfig */, - BE0C2DEE8472D95D7753D58F /* Pods-ImageNotification.localrelease.xcconfig */, - 8AFB86DF09CD978FF5014EC6 /* Pods-ImageNotification.staging.xcconfig */, - 6FC04CC17E5C2131ADCCEC02 /* Pods-PriceWidgetExtension.debug.xcconfig */, - 3984284D65A2156D95DAD88D /* Pods-PriceWidgetExtension.release.xcconfig */, - ECE7A52EAFCE0754884A1405 /* Pods-PriceWidgetExtension.localrelease.xcconfig */, - 022BFD1CABBB7DCBA07AB67B /* Pods-PriceWidgetExtension.staging.xcconfig */, - 48205DEC0E4A5B82DB57F4EA /* Pods-Rainbow.debug.xcconfig */, - 5E1C9C0E2AC234BF45AFAFA1 /* Pods-Rainbow.release.xcconfig */, - C604213C72316CC4AE2D5BA4 /* Pods-Rainbow.localrelease.xcconfig */, - 7E883DBE50C93CA603E974D3 /* Pods-Rainbow.staging.xcconfig */, - 9FB0402D9D1A572B0F432368 /* Pods-SelectTokenIntent.debug.xcconfig */, - 7786EDC110B1C877335776BE /* Pods-SelectTokenIntent.release.xcconfig */, - 375CAE07EF1BD0F0C5AB9591 /* Pods-SelectTokenIntent.localrelease.xcconfig */, - 690F44215F3330E5E8DA95EF /* Pods-SelectTokenIntent.staging.xcconfig */, + 195104C9C8AD1E9AD7D9E251 /* Pods-ImageNotification.debug.xcconfig */, + AD44EBDC206B400071C250EA /* Pods-ImageNotification.release.xcconfig */, + 81B1ABAE830F43197C151440 /* Pods-ImageNotification.localrelease.xcconfig */, + 24B7F83F5B6AE6CC50475FAB /* Pods-ImageNotification.staging.xcconfig */, + 2DF2E7E5E8EBF67B7D76EBB7 /* Pods-PriceWidgetExtension.debug.xcconfig */, + 37F6B56063C2058828AB7581 /* Pods-PriceWidgetExtension.release.xcconfig */, + F021581B09845FCF9AC5313F /* Pods-PriceWidgetExtension.localrelease.xcconfig */, + 6F617D61295D631C114591F1 /* Pods-PriceWidgetExtension.staging.xcconfig */, + 0822A29EAE2A9DB31B63F09C /* Pods-Rainbow.debug.xcconfig */, + 85AFE2DF6FF5EDED9206A888 /* Pods-Rainbow.release.xcconfig */, + 9FB7EAA41A4E503343522E69 /* Pods-Rainbow.localrelease.xcconfig */, + 12CF66CF097C5CF43C4104A9 /* Pods-Rainbow.staging.xcconfig */, + 0997D767D71C97EDD252FBAA /* Pods-SelectTokenIntent.debug.xcconfig */, + 97B48B5316D08943F5948472 /* Pods-SelectTokenIntent.release.xcconfig */, + CBE43422951BC4BC1A49163C /* Pods-SelectTokenIntent.localrelease.xcconfig */, + 9B9DC8BF178A1B3F725E8C91 /* Pods-SelectTokenIntent.staging.xcconfig */, ); path = Pods; sourceTree = ""; @@ -721,11 +721,11 @@ isa = PBXNativeTarget; buildConfigurationList = 0299CE842886202800B5C7E7 /* Build configuration list for PBXNativeTarget "ImageNotification" */; buildPhases = ( - FCDE797257E7EA2002F70A1C /* [CP] Check Pods Manifest.lock */, + DDC1F900901D67300326DB77 /* [CP] Check Pods Manifest.lock */, 0299CE732886202800B5C7E7 /* Sources */, 0299CE742886202800B5C7E7 /* Frameworks */, 0299CE752886202800B5C7E7 /* Resources */, - 8488BD2547A6D24DCFC12BB9 /* [CP] Copy Pods Resources */, + 95234EF86890908CDEA4E4F0 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -740,17 +740,17 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Rainbow" */; buildPhases = ( - 48A1A39614FDE41E341B1AD6 /* [CP] Check Pods Manifest.lock */, + 46C507B3ED19BA3B1F39F57B /* [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 */, - F7DE981F0941D47C3CC5A6E1 /* [CP] Embed Pods Frameworks */, - 5BA5FC9E512AC62D3FA38C14 /* [CP] Copy Pods Resources */, - 58C7A2DEEBEE66238CC75EAE /* [CP-User] [RNFB] Core Configuration */, - 50D85322C1FA6E9E896504EC /* [CP-User] [RNFB] Crashlytics Configuration */, + CFB633058A072452C3752385 /* [CP] Embed Pods Frameworks */, + 61D4A7846DF93949534B6861 /* [CP] Copy Pods Resources */, + 5EDED8E482C7CB890DEAAB55 /* [CP-User] [RNFB] Core Configuration */, + 10D0E70A972DC543765ABCEC /* [CP-User] [RNFB] Crashlytics Configuration */, ); buildRules = ( ); @@ -768,11 +768,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF6E272BA6F100FF5C78 /* Build configuration list for PBXNativeTarget "PriceWidgetExtension" */; buildPhases = ( - C7F570C1E2AD1517E748AF62 /* [CP] Check Pods Manifest.lock */, + D3AD079188ACB4391355DA53 /* [CP] Check Pods Manifest.lock */, C16DCF58272BA6EF00FF5C78 /* Sources */, C16DCF59272BA6EF00FF5C78 /* Frameworks */, C16DCF5A272BA6EF00FF5C78 /* Resources */, - 3FAAC47B9787889EB13CF06B /* [CP] Copy Pods Resources */, + 641E658E05461865FFF1A7BE /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -787,11 +787,11 @@ isa = PBXNativeTarget; buildConfigurationList = C16DCF9F272BAB9600FF5C78 /* Build configuration list for PBXNativeTarget "SelectTokenIntent" */; buildPhases = ( - 524A2517E787200D2B98C840 /* [CP] Check Pods Manifest.lock */, + C376C557908CA6999B4A924D /* [CP] Check Pods Manifest.lock */, C16DCF7B272BAB9500FF5C78 /* Sources */, C16DCF7C272BAB9500FF5C78 /* Frameworks */, C16DCF7D272BAB9500FF5C78 /* Resources */, - 4F5F88F5CABB2437D524338B /* [CP] Copy Pods Resources */, + 80D8F721A002E83C9C8E5A29 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -959,43 +959,21 @@ shellScript = "export SENTRY_PROPERTIES=sentry.properties\nexport EXTRA_PACKAGER_ARGS=\"--sourcemap-output $DERIVED_FILE_DIR/main.jsbundle.map\"\nset -e\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; }; - 3FAAC47B9787889EB13CF06B /* [CP] Copy Pods Resources */ = { + 10D0E70A972DC543765ABCEC /* [CP-User] [RNFB] Crashlytics Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseABTesting_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseRemoteConfig_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", ); + name = "[CP-User] [RNFB] Crashlytics Configuration"; runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; }; - 48A1A39614FDE41E341B1AD6 /* [CP] Check Pods Manifest.lock */ = { + 46C507B3ED19BA3B1F39F57B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1017,13 +995,26 @@ 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; }; - 4F5F88F5CABB2437D524338B /* [CP] Copy Pods Resources */ = { + 5EDED8E482C7CB890DEAAB55 /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh", + "$(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"; + }; + 61D4A7846DF93949534B6861 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", @@ -1034,6 +1025,15 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Rudder/Rudder.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -1047,68 +1047,64 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Rudder.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 50D85322C1FA6E9E896504EC /* [CP-User] [RNFB] Crashlytics Configuration */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", - "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", - ); - name = "[CP-User] [RNFB] Crashlytics 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#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; - }; - 524A2517E787200D2B98C840 /* [CP] Check Pods Manifest.lock */ = { + 641E658E05461865FFF1A7BE /* [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-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseABTesting/FirebaseABTesting_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseRemoteConfig/FirebaseRemoteConfig_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", ); + name = "[CP] Copy Pods Resources"; outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-SelectTokenIntent-checkManifestLockResult.txt", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseABTesting_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseRemoteConfig_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", ); 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-PriceWidgetExtension/Pods-PriceWidgetExtension-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 58C7A2DEEBEE66238CC75EAE /* [CP-User] [RNFB] Core Configuration */ = { + 80D8F721A002E83C9C8E5A29 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", - ); - name = "[CP-User] [RNFB] Core Configuration"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; - }; - 5BA5FC9E512AC62D3FA38C14 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh", + "${PODS_ROOT}/Target Support Files/Pods-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", @@ -1119,15 +1115,6 @@ "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseMessaging/FirebaseMessaging_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Rudder/Rudder.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -1141,22 +1128,13 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseMessaging_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Rudder.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SelectTokenIntent/Pods-SelectTokenIntent-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 8488BD2547A6D24DCFC12BB9 /* [CP] Copy Pods Resources */ = { + 95234EF86890908CDEA4E4F0 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1209,7 +1187,7 @@ shellPath = /bin/sh; shellScript = "export SENTRY_PROPERTIES=sentry.properties\n../node_modules/@sentry/cli/bin/sentry-cli upload-dsym\n"; }; - C7F570C1E2AD1517E748AF62 /* [CP] Check Pods Manifest.lock */ = { + C376C557908CA6999B4A924D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1224,14 +1202,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-PriceWidgetExtension-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; }; - F7DE981F0941D47C3CC5A6E1 /* [CP] Embed Pods Frameworks */ = { + CFB633058A072452C3752385 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1251,7 +1229,29 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Rainbow/Pods-Rainbow-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - FCDE797257E7EA2002F70A1C /* [CP] Check Pods Manifest.lock */ = { + D3AD079188ACB4391355DA53 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(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; + }; + DDC1F900901D67300326DB77 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1416,7 +1416,7 @@ /* Begin XCBuildConfiguration section */ 0299CE802886202800B5C7E7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F4DBFFC3E27DF0EEB34E3F30 /* Pods-ImageNotification.debug.xcconfig */; + baseConfigurationReference = 195104C9C8AD1E9AD7D9E251 /* Pods-ImageNotification.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1466,7 +1466,7 @@ }; 0299CE812886202800B5C7E7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B7A4E2AA064FB0EAE3D2355D /* Pods-ImageNotification.release.xcconfig */; + baseConfigurationReference = AD44EBDC206B400071C250EA /* Pods-ImageNotification.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1514,7 +1514,7 @@ }; 0299CE822886202800B5C7E7 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BE0C2DEE8472D95D7753D58F /* Pods-ImageNotification.localrelease.xcconfig */; + baseConfigurationReference = 81B1ABAE830F43197C151440 /* Pods-ImageNotification.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1562,7 +1562,7 @@ }; 0299CE832886202800B5C7E7 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8AFB86DF09CD978FF5014EC6 /* Pods-ImageNotification.staging.xcconfig */; + baseConfigurationReference = 24B7F83F5B6AE6CC50475FAB /* Pods-ImageNotification.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1610,7 +1610,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 48205DEC0E4A5B82DB57F4EA /* Pods-Rainbow.debug.xcconfig */; + baseConfigurationReference = 0822A29EAE2A9DB31B63F09C /* Pods-Rainbow.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1687,7 +1687,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5E1C9C0E2AC234BF45AFAFA1 /* Pods-Rainbow.release.xcconfig */; + baseConfigurationReference = 85AFE2DF6FF5EDED9206A888 /* Pods-Rainbow.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1795,7 +1795,7 @@ }; 2C6A799821127ED9003AFB37 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7E883DBE50C93CA603E974D3 /* Pods-Rainbow.staging.xcconfig */; + baseConfigurationReference = 12CF66CF097C5CF43C4104A9 /* Pods-Rainbow.staging.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -1903,7 +1903,7 @@ }; 2C87B79A2197FA1900682EC4 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C604213C72316CC4AE2D5BA4 /* Pods-Rainbow.localrelease.xcconfig */; + baseConfigurationReference = 9FB7EAA41A4E503343522E69 /* Pods-Rainbow.localrelease.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2061,7 +2061,7 @@ }; C16DCF6A272BA6F100FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6FC04CC17E5C2131ADCCEC02 /* Pods-PriceWidgetExtension.debug.xcconfig */; + baseConfigurationReference = 2DF2E7E5E8EBF67B7D76EBB7 /* Pods-PriceWidgetExtension.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2110,7 +2110,7 @@ }; C16DCF6B272BA6F100FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3984284D65A2156D95DAD88D /* Pods-PriceWidgetExtension.release.xcconfig */; + baseConfigurationReference = 37F6B56063C2058828AB7581 /* Pods-PriceWidgetExtension.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2157,7 +2157,7 @@ }; C16DCF6C272BA6F100FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = ECE7A52EAFCE0754884A1405 /* Pods-PriceWidgetExtension.localrelease.xcconfig */; + baseConfigurationReference = F021581B09845FCF9AC5313F /* Pods-PriceWidgetExtension.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2204,7 +2204,7 @@ }; C16DCF6D272BA6F100FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 022BFD1CABBB7DCBA07AB67B /* Pods-PriceWidgetExtension.staging.xcconfig */; + baseConfigurationReference = 6F617D61295D631C114591F1 /* Pods-PriceWidgetExtension.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2251,7 +2251,7 @@ }; C16DCFA0272BAB9600FF5C78 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9FB0402D9D1A572B0F432368 /* Pods-SelectTokenIntent.debug.xcconfig */; + baseConfigurationReference = 0997D767D71C97EDD252FBAA /* Pods-SelectTokenIntent.debug.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2298,7 +2298,7 @@ }; C16DCFA1272BAB9600FF5C78 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7786EDC110B1C877335776BE /* Pods-SelectTokenIntent.release.xcconfig */; + baseConfigurationReference = 97B48B5316D08943F5948472 /* Pods-SelectTokenIntent.release.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2343,7 +2343,7 @@ }; C16DCFA2272BAB9600FF5C78 /* LocalRelease */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 375CAE07EF1BD0F0C5AB9591 /* Pods-SelectTokenIntent.localrelease.xcconfig */; + baseConfigurationReference = CBE43422951BC4BC1A49163C /* Pods-SelectTokenIntent.localrelease.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; @@ -2388,7 +2388,7 @@ }; C16DCFA3272BAB9600FF5C78 /* Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 690F44215F3330E5E8DA95EF /* Pods-SelectTokenIntent.staging.xcconfig */; + baseConfigurationReference = 9B9DC8BF178A1B3F725E8C91 /* Pods-SelectTokenIntent.staging.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ANALYZER_NONNULL = YES; From 029cdd3e6204551da30f8901c0f35c7d582dd31e Mon Sep 17 00:00:00 2001 From: Bruno Barbieri Date: Mon, 17 Jun 2024 18:54:53 -0400 Subject: [PATCH 4/6] fix missing initial asset swap e2e --- src/state/assets/userAssets.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/state/assets/userAssets.ts b/src/state/assets/userAssets.ts index 59ba39f4162..f5a9354ebcf 100644 --- a/src/state/assets/userAssets.ts +++ b/src/state/assets/userAssets.ts @@ -5,6 +5,9 @@ import store from '@/redux/store'; import { SUPPORTED_CHAIN_IDS } from '@/references'; import { ParsedSearchAsset, UniqueId, UserAssetFilter } from '@/__swaps__/types/assets'; import { ChainId } from '@/__swaps__/types/chains'; +import { getIsHardhatConnected } from '@/handlers/web3'; +import { ethereumUtils } from '@/utils'; +import { NetworkTypes } from '@/helpers'; const SEARCH_CACHE_MAX_ENTRIES = 50; const SMALL_BALANCE_THRESHOLD = store.getState().settings.nativeCurrency === 'ETH' ? 0.000005 : 0.02; @@ -164,7 +167,14 @@ export const userAssetsStore = createRainbowStore( } }, - getHighestValueAsset: () => get().userAssets.values().next().value || null, + getHighestValueAsset: () => { + const highestValueAsset = get().userAssets.values().next().value || null; + if (!highestValueAsset && getIsHardhatConnected()) { + return ethereumUtils.getNetworkNativeAsset(NetworkTypes.mainnet); + } + + return highestValueAsset; + }, getUserAsset: (uniqueId: UniqueId) => get().userAssets.get(uniqueId) || null, From 91b6594c470c8ca2330b8cc81bc1a7d35e3257dd Mon Sep 17 00:00:00 2001 From: BrodyHughes <41711440+BrodyHughes@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:42:20 -0500 Subject: [PATCH 5/6] fix up testIDs --- e2e/8_swapSheetFlow1.spec.ts | 17 ++++++++--------- .../screens/Swap/components/CoinRow.tsx | 6 ++++-- .../screens/Swap/components/SearchInput.tsx | 2 -- .../screens/Swap/components/SwapInputAsset.tsx | 11 +++++++++-- .../components/TokenList/TokenToBuyList.tsx | 5 +++++ .../Swap/hooks/useSwapInputsController.ts | 2 -- 6 files changed, 26 insertions(+), 17 deletions(-) diff --git a/e2e/8_swapSheetFlow1.spec.ts b/e2e/8_swapSheetFlow1.spec.ts index 9ebe24ab26a..f5282858746 100644 --- a/e2e/8_swapSheetFlow1.spec.ts +++ b/e2e/8_swapSheetFlow1.spec.ts @@ -24,8 +24,8 @@ import { afterAllcleanApp, fetchElementAttributes, tap, - delayTime, tapByText, + delayTime, } from './helpers'; import { expect } from '@jest/globals'; @@ -59,31 +59,30 @@ describe('Swap Sheet Interaction Flow', () => { }); it('Should open swap screen with 50% inputAmount for inputAsset', async () => { - await tap('swap-button'); - - // currently needed due to detox hanging on swap quotes await device.disableSynchronization(); + await tap('swap-button'); + await delayTime('long'); await tap('token-to-buy-dai-1'); const swapInput = await fetchElementAttributes('swap-asset-input'); // expect inputAsset === .5 * eth balance - expect(swapInput.elements[0].label).toContain('Ethereum'); - expect(swapInput.elements[0].label).toContain('10'); + expect(swapInput.label).toContain('ETH'); + expect(swapInput.label).toContain('10'); }); it('Should be able to go to review and execute a swap', async () => { await tapByText('Review'); - await delayTime('long'); const reviewActionElements = await fetchElementAttributes('swap-action-button'); expect(reviewActionElements.elements[0].label).toContain('ETH'); expect(reviewActionElements.elements[1].label).toContain('DAI'); expect(reviewActionElements.elements[2].label).toContain('Tap to Swap'); + await delayTime('long'); await tapByText('Tap to Swap'); }); - it('Should be able to see pending swap in activity', async () => { + it('Should be able to verify swap is happening', async () => { // allow swap to execute - await delayTime('long'); + await delayTime('very-long'); const activityListElements = await fetchElementAttributes('wallet-activity-list'); expect(activityListElements.label).toContain('ETH'); expect(activityListElements.label).toContain('DAI'); diff --git a/src/__swaps__/screens/Swap/components/CoinRow.tsx b/src/__swaps__/screens/Swap/components/CoinRow.tsx index 0c83e63da0a..a7b99bf9511 100644 --- a/src/__swaps__/screens/Swap/components/CoinRow.tsx +++ b/src/__swaps__/screens/Swap/components/CoinRow.tsx @@ -52,6 +52,7 @@ interface InputCoinRowProps { onPress: (asset: ParsedSearchAsset | null) => void; output?: false | undefined; uniqueId: string; + testID?: string; } type PartialAsset = Pick; @@ -62,11 +63,12 @@ interface OutputCoinRowProps extends PartialAsset { output: true; nativePriceChange?: string; isTrending?: boolean; + testID?: string; } type CoinRowProps = InputCoinRowProps | OutputCoinRowProps; -export const CoinRow = memo(function CoinRow({ isFavorite, onPress, output, uniqueId, ...assetProps }: CoinRowProps) { +export const CoinRow = memo(function CoinRow({ isFavorite, onPress, output, uniqueId, testID, ...assetProps }: CoinRowProps) { const inputAsset = userAssetsStore(state => (output ? undefined : state.getUserAsset(uniqueId))); const outputAsset = output ? (assetProps as PartialAsset) : undefined; @@ -116,7 +118,7 @@ export const CoinRow = memo(function CoinRow({ isFavorite, onPress, output, uniq if (!address || !chainId) return null; return ( - + diff --git a/src/__swaps__/screens/Swap/components/SearchInput.tsx b/src/__swaps__/screens/Swap/components/SearchInput.tsx index 29d54b43a39..9acdc4a0470 100644 --- a/src/__swaps__/screens/Swap/components/SearchInput.tsx +++ b/src/__swaps__/screens/Swap/components/SearchInput.tsx @@ -31,7 +31,6 @@ const CLOSE_LABEL = i18n.t(i18n.l.button.close); const PASTE_LABEL = i18n.t(i18n.l.button.paste); export const SearchInput = ({ - asset, handleExitSearchWorklet, handleFocusSearchWorklet, output, @@ -154,7 +153,6 @@ export const SearchInput = ({ { diff --git a/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx b/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx index f27c8a0ac30..0b53381665c 100644 --- a/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx +++ b/src/__swaps__/screens/Swap/components/SwapInputAsset.tsx @@ -56,7 +56,14 @@ function SwapInputAmount() { }} > } style={styles.inputTextMask}> - + {SwapInputController.formattedInputAmount} @@ -104,7 +111,7 @@ export function SwapInputAsset() { return ( - + diff --git a/src/__swaps__/screens/Swap/components/TokenList/TokenToBuyList.tsx b/src/__swaps__/screens/Swap/components/TokenList/TokenToBuyList.tsx index 057739a8f9d..7b88cd73136 100644 --- a/src/__swaps__/screens/Swap/components/TokenList/TokenToBuyList.tsx +++ b/src/__swaps__/screens/Swap/components/TokenList/TokenToBuyList.tsx @@ -123,6 +123,10 @@ export const TokenToBuyList = () => { return totalHeight / (numberOfHeaders + numberOfCoinRows); }, [sections]); + const getFormattedTestId = (name: string, chainId: ChainId) => { + return `token-to-buy-${name}-${chainId}`.toLowerCase().replace(/\s+/g, '-'); + }; + return ( { } return ( Date: Tue, 18 Jun 2024 13:57:16 -0500 Subject: [PATCH 6/6] debug logs --- .../screens/Swap/providers/swap-provider.tsx | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/__swaps__/screens/Swap/providers/swap-provider.tsx b/src/__swaps__/screens/Swap/providers/swap-provider.tsx index 8d462107927..454e29e045c 100644 --- a/src/__swaps__/screens/Swap/providers/swap-provider.tsx +++ b/src/__swaps__/screens/Swap/providers/swap-provider.tsx @@ -295,15 +295,29 @@ export const SwapProvider = ({ children }: SwapProviderProps) => { const executeSwap = () => { 'worklet'; - + console.log('__________________'); + console.log('__________________'); + console.log('executeSwap called'); + console.log('__________________'); + console.log('__________________'); + console.log('configProgress.value:', configProgress.value); if (configProgress.value !== NavigationSteps.SHOW_REVIEW) return; const inputAsset = internalSelectedInputAsset.value; const outputAsset = internalSelectedOutputAsset.value; const q = quote.value; - + console.log('inputAsset:', inputAsset); + console.log('outputAsset:', outputAsset); + console.log('quote:', q); // TODO: What other checks do we need here? if (isSwapping.value || !inputAsset || !outputAsset || !q || (q as QuoteError)?.error) { + console.log('Swap conditions not met:', { + isSwapping: isSwapping.value, + inputAsset, + outputAsset, + q, + quoteError: (q as QuoteError)?.error, + }); return; } @@ -311,8 +325,11 @@ export const SwapProvider = ({ children }: SwapProviderProps) => { SwapInputController.quoteFetchingInterval.stop(); const type = inputAsset.chainId !== outputAsset.chainId ? 'crosschainSwap' : 'swap'; + console.log('swap type:', type); const quoteData = q as QuoteTypeMap[typeof type]; + console.log('quoteData:', quoteData); const flashbots = (SwapSettings.flashbots.value && inputAsset.chainId === ChainId.mainnet) ?? false; + console.log('flashbots:', flashbots); const isNativeWrapOrUnwrap = isWrapEthWorklet({ @@ -328,6 +345,7 @@ export const SwapProvider = ({ children }: SwapProviderProps) => { // Do not deleeeet the comment below 😤 // About to get quote + console.log('isNativeWrapOrUnwrap:', isNativeWrapOrUnwrap); const parameters: Omit, 'gasParams' | 'gasFeeParamsBySpeed' | 'selectedGasFee'> = { sellAmount: quoteData.sellAmount?.toString(), buyAmount: quoteData.buyAmount?.toString(), @@ -344,6 +362,7 @@ export const SwapProvider = ({ children }: SwapProviderProps) => { }, flashbots, }; + console.log('parameters:', parameters); runOnJS(getNonceAndPerformSwap)({ type,