From 86b62c232f5c8fbacdfcde5c4cb9de2f59e45beb Mon Sep 17 00:00:00 2001 From: Uniswap Labs Service Account Date: Tue, 10 Sep 2024 20:35:13 +0000 Subject: [PATCH] ci(release): publish latest release --- CODEOWNERS | 1 - RELEASE | 29 +- VERSION | 2 +- apps/extension/src/app/OnboardingApp.tsx | 15 +- apps/extension/src/app/PopupApp.tsx | 21 +- apps/extension/src/app/SidebarApp.tsx | 26 +- .../src/app/components/PasswordInput.tsx | 2 +- .../components/Trace/TraceUserProperties.tsx | 4 +- .../src/app/components/buttons/CopyButton.tsx | 2 +- .../src/app/components/modal/InfoModal.tsx | 2 +- .../src/app/features/accounts/AccountItem.tsx | 2 +- .../accounts/AccountSwitcherScreen.tsx | 2 +- .../AccountSwitcherScreen.test.tsx.snap | 8 +- .../src/app/features/dapp/hooks.test.ts | 3 +- .../src/app/features/dapp/utils.test.ts | 10 +- .../dappRequests/DappRequestQueueContext.tsx | 4 +- .../EthSend/Swap/SwapDisplay.tsx | 2 +- .../PersonalSignRequestContent.tsx | 4 +- .../requestContent/WrapContent.tsx | 2 +- .../features/home/PortfolioActionButtons.tsx | 7 +- .../src/app/features/home/PortfolioHeader.tsx | 3 +- .../app/features/home/SwitchNetworksModal.tsx | 4 +- .../src/app/features/lockScreen/Locked.tsx | 4 +- .../onboarding/OnboardingScreenFrame.tsx | 2 +- .../features/onboarding/OnboardingWrapper.tsx | 2 +- .../src/app/features/onboarding/Password.tsx | 7 +- .../features/onboarding/create/NameWallet.tsx | 8 +- .../onboarding/create/ViewMnemonic.tsx | 19 +- .../onboarding/import/ImportMnemonic.tsx | 60 +- .../onboarding/import/SelectWallets.tsx | 23 +- .../intro/UnsupportedBrowserScreen.tsx | 4 +- .../onboarding/reset/ResetComplete.tsx | 2 +- .../src/app/features/onboarding/utils.ts | 20 - .../src/app/features/popups/ConnectPopup.tsx | 4 +- .../__snapshots__/ReceiveScreen.test.tsx.snap | 92 +- .../send/SendFormScreen/RecipientPanel.tsx | 2 +- .../send/SendFormScreen/SendFormScreen.tsx | 3 +- .../app/features/settings/DevMenuScreen.tsx | 6 +- .../RemoveRecoveryPhraseWallets.tsx | 14 +- .../ViewRecoveryPhraseScreen.tsx | 4 +- .../app/features/settings/SettingsScreen.tsx | 29 +- .../src/app/features/swap/SwapFlowScreen.tsx | 4 +- apps/extension/src/app/navigation/index.tsx | 16 +- apps/extension/src/app/saga.ts | 2 +- .../src/background/backgroundDappRequests.ts | 3 +- apps/extension/src/contentScript/injected.ts | 3 +- apps/extension/src/manifest.json | 2 +- apps/extension/src/store/migrations.test.ts | 32 +- apps/extension/src/store/migrations.ts | 10 +- apps/extension/src/store/schema.ts | 39 +- apps/extension/src/test/render.tsx | 10 +- apps/mobile/README.md | 38 - apps/mobile/android/README.md | 4 + apps/mobile/android/app/build.gradle | 10 +- .../app/src/main/assets/fonts/Basel-Book.ttf | Bin 0 -> 44472 bytes .../src/main/assets/fonts/Basel-Medium.ttf | Bin 0 -> 46472 bytes .../backup/ui/MnemonicConfirmation.kt | 1 - .../onboarding/backup/ui/MnemonicDisplay.kt | 1 - .../backup/ui/MnemonicWordsGroup.kt | 4 +- .../main/java/com/uniswap/theme/Typography.kt | 8 +- .../app/src/main/res/font/basel_bold.otf | Bin 0 -> 86628 bytes .../app/src/main/res/font/basel_book.otf | Bin 0 -> 84524 bytes .../src/main/res/font/basel_grotesk_book.otf | Bin 273636 -> 0 bytes .../main/res/font/basel_grotesk_medium.otf | Bin 275116 -> 0 bytes .../app/src/main/res/font/basel_medium.otf | Bin 0 -> 83828 bytes .../app/src/main/res/font/basel_semibold.otf | Bin 0 -> 85868 bytes .../src/main/res/font/inputmono_regular.ttf | Bin 109088 -> 0 bytes apps/mobile/android/link-assets-manifest.json | 8 +- .../Basel-Book.otf} | Bin .../Basel-Medium.otf} | Bin apps/mobile/ios/Fonts/Basel-Bold.otf | Bin 0 -> 86628 bytes apps/mobile/ios/Fonts/Basel-Book.otf | Bin 0 -> 84524 bytes apps/mobile/ios/Fonts/Basel-Medium.otf | Bin 0 -> 83828 bytes apps/mobile/ios/Fonts/Basel-Regular.otf | Bin 0 -> 82704 bytes apps/mobile/ios/Fonts/Basel-Semibold.otf | Bin 0 -> 85868 bytes apps/mobile/ios/Shared/ActionButtons.swift | 2 +- .../ios/Uniswap.xcodeproj/project.pbxproj | 105 +- apps/mobile/ios/Uniswap/Info.plist | 12 +- .../Backup/MnemonicConfirmationView.swift | 20 +- .../MnemonicConfirmationWordBankView.swift | 4 +- .../Backup/MnemonicDisplayView.swift | 6 +- .../Onboarding/Backup/MnemonicTextField.swift | 4 +- .../Import/SeedPhraseInputView.swift | 8 +- apps/mobile/ios/Widgets/Info.plist | 7 +- .../ios/WidgetsCore/Utils/UI/Styling.swift | 7 +- apps/mobile/ios/link-assets-manifest.json | 8 +- apps/mobile/jest-setup.js | 2 +- apps/mobile/src/app/App.tsx | 14 +- apps/mobile/src/app/migrations.test.ts | 30 +- apps/mobile/src/app/migrations.ts | 24 +- .../src/app/modals/AccountSwitcherModal.tsx | 2 +- apps/mobile/src/app/modals/AppModals.tsx | 5 - .../src/app/modals/BackupReminderModal.tsx | 51 +- .../src/app/modals/BackupWarningModal.tsx | 56 - .../AccountSwitcherModal.test.tsx.snap | 18 +- apps/mobile/src/app/navigation/NavBar.tsx | 6 +- apps/mobile/src/app/navigation/components.tsx | 19 - apps/mobile/src/app/navigation/types.ts | 2 +- apps/mobile/src/app/saga.ts | 2 +- apps/mobile/src/app/schema.ts | 49 +- apps/mobile/src/assets/fonts/Basel-Book.ttf | Bin 0 -> 44472 bytes .../src/assets/fonts/Basel-Grotesk-Book.otf | Bin 273636 -> 0 bytes .../src/assets/fonts/Basel-Grotesk-Medium.otf | Bin 275116 -> 0 bytes apps/mobile/src/assets/fonts/Basel-Medium.ttf | Bin 0 -> 46472 bytes .../PriceExplorer/PriceExplorer.tsx | 4 +- .../components/PriceExplorer/Text.test.tsx | 2 +- .../src/components/PriceExplorer/Text.tsx | 6 +- .../PriceExplorer/TimeRangeGroup.tsx | 2 +- .../__snapshots__/Text.test.tsx.snap | 27 +- .../src/components/PriceExplorer/usePrice.tsx | 4 +- .../PriceExplorer/usePriceHistory.test.ts | 4 +- .../PriceExplorer/usePriceHistory.ts | 2 +- .../QRCodeScanner/QRCodeScanner.tsx | 4 +- .../components/RecipientSelect/hooks.test.ts | 11 +- .../RemoveWallet/AssociatedAccountsList.tsx | 2 +- .../DappConnectedNetworksModal.tsx | 2 +- .../ConnectedDapps/DappConnectionItem.tsx | 2 +- .../ModalWithOverlay/ScrollDownOverlay.tsx | 2 +- .../Requests/RequestModal/ClientDetails.tsx | 2 +- .../RequestModal/UwULinkErc20SendModal.tsx | 2 +- .../WalletConnectRequestModal.tsx | 3 +- .../WalletConnectRequestModalContent.tsx | 10 +- .../ScanSheet/PendingConnectionModal.tsx | 2 +- .../src/components/Requests/Uwulink/utils.ts | 3 +- .../src/components/Settings/OnboardingRow.tsx | 2 - .../Settings/ResetBehaviorHistoryRow.tsx | 28 - .../src/components/Settings/SettingsRow.tsx | 7 +- .../components/Settings/WalletSettings.tsx | 2 +- .../TokenDetails/BuyNativeTokenModal.tsx | 2 +- .../components/TokenDetails/LinkButton.tsx | 2 +- .../components/TokenDetails/TokenBalances.tsx | 4 +- .../TokenDetails/TokenDetailsStats.tsx | 8 +- .../src/components/TokenDetails/hooks.test.ts | 6 +- .../TokenSelector/TokenFiatOnRampList.tsx | 106 +- .../Trace/TraceUserProperties.test.tsx | 6 +- .../components/Trace/TraceUserProperties.tsx | 4 +- .../accounts/AccountCardItem.test.tsx | 5 +- .../components/accounts/AccountCardItem.tsx | 4 +- .../src/components/accounts/AccountHeader.tsx | 3 +- .../components/accounts/AccountList.test.tsx | 6 +- .../AccountCardItem.test.tsx.snap | 6 +- .../__snapshots__/AccountHeader.test.tsx.snap | 10 +- .../__snapshots__/AccountList.test.tsx.snap | 9 +- .../__snapshots__/BackButton.test.tsx.snap | 3 +- .../CopyTextButton.test.tsx.snap | 6 +- .../__snapshots__/LinkButton.test.tsx.snap | 2 +- .../components/explore/FavoriteHeaderRow.tsx | 2 +- .../explore/FavoriteTokenCard.test.tsx | 19 +- .../components/explore/FavoriteTokenCard.tsx | 2 +- .../explore/FavoriteWalletCard.test.tsx | 10 +- .../components/explore/FavoriteWalletCard.tsx | 3 +- .../src/components/explore/SortButton.tsx | 2 +- .../src/components/explore/TokenItem.tsx | 4 +- .../src/components/explore/TokenItemChart.tsx | 2 +- .../FavoriteHeaderRow.test.tsx.snap | 12 +- .../FavoriteWalletCard.test.tsx.snap | 3 +- .../__snapshots__/SortButton.test.tsx.snap | 6 +- .../__snapshots__/TokenItem.test.tsx.snap | 18 +- .../src/components/explore/hooks.test.ts | 2 +- .../explore/search/SearchEmptySection.tsx | 2 +- .../search/SearchPopularTokens.test.tsx | 4 +- .../explore/search/SearchPopularTokens.tsx | 2 +- .../search/items/SearchENSAddressItem.tsx | 2 +- .../explore/search/items/SearchUnitagItem.tsx | 2 +- .../components/explore/search/utils.test.ts | 4 +- .../forceUpgrade/ForceUpgradeModal.tsx | 2 +- .../src/components/home/HomeExploreTab.tsx | 2 +- .../home/introCards/FundWalletModal.tsx | 9 +- .../components/home/introCards/IntroCard.tsx | 12 +- .../home/introCards/IntroCardStack.tsx | 4 +- .../introCards/OnboardingIntroCardStack.tsx | 86 +- .../src/components/input/PasswordInput.tsx | 3 - .../mnemonic/HiddenMnemonicWordView.tsx | 10 +- .../mnemonic/MnemonicConfirmation.tsx | 3 +- .../components/mnemonic/MnemonicDisplay.tsx | 6 +- .../src/components/text/AnimatedText.test.tsx | 25 +- .../src/components/text/LongMarkdownText.tsx | 2 +- apps/mobile/src/components/text/LongText.tsx | 2 +- .../__snapshots__/AnimatedText.test.tsx.snap | 27 - .../__snapshots__/DecimalNumber.test.tsx.snap | 15 +- .../LongMarkdownText.test.tsx.snap | 4 +- .../text/__snapshots__/LongText.test.tsx.snap | 3 +- .../TextWithFuseMatches.test.tsx.snap | 69 +- .../components/unitags/ChangeUnitagModal.tsx | 5 +- .../unitags/ChoosePhotoOptionsModal.tsx | 6 +- .../components/unitags/DeleteUnitagModal.tsx | 4 +- .../src/components/unitags/UnitagBanner.tsx | 6 +- .../CloudBackupForm/PasswordInput.tsx | 16 +- .../CloudBackup/CloudBackupForm/index.ts | 4 +- .../src/features/appRating/selectors.ts | 2 +- .../src/features/dataApi/balances.test.ts | 4 +- apps/mobile/src/features/dataApi/balances.ts | 3 + .../deepLinking/handleDeepLinkSaga.test.ts | 8 +- .../deepLinking/handleDeepLinkSaga.ts | 6 +- .../deepLinking/handleSwapLinkSaga.ts | 6 +- .../externalProfile/ProfileHeader.tsx | 10 +- .../fiatOnRamp/FiatOnRampAmountSection.tsx | 69 +- .../features/fiatOnRamp/FiatOnRampContext.tsx | 7 - .../fiatOnRamp/FiatOnRampTokenSelector.tsx | 10 - .../features/fiatOnRamp/OffRampPopover.tsx | 46 - .../src/features/firebase/firebaseDataSaga.ts | 7 +- .../src/features/import/InputWithSuffix.tsx | 4 +- .../GenericImportForm.test.tsx.snap | 12 +- .../mobile/src/features/modals/ModalsState.ts | 1 - apps/mobile/src/features/modals/modalSlice.ts | 6 - .../nfts/collection/ListPriceCard.tsx | 4 +- .../nfts/collection/NFTCollectionHeader.tsx | 2 +- .../nfts/item/CollectionPreviewCard.test.tsx | 2 +- .../CollectionPreviewCard.test.tsx.snap | 6 +- .../item/__snapshots__/traits.test.tsx.snap | 9 +- .../src/features/nfts/item/traits.test.tsx | 2 +- apps/mobile/src/features/nfts/item/traits.tsx | 5 +- .../onboarding/BackupSpeedBumpModal.tsx | 41 +- .../features/onboarding/OnboardingScreen.tsx | 32 +- .../src/features/onboarding/OptionCard.tsx | 17 +- .../SafeKeyboardOnboardingScreen.tsx | 17 +- apps/mobile/src/features/onboarding/hooks.ts | 14 +- .../src/features/openai/AIAssistantScreen.tsx | 3 +- .../features/scantastic/ScantasticModal.tsx | 10 +- .../src/features/send/SendFormButton.tsx | 3 +- .../src/features/send/SendFormScreen.tsx | 36 +- apps/mobile/src/features/send/SendHeader.tsx | 2 +- .../src/features/send/SendTokenForm.tsx | 3 +- .../unitags/ChooseProfilePictureScreen.tsx | 28 +- .../features/unitags/ClaimUnitagScreen.tsx | 34 +- apps/mobile/src/screens/DevScreen.tsx | 8 +- .../screens/ExchangeTransferConnecting.tsx | 3 - .../src/screens/FiatOnRampConnecting.tsx | 15 +- apps/mobile/src/screens/FiatOnRampScreen.tsx | 135 +- .../screens/FiatOnRampServiceProviders.tsx | 4 +- apps/mobile/src/screens/HomeScreen.tsx | 69 +- .../src/screens/Import/ImportMethodScreen.tsx | 10 +- .../screens/Import/OnDeviceRecoveryScreen.tsx | 2 +- .../Import/OnDeviceRecoveryWalletCard.tsx | 4 +- .../RestoreCloudBackupLoadingScreen.tsx | 8 +- .../RestoreCloudBackupPasswordScreen.tsx | 8 +- .../Import/RestoreCloudBackupScreen.tsx | 11 +- .../SeedPhraseInputScreen.android.mock.tsx | 4 +- .../screens/Import/SeedPhraseInputScreen.tsx | 7 +- .../src/screens/Import/SelectWalletScreen.tsx | 16 +- .../src/screens/Import/WatchWalletScreen.tsx | 11 +- ...oreCloudBackupPasswordScreen.test.tsx.snap | 122 +- .../RestoreCloudBackupScreen.test.tsx.snap | 101 +- .../screens/Import/useOnDeviceRecoveryData.ts | 67 +- apps/mobile/src/screens/NFTItemScreen.tsx | 8 +- .../src/screens/Onboarding/BackupScreen.tsx | 39 +- .../CloudBackupPasswordConfirmScreen.tsx | 24 +- .../CloudBackupPasswordCreateScreen.tsx | 2 - .../CloudBackupProcessingScreen.tsx | 18 +- .../src/screens/Onboarding/LandingScreen.tsx | 6 +- .../screens/Onboarding/ManualBackupScreen.tsx | 55 +- .../Onboarding/NotificationsSetupScreen.tsx | 25 +- .../Onboarding/SecuritySetupScreen.tsx | 31 +- .../src/screens/Onboarding/TermsOfService.tsx | 6 +- .../Onboarding/WelcomeWalletScreen.tsx | 18 +- .../__snapshots__/BackupScreen.test.tsx.snap | 630 +-- .../screens/SettingsBiometricAuthScreen.tsx | 5 +- .../src/screens/SettingsCloudBackupStatus.tsx | 4 +- .../src/screens/SettingsFiatCurrencyModal.tsx | 6 +- apps/mobile/src/screens/SettingsScreen.tsx | 24 +- apps/mobile/src/screens/SettingsWallet.tsx | 10 +- .../mobile/src/screens/SettingsWalletEdit.tsx | 1 - .../mobile/src/screens/TokenDetailsScreen.tsx | 23 +- apps/mobile/src/test/fixtures/explore.ts | 2 +- apps/mobile/src/test/render.tsx | 12 +- ...eader.test.ts => useAddBackButton.test.ts} | 19 +- ...igationHeader.tsx => useAddBackButton.tsx} | 20 +- .../src/utils/useOpenBackupReminderModal.ts | 48 +- apps/web/.depcheckrc | 116 +- apps/web/cypress/e2e/buy-crypto-form.test.ts | 1 + apps/web/cypress/e2e/landing.test.ts | 7 + apps/web/cypress/e2e/position.test.ts | 2 +- .../cypress/e2e/swap/swap.multichain.test.ts | 45 +- apps/web/cypress/e2e/token-details.test.ts | 4 +- apps/web/cypress/e2e/token-explore.test.ts | 4 +- apps/web/cypress/e2e/universal-search.test.ts | 2 +- apps/web/cypress/e2e/wallet-dropdown.test.ts | 6 +- apps/web/cypress/fixtures/token_projects.json | 1 - apps/web/cypress/fixtures/uni_token.json | 1 - apps/web/cypress/support/commands.ts | 19 +- apps/web/cypress/support/setupTests.ts | 1 + apps/web/package.json | 1 - .../announcement_modal_desktop2.png | Bin 563107 -> 0 bytes apps/web/public/nfts-sitemap.xml | 308 +- apps/web/public/pools-sitemap.xml | 3632 ++++---------- apps/web/public/tokens-sitemap.xml | 4382 +++-------------- .../MiniPortfolio/EmptyWallet.tsx | 2 +- .../MiniPortfolio/ExtensionDeeplinks.tsx | 2 +- .../OpenLimitOrdersButton.test.tsx.snap | 2 +- .../MiniPortfolio/Pools/cache.ts | 4 +- .../AccountDrawer/MiniPortfolio/shared.tsx | 2 +- .../components/AccountDrawer/SettingsMenu.tsx | 12 + .../AccountDrawer/SettingsToggle.tsx | 4 +- .../AccountDrawer/UniwalletModal.tsx | 9 +- .../__snapshots__/index.test.tsx.snap | 848 +++- .../components/AccountDrawer/index.test.tsx | 19 +- .../src/components/AccountDrawer/index.tsx | 2 +- .../src/components/AddressQRModal/index.tsx | 10 +- .../AddressQRModal/useAvatarColorProps.tsx | 82 + .../web/src/components/Charts/ChartHeader.tsx | 139 +- apps/web/src/components/Charts/ChartModel.tsx | 100 +- .../components/Charts/PriceChart/index.tsx | 45 +- .../Charts/SparklineChart/index.tsx | 14 +- .../Charts/StackedLineChart/index.tsx | 4 +- .../stacked-area-series/options.ts | 2 - .../stacked-area-series/renderer.ts | 88 +- .../src/components/Charts/TimeSelector.tsx | 125 +- .../CrosshairHighlightPrimitive.tsx | 28 +- .../VolumeChart/CustomVolumeChartModel.tsx | 26 +- .../VolumeChart/custom-histogram-series.tsx | 4 - .../Charts/VolumeChart/renderer.tsx | 40 +- apps/web/src/components/Charts/types.ts | 2 - apps/web/src/components/Common/index.tsx | 8 +- .../ConnectedAccountBlocked/index.tsx | 26 +- .../FeatureFlagModal/FeatureFlagModal.tsx | 3 + apps/web/src/components/Icons/AndroidLogo.tsx | 12 - .../src/components/Logo/QueryTokenLogo.tsx | 31 +- .../NavBar/ChainSelector/ChainSelectorRow.tsx | 4 +- .../components/NavBar/ChainSelector/index.tsx | 23 +- .../components/NavBar/CompanyMenu/Content.tsx | 1 - ...tton.test.tsx => GetTheAppButton.test.tsx} | 6 +- .../NavBar/DownloadApp/GetTheAppButton.tsx | 35 + .../NavBar/DownloadApp/Modal/Content.tsx | 38 +- .../NavBar/DownloadApp/Modal/GetStarted.tsx | 114 +- .../NavBar/DownloadApp/Modal/index.tsx | 106 +- .../NavBar/DownloadApp/NewUserCTAButton.tsx | 52 - .../GetTheAppButton.test.tsx.snap | 38 + .../NewUserCTAButton.test.tsx.snap | 34 - .../MobileBottomBar/MobileBottomBar.tsx | 53 +- .../NavBar/PreferencesMenu/Preferences.tsx | 2 +- .../SearchBar/RecentlySearchedAssets.ts | 195 +- .../NavBar/SearchBar/SearchBarDropdown.tsx | 29 +- .../NavBar/SearchBar/SuggestionRow.tsx | 43 +- .../components/NavBar/Tabs/TabsContent.tsx | 3 +- apps/web/src/components/NavBar/index.tsx | 58 +- .../Pools/PoolDetails/ChartSection/index.tsx | 13 +- .../PoolDetails/PoolDetailsHeader.test.tsx | 10 +- .../PoolDetails/PoolDetailsLink.test.tsx | 10 +- .../PoolDetails/PoolDetailsStats.test.tsx | 10 +- .../PoolDetailsStatsButtons.test.tsx | 10 +- .../PoolDetailsTransactionsTable.tsx | 8 +- .../PoolDetailsTransactionTable.test.tsx.snap | 1804 +++++-- .../components/Pools/PoolTable/PoolTable.tsx | 195 +- .../__snapshots__/PoolTable.test.tsx.snap | 2209 ++++++--- .../SearchModal/CurrencyList/index.tsx | 6 +- .../components/SearchModal/CurrencySearch.tsx | 120 +- .../Settings/MultipleRoutingOptions.test.tsx | 4 +- .../Settings/MultipleRoutingOptions.tsx | 10 +- .../RouterPreferenceSettings/index.tsx | 11 +- apps/web/src/components/Table/Cell.test.tsx | 2 +- apps/web/src/components/Table/Cell.tsx | 63 +- apps/web/src/components/Table/Filter.tsx | 91 +- .../Table/__snapshots__/styled.test.tsx.snap | 190 +- apps/web/src/components/Table/index.tsx | 26 +- apps/web/src/components/Table/styled.tsx | 338 +- apps/web/src/components/Toggle/index.tsx | 98 + apps/web/src/components/TokenSafety/index.tsx | 15 +- .../Tokens/TokenDetails/ActivitySection.tsx | 39 +- .../TokenDetails/ChartSection/index.tsx | 79 +- .../Tokens/TokenDetails/Skeleton.tsx | 239 +- .../TokenDetails/TokenDescription.test.tsx | 8 +- .../Tokens/TokenDetails/TokenDescription.tsx | 113 +- .../TokenDetails/TokenDetailsHeader.tsx | 4 +- .../__snapshots__/Skeleton.test.tsx.snap | 355 +- .../TokenDescription.test.tsx.snap | 542 +- .../components/Tokens/TokenDetails/index.tsx | 24 +- .../components/Tokens/TokenDetails/shared.ts | 8 +- .../tables/TokenDetailsPoolsTable.tsx | 1 + .../TokenDetails/tables/TransactionsTable.tsx | 78 +- .../TokenDetailsPoolsTable.test.tsx.snap | 2011 ++++++-- .../Tokens/TokenTable/NetworkFilter.tsx | 205 +- .../components/Tokens/TokenTable/index.tsx | 170 +- apps/web/src/components/Tokens/loading.tsx | 4 +- .../TopLevelBanners/MobileAppPromoBanner.tsx | 10 +- .../src/components/TopLevelModals/index.tsx | 5 +- .../WalletModal/DownloadWalletOption.tsx | 2 +- .../WalletModal/UniswapWalletOptions.test.tsx | 12 +- .../WalletModal/UniswapWalletOptions.tsx | 48 +- .../UniswapWalletOptions.test.tsx.snap | 180 +- apps/web/src/components/WalletModal/index.tsx | 56 +- .../Web3Provider/WebUniswapContext.tsx | 23 +- apps/web/src/components/Web3Status/index.tsx | 34 +- .../components/addLiquidity/PoolWarning.tsx | 6 +- .../src/components/swap/PriceImpactModal.tsx | 8 +- apps/web/src/constants/chains.test.ts | 3 +- apps/web/src/constants/lists.ts | 4 +- apps/web/src/global.css | 18 - apps/web/src/graphql/data/SearchTokens.ts | 20 +- apps/web/src/graphql/data/TopTokens.ts | 6 +- .../data/apollo/TokenBalancesProvider.tsx | 2 +- apps/web/src/graphql/data/nft/NftBalance.ts | 9 +- .../web/src/graphql/data/pools/useTopPools.ts | 7 +- apps/web/src/graphql/data/protocolStats.ts | 8 +- apps/web/src/graphql/data/util.tsx | 31 +- apps/web/src/hooks/Tokens.test.ts | 16 +- apps/web/src/hooks/Tokens.ts | 82 +- .../web/src/hooks/useAccountRiskCheck.test.ts | 46 +- apps/web/src/hooks/useAccountRiskCheck.ts | 27 +- apps/web/src/hooks/useIsExplorePage.ts | 5 - .../hooks/useShowSwapNetworkNotification.ts | 28 - apps/web/src/hooks/useSwitchChain.ts | 11 +- apps/web/src/hooks/useUniswapWalletOptions.ts | 32 +- apps/web/src/lib/utils/searchBar.test.ts | 121 - apps/web/src/lib/utils/searchBar.ts | 34 +- apps/web/src/pages/AddLiquidity/index.tsx | 6 +- .../Explore/charts/ExploreChartsSection.tsx | 189 +- apps/web/src/pages/Explore/index.tsx | 169 +- .../Explore/tables/RecentTransactions.tsx | 67 +- apps/web/src/pages/Landing/index.tsx | 9 +- apps/web/src/pages/Landing/sections/Hero.tsx | 2 +- .../web/src/pages/LegacyPool/PositionPage.tsx | 10 +- apps/web/src/pages/PoolDetails/index.test.tsx | 10 +- apps/web/src/pages/RemoveLiquidity/V3.tsx | 10 +- .../web/src/pages/Swap/Buy/CountryListRow.tsx | 2 +- .../src/pages/Swap/Buy/PredefinedAmount.tsx | 2 +- .../CountryListRow.test.tsx.snap | 4 +- .../PredefinedAmount.test.tsx.snap | 8 +- .../ProviderConnectionError.test.tsx.snap | 2 +- apps/web/src/pages/Swap/Buy/hooks.ts | 1 - apps/web/src/pages/Swap/Buy/test/constants.ts | 1 - apps/web/src/pages/Swap/Limit/LimitForm.tsx | 6 +- apps/web/src/pages/Vote/Landing.tsx | 9 +- apps/web/src/state/explore/index.tsx | 86 - apps/web/src/state/explore/protocolStats.ts | 89 - apps/web/src/state/explore/topPools.ts | 95 - apps/web/src/state/explore/topTokens.ts | 162 - apps/web/src/state/explore/types.ts | 15 - apps/web/src/state/index.ts | 2 +- apps/web/src/state/migrations.test.ts | 5 +- apps/web/src/state/migrations.ts | 6 - apps/web/src/state/migrations/1.ts | 4 +- apps/web/src/state/migrations/10.ts | 4 +- apps/web/src/state/migrations/11.ts | 4 +- apps/web/src/state/migrations/14.ts | 7 +- apps/web/src/state/migrations/15.test.ts | 150 - apps/web/src/state/migrations/15.ts | 70 - apps/web/src/state/migrations/16.test.ts | 67 - apps/web/src/state/migrations/16.ts | 32 - apps/web/src/state/migrations/17.test.ts | 136 - apps/web/src/state/migrations/17.ts | 44 - apps/web/src/state/migrations/3.ts | 6 +- apps/web/src/state/migrations/4.ts | 4 +- apps/web/src/state/migrations/5.ts | 4 +- apps/web/src/state/migrations/6.ts | 4 +- apps/web/src/state/migrations/7.ts | 4 +- apps/web/src/state/migrations/8.ts | 4 +- apps/web/src/state/migrations/oldTypes.ts | 6 - apps/web/src/state/reducerTypeTest.ts | 7 +- apps/web/src/state/swap/hooks.tsx | 15 +- apps/web/src/state/user/hooks.test.tsx | 2 +- apps/web/src/state/user/hooks.tsx | 13 +- apps/web/src/state/user/reducer.test.ts | 35 + apps/web/src/state/user/reducer.ts | 18 +- apps/web/src/state/user/types.ts | 8 +- apps/web/src/state/user/userAddedTokens.ts | 33 +- apps/web/src/state/user/utils.ts | 22 + apps/web/src/test-utils/bundle-size-test.ts | 4 +- apps/web/src/theme/components/index.tsx | 22 +- apps/web/src/theme/tamaguiProvider.tsx | 2 +- dangerfile.ts | 43 +- .../__snapshots__/preset.test.ts.snap | 19 - packages/eslint-config/native.js | 24 + packages/eslint-config/restrictedImports.js | 18 - packages/ui/package.json | 1 - .../assets/icons/alert-triangle-filled.svg | 3 - .../ui/src/assets/icons/alert-triangle.svg | 4 +- .../ui/src/assets/icons/app-store-logo.svg | 15 - packages/ui/src/assets/icons/bell-on.svg | 3 - packages/ui/src/assets/icons/check.svg | 11 +- packages/ui/src/assets/icons/cloud.svg | 4 +- packages/ui/src/assets/icons/download-alt.svg | 3 - .../ui/src/assets/icons/phone-download.svg | 5 - .../ui/src/assets/icons/photo-stacked.svg | 3 - packages/ui/src/assets/icons/photo.svg | 6 +- packages/ui/src/components/QRCode/QRCode.tsx | 199 - .../src/components/QRCode/QRCodeDisplay.tsx | 76 - .../custom-qr-code-generator/index.d.ts | 42 + .../QRCode/custom-qr-code-generator/index.js | 1 + .../custom-qr-code-generator/src/genMatrix.js | 10 + .../custom-qr-code-generator/src/index.jsx | 141 + .../src/transformMatrixIntoCirclePath.js | 25 + packages/ui/src/components/QRCode/index.tsx | 137 + packages/ui/src/components/Unicon/index.tsx | 4 +- packages/ui/src/components/button/Button.tsx | 12 +- .../ui/src/components/icons/AlertTriangle.tsx | 9 +- .../components/icons/AlertTriangleFilled.tsx | 16 - .../ui/src/components/icons/AppStoreLogo.tsx | 40 - packages/ui/src/components/icons/BellOn.tsx | 16 - packages/ui/src/components/icons/Check.tsx | 17 +- packages/ui/src/components/icons/Cloud.tsx | 6 +- .../ui/src/components/icons/DownloadAlt.tsx | 16 - .../ui/src/components/icons/PhoneDownload.tsx | 21 - packages/ui/src/components/icons/Photo.tsx | 15 +- .../ui/src/components/icons/PhotoStacked.tsx | 16 - packages/ui/src/components/icons/exported.ts | 6 - packages/ui/src/components/input/CheckBox.tsx | 2 +- packages/ui/src/components/layout/Flex.tsx | 3 - .../swipeablecards/SwipeableCard.native.tsx | 11 +- .../swipeablecards/SwipeableCard.tsx | 4 +- .../swipeablecards/SwipeableCard.web.tsx | 6 - .../SwipeableCardStack.native.tsx | 11 +- .../swipeablecards/SwipeableCardStack.tsx | 4 +- .../ui/src/components/swipeablecards/props.ts | 1 - packages/ui/src/components/switch/Switch.tsx | 202 - packages/ui/src/components/text/Text.tsx | 29 +- packages/ui/src/components/types.ts | 1 - packages/ui/src/index.ts | 12 +- packages/ui/src/tamagui.config.ts | 2 +- packages/ui/src/theme/animations.ts | 6 - packages/ui/src/theme/breakpoints.ts | 1 - packages/ui/src/theme/color/colors.ts | 22 +- packages/ui/src/theme/fonts.ts | 66 +- packages/ui/src/theme/iconSizes.ts | 1 - packages/ui/src/theme/media.ts | 1 - packages/ui/src/theme/tokens.ts | 1 - packages/ui/src/utils/tamagui.ts | 5 - packages/uniswap/jest-setup.js | 16 +- packages/uniswap/package.json | 17 +- .../src/components/BaseCard/BaseCard.tsx | 8 +- .../__snapshots__/BaseCard.test.tsx.snap | 12 +- .../TokenSelector/SuggestedToken.tsx | 2 +- .../TokenSelector/TokenOptionItem.tsx | 16 +- .../TokenSelector/TokenSectionBaseList.tsx | 8 +- .../TokenSelector/TokenSelector.tsx | 117 +- .../TokenSelectorEmptySearchList.tsx | 18 +- .../TokenSelector/TokenSelectorList.tsx | 17 +- .../TokenSelectorSearchResultsList.tsx | 30 +- .../TokenSelector/TokenSelectorSendList.tsx | 24 +- .../TokenSelectorSwapInputList.tsx | 42 +- .../TokenSelectorSwapOutputList.tsx | 53 +- .../src/components/TokenSelector/hooks.tsx | 210 +- .../src/components/TokenSelector/types.ts | 66 +- .../components/ViewGestureHandler/index.tsx | 4 +- .../src/components/buttons/PasteButton.tsx | 4 +- .../__snapshots__/PasteButton.test.tsx.snap | 12 +- .../src/components/icons/WarningIcon.tsx | 4 +- .../src/components/misc/ActionCard.tsx | 2 +- .../src/components/modals/HandleBar.tsx | 4 +- .../uniswap/src/components/modals/Modal.tsx | 8 +- .../components/modals/ScrollLock.native.tsx | 13 +- .../src/components/modals/ScrollLock.tsx | 51 +- .../src/components/modals/ScrollLock.web.tsx | 52 - .../uniswap/src/components/modals/hooks.ts | 4 +- .../modals/useBottomSheetSafeKeyboard.tsx | 4 +- .../src/components/network/NetworkFilter.tsx | 15 +- .../src/components/network/NetworkLogos.tsx | 2 +- .../src/components/network/NetworkPill.tsx | 2 +- .../__snapshots__/NetworkPill.test.tsx.snap | 12 +- .../src/components/pill/PillMultiToggle.tsx | 111 - .../pill/__snapshots__/Pill.test.tsx.snap | 9 +- .../src/components/text/LearnMoreLink.tsx | 2 +- .../__snapshots__/LearnMoreLink.test.tsx.snap | 6 +- packages/uniswap/src/constants/addresses.ts | 6 +- packages/uniswap/src/constants/chains.ts | 5 +- .../uniswap/src/contexts/UniswapContext.tsx | 26 +- .../src/data/apiClients/createApiClient.ts | 10 +- .../simpleHashApi/SimpleHashApiClient.ts | 32 - .../simpleHashApi/useSimpleHashNft.ts | 21 - .../apiClients/tradingApi/TradingApiClient.ts | 25 - .../tradingApi/useCheckApprovalQuery.ts | 22 - .../apiClients/uniswapApi/UniswapApiClient.ts | 14 - .../uniswapApi/useTrmScreenQuery.ts | 22 - .../apiClients/unitagsApi/UnitagsApiClient.ts | 8 - .../useUnitagsClaimEligibilityQuery.ts | 24 - packages/uniswap/src/data/cache.ts | 40 +- packages/uniswap/src/data/connectRpc.ts | 67 + packages/uniswap/src/data/links.ts | 31 + packages/uniswap/src/data/rest.ts | 164 + .../uniswap/src/data/rest/exploreStats.ts | 20 - packages/uniswap/src/data/rest/index.ts | 27 - .../uniswap/src/data/rest/protocolStats.ts | 20 - .../uniswap/src/data/tradingApi/client.ts | 40 + .../uniswap/src/features/address/avatar.ts | 31 - .../uniswap/src/features/dataApi/balances.ts | 70 +- packages/uniswap/src/features/ens/api.ts | 58 +- packages/uniswap/src/features/ens/useENS.ts | 4 +- .../FiatOnRampConnectingView.native.tsx | 15 +- .../fiatOnRamp/FiatOnRampConnectingView.tsx | 15 +- .../TokenSelectorBalanceDisplay.tsx | 67 - .../fiatOnRamp/UnsupportedTokenModal.tsx | 61 - .../uniswap/src/features/fiatOnRamp/types.ts | 5 +- .../uniswap/src/features/fiatOnRamp/utils.ts | 17 +- .../src/features/gating/experiments.ts | 1 - packages/uniswap/src/features/gating/flags.ts | 4 +- .../src/features/language/formatter.ts | 67 - .../src/features/notifications/constants.ts | 3 - .../uniswap/src/features/portfolio/api.ts | 49 +- .../providers/FlashbotsRpcProvider.test.ts | 74 - .../providers/FlashbotsRpcProvider.ts | 126 - .../providers/createEthersProvider.ts | 7 +- .../src/features/search/SearchResult.ts | 10 - .../src/features/search/SearchTextInput.tsx | 3 +- packages/uniswap/src/features/search/utils.ts | 15 - .../src/features/settings/selectors.ts | 3 - .../src/features/settings/slice.test.ts | 6 +- .../uniswap/src/features/settings/slice.ts | 20 +- .../src/features/telemetry/constants/trace.ts | 1 - .../features/telemetry/constants/wallet.ts | 1 - .../uniswap/src/features/telemetry/send.ts | 6 +- .../uniswap/src/features/telemetry/types.ts | 49 +- .../src/features/tokens/slice/hooks.ts | 35 +- .../src/features/tokens/slice/selectors.ts | 8 +- .../src/features/tokens/slice/slice.ts | 24 +- .../src/features/tokens/slice/types.ts | 26 - .../src/features/tokens/useCurrencyInfo.ts | 7 +- .../transactions/WarningModal/types.ts | 2 +- .../transactions/types/transactionDetails.ts | 3 - packages/uniswap/src/features/trm/hooks.ts | 22 - packages/uniswap/src/features/unitags/api.ts | 81 + .../uniswap/src/features/unitags/types.ts | 2 +- .../src/i18n/locales/source/en-US.json | 77 +- .../src/i18n/locales/translations/af-ZA.json | 30 +- .../src/i18n/locales/translations/ar-SA.json | 30 +- .../src/i18n/locales/translations/ca-ES.json | 30 +- .../src/i18n/locales/translations/cs-CZ.json | 30 +- .../src/i18n/locales/translations/da-DK.json | 30 +- .../src/i18n/locales/translations/de-DE.json | 30 +- .../src/i18n/locales/translations/el-GR.json | 30 +- .../src/i18n/locales/translations/es-ES.json | 30 +- .../src/i18n/locales/translations/fi-FI.json | 30 +- .../src/i18n/locales/translations/fr-FR.json | 30 +- .../src/i18n/locales/translations/he-IL.json | 30 +- .../src/i18n/locales/translations/hi-IN.json | 30 +- .../src/i18n/locales/translations/hu-HU.json | 30 +- .../src/i18n/locales/translations/id-ID.json | 30 +- .../src/i18n/locales/translations/it-IT.json | 30 +- .../src/i18n/locales/translations/ja-JP.json | 30 +- .../src/i18n/locales/translations/ko-KR.json | 30 +- .../src/i18n/locales/translations/ms-MY.json | 30 +- .../src/i18n/locales/translations/nl-NL.json | 30 +- .../src/i18n/locales/translations/no-NO.json | 30 +- .../src/i18n/locales/translations/pl-PL.json | 30 +- .../src/i18n/locales/translations/pt-BR.json | 30 +- .../src/i18n/locales/translations/pt-PT.json | 30 +- .../src/i18n/locales/translations/ro-RO.json | 30 +- .../src/i18n/locales/translations/ru-RU.json | 30 +- .../src/i18n/locales/translations/sl-SI.json | 30 +- .../src/i18n/locales/translations/sr-SP.json | 30 +- .../src/i18n/locales/translations/sv-SE.json | 30 +- .../src/i18n/locales/translations/sw-TZ.json | 30 +- .../src/i18n/locales/translations/th-TH.json | 24 +- .../src/i18n/locales/translations/tr-TR.json | 30 +- .../src/i18n/locales/translations/uk-UA.json | 30 +- .../src/i18n/locales/translations/ur-PK.json | 28 +- .../src/i18n/locales/translations/vi-VN.json | 30 +- .../src/i18n/locales/translations/zh-CN.json | 30 +- .../src/i18n/locales/translations/zh-TW.json | 30 +- packages/uniswap/src/test/fixtures/index.ts | 1 - .../uniswap/src/test/fixtures/lib/index.ts | 2 - .../src/test/fixtures/transactions/swap.ts | 89 - .../uniswap/src/test/fixtures/wallet/index.ts | 1 - packages/uniswap/src/test/mocks/index.ts | 1 - packages/uniswap/src/test/render.tsx | 149 +- packages/uniswap/src/test/test-utils.ts | 4 +- packages/uniswap/src/test/utils/index.ts | 2 - packages/uniswap/src/utils/clipboard.ts | 8 +- packages/uniswap/src/utils/currency.ts | 21 - packages/uniswap/src/utils/currencyId.ts | 10 +- packages/uniswap/src/utils/link.ts | 6 +- .../uniswap/src/utils/useKeyboardLayout.ts | 4 +- packages/utilities/src/device/locales.ts | 4 +- packages/utilities/src/errors/errors.test.ts | 14 +- packages/utilities/src/errors/index.ts | 9 +- .../utilities/src/format/localeBased.test.ts | 1 - packages/utilities/src/logger/Datadog.ts | 14 +- packages/utilities/src/logger/Datadog.web.ts | 4 +- packages/utilities/src/logger/Sentry.ts | 8 +- packages/utilities/src/logger/datadogLink.ts | 4 +- .../src/telemetry/analytics/analytics.ts | 14 +- packages/wallet/jest-setup.js | 2 +- packages/wallet/package.json | 6 + .../CurrencyLogo/LogoWithTxStatus.tsx | 10 +- .../src/components/ErrorBoundary/restart.ts | 4 +- .../components/QRCodeScanner/WalletQRCode.tsx | 12 +- .../QRCodeScanner/useQRColorProps.ts} | 20 +- .../RecipientSearch/RecipientList.tsx | 2 +- .../RecipientSelectSpeedBumps.tsx | 20 +- .../components/RecipientSearch/filter.test.ts | 2 +- .../src/components/RecipientSearch/filter.ts | 2 +- .../src/components/RecipientSearch/hooks.ts | 6 +- .../modals/NewAddressWarningModal.tsx | 2 +- .../components/RecipientSearch/utils.test.ts | 5 +- .../src/components/RecipientSearch/utils.ts | 2 +- .../TokenSelector/SelectTokenButton.tsx | 14 +- .../components/TokenSelector/filter.test.ts | 0 .../components/TokenSelector/hooks.test.ts | 32 +- .../src/components/TokenSelector/hooks.tsx | 165 + .../WalletPreviewCard.test.tsx | 2 +- .../WalletPreviewCard/WalletPreviewCard.tsx | 2 +- .../WalletPreviewCard.test.tsx.snap | 68 +- .../components/accounts/AddressDisplay.tsx | 8 +- .../components/accounts/DisplayNameText.tsx | 4 +- .../AccountDetails.test.tsx.snap | 12 +- .../DisplayNameText.test.tsx.snap | 12 +- .../wallet/src/components/buttons/Switch.tsx | 74 + .../src/components/gating/GatingOverrides.tsx | 19 +- .../src/components/input/AmountInput.tsx | 2 +- .../src/components/input/MaxAmountButton.tsx | 2 +- .../components/landing/LandingBackground.tsx | 4 +- .../landing/elements/BuyElement.tsx | 2 +- .../landing/elements/EmojiElement.tsx | 2 +- .../landing/elements/ReceiveUSDCElement.tsx | 2 +- .../landing/elements/TextElement.tsx | 2 +- .../legacy/CurrencyInputPanelLegacy.tsx | 4 +- .../modals/WarningModal/WarningModal.tsx | 4 +- .../modals/WarningModal/WarningTooltip.tsx | 4 +- .../src/components/network/NetworkFee.tsx | 2 +- .../__snapshots__/NetworkFee.test.tsx.snap | 18 +- .../wallet/src/components/network/hooks.ts | 2 +- .../src/components/nfts/NFTHiddenRow.tsx | 2 +- .../settings/AnalyticsToggleLineSwitch.tsx | 7 +- .../language/SettingsLanguageModal.tsx | 4 +- .../components/text/RelativeChange.test.tsx | 8 +- .../src/components/text/RelativeChange.tsx | 4 +- .../RelativeChange.test.tsx.snap | 9 +- .../wallet/src/features/accounts/hooks.ts | 5 +- .../wallet/src/features/activity/hooks.ts | 8 +- .../src/features/address/types.ts | 0 .../src/features/address/utils.ts | 0 .../wallet/src/features/appCheck/index.ts | 6 +- .../src/features/behaviorHistory/selectors.ts | 3 - .../src/features/behaviorHistory/slice.ts | 17 - .../wallet/src/features/contracts/hooks.ts | 11 +- .../src/features/dataApi/balances.test.ts | 35 +- .../wallet/src/features/dataApi/balances.ts | 52 + .../src/features/dataApi/searchTokens.test.ts | 7 +- .../features/dataApi/tokenProject.test.tsx | 7 +- .../src/features/dataApi/topTokens.test.ts | 7 +- .../src/features/dataApi/utils.test.ts | 5 +- .../src/features/fiatCurrency/constants.ts | 0 .../src/features/fiatCurrency/conversion.ts | 6 +- .../src/features/fiatCurrency/hooks.ts | 11 +- .../wallet/src/features/fiatCurrency/slice.ts | 25 + .../wallet/src/features/fiatOnRamp/hooks.ts | 46 +- .../wallet/src/features/images/ImageUri.tsx | 4 +- .../src/features/images/NFTPreviewImage.tsx | 10 +- .../wallet/src/features/images/WebSvgUri.tsx | 4 +- packages/wallet/src/features/images/hooks.ts | 58 + .../features/language/LocalizationContext.tsx | 4 +- .../src/features/language/constants.ts | 0 .../wallet/src/features/language/formatter.ts | 70 + .../src/features/language/hooks.tsx | 4 +- .../src/features/language/localizedDayjs.ts | 4 +- .../src/features/language/saga.ts | 17 +- .../wallet/src/features/language/slice.ts | 31 + .../NotSupportedNetworkNotification.tsx | 4 +- .../components/NotificationToast.tsx | 41 +- .../components/SwapNotification.tsx | 2 +- .../components/SwapPendingNotification.tsx | 3 +- .../TransferCurrencyNotification.tsx | 16 +- .../components/TransferNFTNotification.tsx | 14 +- .../components/UnknownNotification.tsx | 4 +- .../components/WrapNotification.tsx | 2 +- ...SupportedNetworkNotification.test.tsx.snap | 3 +- .../notifications/notificationWatcherSaga.ts | 4 +- .../src/features/notifications/utils.ts | 2 +- .../features/onboarding/OnboardingContext.tsx | 21 +- .../hooks/useImportableAccounts.tsx | 186 +- .../hooks/useSelectAccounts.test.ts | 10 +- .../onboarding/hooks/useSelectAccounts.tsx | 13 +- .../src/features/portfolio/AnimatedNumber.tsx | 2 +- .../features/portfolio/HiddenTokensRow.tsx | 2 +- .../features/portfolio/PortfolioBalance.tsx | 9 +- .../features/portfolio/TokenBalanceItem.tsx | 2 +- .../portfolio/TokenBalanceListContext.tsx | 4 + .../portfolio/useTokenContextMenu.tsx | 4 +- .../src/features/providers/ProviderManager.ts | 68 +- .../src/features/tokens/hooks.ts | 0 .../BuyNativeTokenButton.tsx | 2 +- .../InsufficientNativeTokenBaseComponent.tsx | 4 +- .../InsufficientNativeTokenWarning.native.tsx | 2 +- .../InsufficientNativeTokenWarning.tsx | 4 +- .../InsufficientNativeTokenWarning.web.tsx | 2 +- .../useInsufficientNativeTokenWarning.tsx | 2 +- .../ApproveTransactionDetails.tsx | 2 +- .../DetailsModal/OnRampTransactionDetails.tsx | 2 +- .../DetailsModal/SwapTransactionDetails.tsx | 2 +- .../TransactionDetailsInfoRows.tsx | 2 +- .../TransactionDetailsModal.test.tsx | 2 +- .../DetailsModal/TransactionDetailsModal.tsx | 2 +- .../TransferTransactionDetails.tsx | 2 +- .../NftTransactionDetails.test.tsx.snap | 6 +- .../SwapTransactionDetails.test.tsx.snap | 6 +- .../TransactionDetailsModal.test.tsx.snap | 30 +- .../SummaryCards/DetailsModal/hooks.ts | 2 +- .../SummaryCards/DetailsModal/utils.ts | 2 +- .../SummaryItems/ApproveSummaryItem.tsx | 2 +- .../SummaryItems/CancelConfirmationView.tsx | 2 +- .../OnRampTransferSummaryItem.tsx | 2 +- .../SummaryItems/SwapSummaryItem.tsx | 2 +- .../SummaryItems/TransactionActionsModal.tsx | 2 +- .../SummaryItems/TransactionSummaryLayout.tsx | 15 +- .../SummaryItems/TransferTokenSummaryItem.tsx | 2 +- .../SummaryItems/WrapSummaryItem.tsx | 2 +- .../transactions/SummaryCards/utils.ts | 10 +- .../TransactionDetails/FeeOnTransferFee.tsx | 2 +- .../TransactionDetails/SwapFee.tsx | 2 +- .../TransactionDetails/TransactionDetails.tsx | 68 +- .../TransactionHistoryUpdater.test.tsx | 12 +- .../TransactionHistoryUpdater.tsx | 2 +- .../TransactionRequest/AddressFooter.tsx | 4 +- .../TransactionRequest/NetworkFeeFooter.tsx | 2 +- .../TransactionRequest/SpendingDetails.tsx | 2 +- .../contexts/WalletUniswapContext.tsx | 12 +- .../history/conversion/conversion.test.ts | 2 +- .../conversion/parseTradeTransaction.ts | 1 + .../features/transactions/history/utils.ts | 2 +- .../wallet/src/features/transactions/hooks.ts | 2 +- .../useAllTransactionsBetweenAddresses.ts | 2 +- .../hooks/useSwapWarnings.test.ts | 3 +- .../transactions/hooks/useSwapWarnings.tsx | 2 +- .../useSyncFiatAndTokenAmountUpdater.tsx | 2 +- .../hooks/useTokenAndFiatDisplayAmounts.tsx | 4 +- .../features/transactions/orderWatcherSaga.ts | 12 +- .../src/features/transactions/selectors.ts | 39 +- .../features/transactions/send/GasFeeRow.tsx | 2 +- .../transactions/send/SendAmountInput.tsx | 2 +- .../transactions/send/SendReviewDetails.tsx | 8 +- .../transactions/send/TokenSelectorPanel.tsx | 40 +- .../send/hooks/useSendCallback.ts | 4 +- .../send/hooks/useSendWarnings.test.ts | 3 +- .../transactions/sendTransactionSaga.test.ts | 118 +- .../transactions/sendTransactionSaga.ts | 56 +- .../transactions/swap/CurrencyInputPanel.tsx | 6 +- .../features/transactions/swap/DecimalPad.tsx | 2 +- .../swap/GasAndWarningRows.native.tsx | 4 +- .../transactions/swap/GasAndWarningRows.tsx | 4 +- .../swap/GasAndWarningRows.web.tsx | 4 +- .../transactions/swap/MaxSlippageRow.tsx | 4 +- .../swap/SlippageWarningContent.tsx | 14 +- .../transactions/swap/SwapDetails.tsx | 4 +- .../features/transactions/swap/SwapFlow.tsx | 15 + .../transactions/swap/SwapFormButton.tsx | 4 +- .../transactions/swap/SwapFormHeader.tsx | 6 +- .../transactions/swap/SwapFormScreen.tsx | 10 +- .../transactions/swap/SwapRateRatio.tsx | 2 +- .../transactions/swap/SwapTokenSelector.tsx | 64 +- .../swap/TransactionAmountsReview.tsx | 2 +- .../features/transactions/swap/analytics.ts | 2 +- .../swap/hooks/useExactOutputWillFail.test.ts | 2 +- .../swap/hooks/useMostRecentSwapTx.ts | 2 +- .../swap/modals/FeeOnTransferWarning.tsx | 2 +- .../swap/modals/NetworkFeeWarning.tsx | 14 +- .../swap/modals/PriceImpactWarning.tsx | 4 +- .../swap/modals/QueuedOrderModal.tsx | 12 +- .../swap/modals/SwapFeeWarning.tsx | 2 +- .../transactions/swap/modals/UniswapXInfo.tsx | 2 +- .../settings/configs/Slippage.native.tsx | 14 +- .../swap/modals/settings/configs/Slippage.tsx | 91 +- .../modals/settings/configs/Slippage.web.tsx | 96 - .../settings/configs/SwapProtection.tsx | 10 +- .../transactions/swap/submitOrderSaga.test.ts | 14 +- .../transactions/swap/submitOrderSaga.ts | 8 +- .../transactions/swap/swapSaga.test.ts | 37 +- .../features/transactions/swap/swapSaga.ts | 57 +- .../api/hooks/useSwapTxAndGasInfo.test.ts | 90 - .../trade/api/hooks/useSwapTxAndGasInfo.ts | 21 - .../trade/api/hooks/useTokenApprovalInfo.ts | 26 +- .../api/hooks/useTransactionRequestInfo.ts | 12 +- .../hooks/useShowSwapNetworkNotification.ts | 38 +- .../swap/trade/hooks/useSwapCallback.ts | 2 +- .../swap/trade/hooks/useUSDTokenUpdater.ts | 2 +- .../src/features/transactions/swap/utils.ts | 13 +- .../transactionWatcherSaga.test.ts | 3 +- .../transactions/transactionWatcherSaga.ts | 31 +- .../src/features/transactions/utils.test.ts | 3 +- .../wallet/src/features/transactions/utils.ts | 17 - packages/wallet/src/features/trm/hooks.ts | 30 +- packages/wallet/src/features/unitags/api.ts | 25 + packages/wallet/src/features/unitags/hooks.ts | 53 +- .../features/wallet/Keyring/Keyring.native.ts | 4 +- .../features/wallet/Keyring/Keyring.test.ts | 6 +- .../src/features/wallet/Keyring/Keyring.ts | 60 +- .../features/wallet/Keyring/Keyring.web.ts | 32 +- .../wallet/src/features/wallet/context.tsx | 26 +- packages/wallet/src/features/wallet/hooks.ts | 30 +- packages/wallet/src/provider/index.tsx | 2 +- .../wallet/src/provider/tamagui-provider.tsx | 2 +- packages/wallet/src/state/walletMigrations.ts | 81 - .../wallet/src/state/walletMigrationsTests.ts | 44 - packages/wallet/src/state/walletReducer.ts | 6 + .../src/test/fixtures/gql/activities/index.ts | 14 +- .../src/test/fixtures/gql/activities/nfts.ts | 2 +- .../src/test/fixtures/gql/activities/swap.ts | 2 +- .../test/fixtures/gql/activities/tokens.ts | 4 +- .../src/test/fixtures/gql/amounts.ts | 0 .../src/test/fixtures/gql/assets/constants.ts | 0 .../src/test/fixtures/gql/assets/index.ts | 0 .../src/test/fixtures/gql/assets/nfts.ts | 5 +- .../src/test/fixtures/gql/assets/tokens.ts | 12 +- .../src/test/fixtures/gql/history.ts | 5 +- .../src/test/fixtures/gql/index.ts | 0 .../src/test/fixtures/gql/misc.ts | 0 .../src/test/fixtures/gql/portfolio.ts | 9 +- .../src/test/fixtures/gql/transactions.ts | 0 packages/wallet/src/test/fixtures/index.ts | 3 + .../wallet/src/test/fixtures/lib/index.ts | 2 + .../src/test/fixtures/lib/netinfo.ts | 1 - .../src/test/fixtures/lib/sdk.ts | 0 .../src/test/fixtures/wallet/accounts.ts | 2 +- .../src/test/fixtures/wallet/balances.ts | 4 +- .../wallet/src/test/fixtures/wallet/index.ts | 1 + .../src/test/fixtures/wallet/recipients.ts | 2 +- .../src/test/mocks/gql/index.ts | 0 .../src/test/mocks/gql/mocks.ts | 2 +- .../src/test/mocks/gql/provider.tsx | 6 +- .../src/test/mocks/gql/resolvers.ts | 2 +- packages/wallet/src/test/mocks/index.ts | 1 + packages/wallet/src/test/mocks/utils.ts | 4 +- packages/wallet/src/test/render.tsx | 10 +- packages/wallet/src/test/test-utils.ts | 1 + .../src/test/utils/array.ts | 0 packages/wallet/src/test/utils/index.ts | 3 + .../src/test/utils/resolvers.ts | 0 .../src/test/utils/wallet}/balances.ts | 2 +- .../wallet/src/test/utils/wallet/index.ts | 1 + packages/wallet/src/utils/currency.ts | 2 +- packages/wallet/src/utils/layout.ts | 35 - packages/wallet/src/utils/linking.ts | 7 +- packages/wallet/tsconfig.json | 2 +- turbo.json | 25 +- yarn.lock | 42 +- 922 files changed, 15196 insertions(+), 20434 deletions(-) delete mode 100644 CODEOWNERS create mode 100644 apps/mobile/android/README.md create mode 100644 apps/mobile/android/app/src/main/assets/fonts/Basel-Book.ttf create mode 100644 apps/mobile/android/app/src/main/assets/fonts/Basel-Medium.ttf create mode 100644 apps/mobile/android/app/src/main/res/font/basel_bold.otf create mode 100644 apps/mobile/android/app/src/main/res/font/basel_book.otf delete mode 100644 apps/mobile/android/app/src/main/res/font/basel_grotesk_book.otf delete mode 100644 apps/mobile/android/app/src/main/res/font/basel_grotesk_medium.otf create mode 100644 apps/mobile/android/app/src/main/res/font/basel_medium.otf create mode 100644 apps/mobile/android/app/src/main/res/font/basel_semibold.otf delete mode 100644 apps/mobile/android/app/src/main/res/font/inputmono_regular.ttf rename apps/mobile/{android/app/src/main/assets/fonts/Basel-Grotesk-Book.otf => ios/Basel-Book.otf} (100%) rename apps/mobile/{android/app/src/main/assets/fonts/Basel-Grotesk-Medium.otf => ios/Basel-Medium.otf} (100%) create mode 100644 apps/mobile/ios/Fonts/Basel-Bold.otf create mode 100644 apps/mobile/ios/Fonts/Basel-Book.otf create mode 100644 apps/mobile/ios/Fonts/Basel-Medium.otf create mode 100644 apps/mobile/ios/Fonts/Basel-Regular.otf create mode 100644 apps/mobile/ios/Fonts/Basel-Semibold.otf delete mode 100644 apps/mobile/src/app/modals/BackupWarningModal.tsx create mode 100644 apps/mobile/src/assets/fonts/Basel-Book.ttf delete mode 100644 apps/mobile/src/assets/fonts/Basel-Grotesk-Book.otf delete mode 100644 apps/mobile/src/assets/fonts/Basel-Grotesk-Medium.otf create mode 100644 apps/mobile/src/assets/fonts/Basel-Medium.ttf delete mode 100644 apps/mobile/src/components/Settings/ResetBehaviorHistoryRow.tsx delete mode 100644 apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap delete mode 100644 apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx rename apps/mobile/src/utils/{useNavigationHeader.test.ts => useAddBackButton.test.ts} (53%) rename apps/mobile/src/utils/{useNavigationHeader.tsx => useAddBackButton.tsx} (52%) delete mode 100644 apps/web/cypress/fixtures/token_projects.json delete mode 100644 apps/web/cypress/fixtures/uni_token.json delete mode 100644 apps/web/public/images/extension_promo/announcement_modal_desktop2.png create mode 100644 apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx delete mode 100644 apps/web/src/components/Icons/AndroidLogo.tsx rename apps/web/src/components/NavBar/DownloadApp/{NewUserCTAButton.test.tsx => GetTheAppButton.test.tsx} (68%) create mode 100644 apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.tsx delete mode 100644 apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx create mode 100644 apps/web/src/components/NavBar/DownloadApp/__snapshots__/GetTheAppButton.test.tsx.snap delete mode 100644 apps/web/src/components/NavBar/DownloadApp/__snapshots__/NewUserCTAButton.test.tsx.snap create mode 100644 apps/web/src/components/Toggle/index.tsx delete mode 100644 apps/web/src/hooks/useIsExplorePage.ts delete mode 100644 apps/web/src/hooks/useShowSwapNetworkNotification.ts delete mode 100644 apps/web/src/lib/utils/searchBar.test.ts delete mode 100644 apps/web/src/state/explore/index.tsx delete mode 100644 apps/web/src/state/explore/protocolStats.ts delete mode 100644 apps/web/src/state/explore/topPools.ts delete mode 100644 apps/web/src/state/explore/topTokens.ts delete mode 100644 apps/web/src/state/explore/types.ts delete mode 100644 apps/web/src/state/migrations/15.test.ts delete mode 100644 apps/web/src/state/migrations/15.ts delete mode 100644 apps/web/src/state/migrations/16.test.ts delete mode 100644 apps/web/src/state/migrations/16.ts delete mode 100644 apps/web/src/state/migrations/17.test.ts delete mode 100644 apps/web/src/state/migrations/17.ts delete mode 100644 apps/web/src/state/migrations/oldTypes.ts create mode 100644 apps/web/src/state/user/utils.ts delete mode 100644 packages/ui/src/assets/icons/alert-triangle-filled.svg delete mode 100644 packages/ui/src/assets/icons/app-store-logo.svg delete mode 100644 packages/ui/src/assets/icons/bell-on.svg delete mode 100644 packages/ui/src/assets/icons/download-alt.svg delete mode 100644 packages/ui/src/assets/icons/phone-download.svg delete mode 100644 packages/ui/src/assets/icons/photo-stacked.svg delete mode 100644 packages/ui/src/components/QRCode/QRCode.tsx delete mode 100644 packages/ui/src/components/QRCode/QRCodeDisplay.tsx create mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/index.d.ts create mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/index.js create mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/src/genMatrix.js create mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/src/index.jsx create mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/src/transformMatrixIntoCirclePath.js create mode 100644 packages/ui/src/components/QRCode/index.tsx delete mode 100644 packages/ui/src/components/icons/AlertTriangleFilled.tsx delete mode 100644 packages/ui/src/components/icons/AppStoreLogo.tsx delete mode 100644 packages/ui/src/components/icons/BellOn.tsx delete mode 100644 packages/ui/src/components/icons/DownloadAlt.tsx delete mode 100644 packages/ui/src/components/icons/PhoneDownload.tsx delete mode 100644 packages/ui/src/components/icons/PhotoStacked.tsx delete mode 100644 packages/ui/src/components/swipeablecards/SwipeableCard.web.tsx delete mode 100644 packages/ui/src/components/switch/Switch.tsx delete mode 100644 packages/ui/src/components/types.ts delete mode 100644 packages/ui/src/utils/tamagui.ts delete mode 100644 packages/uniswap/src/components/modals/ScrollLock.web.tsx delete mode 100644 packages/uniswap/src/components/pill/PillMultiToggle.tsx delete mode 100644 packages/uniswap/src/data/apiClients/simpleHashApi/SimpleHashApiClient.ts delete mode 100644 packages/uniswap/src/data/apiClients/simpleHashApi/useSimpleHashNft.ts delete mode 100644 packages/uniswap/src/data/apiClients/tradingApi/useCheckApprovalQuery.ts delete mode 100644 packages/uniswap/src/data/apiClients/uniswapApi/useTrmScreenQuery.ts delete mode 100644 packages/uniswap/src/data/apiClients/unitagsApi/useUnitagsClaimEligibilityQuery.ts create mode 100644 packages/uniswap/src/data/connectRpc.ts create mode 100644 packages/uniswap/src/data/rest.ts delete mode 100644 packages/uniswap/src/data/rest/exploreStats.ts delete mode 100644 packages/uniswap/src/data/rest/index.ts delete mode 100644 packages/uniswap/src/data/rest/protocolStats.ts create mode 100644 packages/uniswap/src/data/tradingApi/client.ts delete mode 100644 packages/uniswap/src/features/address/avatar.ts delete mode 100644 packages/uniswap/src/features/fiatOnRamp/TokenSelectorBalanceDisplay.tsx delete mode 100644 packages/uniswap/src/features/fiatOnRamp/UnsupportedTokenModal.tsx delete mode 100644 packages/uniswap/src/features/notifications/constants.ts delete mode 100644 packages/uniswap/src/features/providers/FlashbotsRpcProvider.test.ts delete mode 100644 packages/uniswap/src/features/providers/FlashbotsRpcProvider.ts delete mode 100644 packages/uniswap/src/features/search/utils.ts delete mode 100644 packages/uniswap/src/features/tokens/slice/types.ts delete mode 100644 packages/uniswap/src/features/trm/hooks.ts create mode 100644 packages/uniswap/src/features/unitags/api.ts delete mode 100644 packages/uniswap/src/test/fixtures/transactions/swap.ts delete mode 100644 packages/uniswap/src/test/mocks/index.ts rename packages/{uniswap/src/features/address/color.ts => wallet/src/components/QRCodeScanner/useQRColorProps.ts} (78%) rename packages/{uniswap => wallet}/src/components/TokenSelector/filter.test.ts (100%) rename packages/{uniswap => wallet}/src/components/TokenSelector/hooks.test.ts (96%) create mode 100644 packages/wallet/src/components/TokenSelector/hooks.tsx create mode 100644 packages/wallet/src/components/buttons/Switch.tsx rename packages/{uniswap => wallet}/src/features/address/types.ts (100%) rename packages/{uniswap => wallet}/src/features/address/utils.ts (100%) create mode 100644 packages/wallet/src/features/dataApi/balances.ts rename packages/{uniswap => wallet}/src/features/dataApi/searchTokens.test.ts (79%) rename packages/{uniswap => wallet}/src/features/dataApi/tokenProject.test.tsx (77%) rename packages/{uniswap => wallet}/src/features/dataApi/topTokens.test.ts (84%) rename packages/{uniswap => wallet}/src/features/dataApi/utils.test.ts (97%) rename packages/{uniswap => wallet}/src/features/fiatCurrency/constants.ts (100%) rename packages/{uniswap => wallet}/src/features/fiatCurrency/conversion.ts (95%) rename packages/{uniswap => wallet}/src/features/fiatCurrency/hooks.ts (92%) create mode 100644 packages/wallet/src/features/fiatCurrency/slice.ts create mode 100644 packages/wallet/src/features/images/hooks.ts rename packages/{uniswap => wallet}/src/features/language/LocalizationContext.tsx (92%) rename packages/{uniswap => wallet}/src/features/language/constants.ts (100%) create mode 100644 packages/wallet/src/features/language/formatter.ts rename packages/{uniswap => wallet}/src/features/language/hooks.tsx (97%) rename packages/{uniswap => wallet}/src/features/language/localizedDayjs.ts (96%) rename packages/{uniswap => wallet}/src/features/language/saga.ts (88%) create mode 100644 packages/wallet/src/features/language/slice.ts rename packages/{uniswap => wallet}/src/features/tokens/hooks.ts (100%) rename packages/{uniswap => wallet}/src/features/transactions/selectors.ts (80%) delete mode 100644 packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.web.tsx delete mode 100644 packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.test.ts rename packages/{uniswap => wallet}/src/test/fixtures/gql/activities/index.ts (89%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/activities/nfts.ts (94%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/activities/swap.ts (93%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/activities/tokens.ts (92%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/amounts.ts (100%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/assets/constants.ts (100%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/assets/index.ts (100%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/assets/nfts.ts (88%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/assets/tokens.ts (96%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/history.ts (91%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/index.ts (100%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/misc.ts (100%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/portfolio.ts (77%) rename packages/{uniswap => wallet}/src/test/fixtures/gql/transactions.ts (100%) create mode 100644 packages/wallet/src/test/fixtures/lib/index.ts rename packages/{uniswap => wallet}/src/test/fixtures/lib/netinfo.ts (93%) rename packages/{uniswap => wallet}/src/test/fixtures/lib/sdk.ts (100%) rename packages/{uniswap => wallet}/src/test/fixtures/wallet/balances.ts (93%) rename packages/{uniswap => wallet}/src/test/mocks/gql/index.ts (100%) rename packages/{uniswap => wallet}/src/test/mocks/gql/mocks.ts (98%) rename packages/{uniswap => wallet}/src/test/mocks/gql/provider.tsx (86%) rename packages/{uniswap => wallet}/src/test/mocks/gql/resolvers.ts (87%) rename packages/{uniswap => wallet}/src/test/utils/array.ts (100%) create mode 100644 packages/wallet/src/test/utils/index.ts rename packages/{uniswap => wallet}/src/test/utils/resolvers.ts (100%) rename packages/{uniswap/src/utils => wallet/src/test/utils/wallet}/balances.ts (87%) create mode 100644 packages/wallet/src/test/utils/wallet/index.ts delete mode 100644 packages/wallet/src/utils/layout.ts diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index f70773659eb..00000000000 --- a/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @uniswap/web-admins diff --git a/RELEASE b/RELEASE index 7dc48a0c557..cd199d7c2e8 100644 --- a/RELEASE +++ b/RELEASE @@ -1,24 +1,11 @@ -IPFS hash of the deployment: -- CIDv0: `QmZnW9JioRugnBAzvSbo2kEYERqzoHTTvbxJhGSnWqRVG3` -- CIDv1: `bafybeifkb74n6zzyd2lqtflyz2hvlmgzms5b7jevm3cldxtyzcowqu4h7a` +We are back with some new new updates! Here’s the latest: -The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org). - -You can also access the Uniswap Interface from an IPFS gateway. -**BEWARE**: The Uniswap interface uses [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) to remember your settings, such as which tokens you have imported. -**You should always use an IPFS gateway that enforces origin separation**, or our hosted deployment of the latest release at [app.uniswap.org](https://app.uniswap.org). -Your Uniswap settings are never remembered across different URLs. - -IPFS gateways: -- https://bafybeifkb74n6zzyd2lqtflyz2hvlmgzms5b7jevm3cldxtyzcowqu4h7a.ipfs.dweb.link/ -- https://bafybeifkb74n6zzyd2lqtflyz2hvlmgzms5b7jevm3cldxtyzcowqu4h7a.ipfs.cf-ipfs.com/ -- [ipfs://QmZnW9JioRugnBAzvSbo2kEYERqzoHTTvbxJhGSnWqRVG3/](ipfs://QmZnW9JioRugnBAzvSbo2kEYERqzoHTTvbxJhGSnWqRVG3/) - -### 5.45.5 (2024-09-09) - - -### Bug Fixes - -* **web:** Add unsupported style to Explore Table network options - prod (#11706) 26abc8e +Improved Send Flow: We’ve revamped our Send feature with a UI refresh! +Other changes: +- Faster wallet imports when importing a recovery phrase! +- Better loading states in the transaction details sheets +- Added toasts when hiding and unhiding NFTs +- Removed the hold to swap feature +- Various bug fixes and performance improvements \ No newline at end of file diff --git a/VERSION b/VERSION index e3977a73439..ab5218495e7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -web/5.45.5 \ No newline at end of file +mobile/1.34.1 \ No newline at end of file diff --git a/apps/extension/src/app/OnboardingApp.tsx b/apps/extension/src/app/OnboardingApp.tsx index 00e698b188b..6cec729150a 100644 --- a/apps/extension/src/app/OnboardingApp.tsx +++ b/apps/extension/src/app/OnboardingApp.tsx @@ -38,7 +38,6 @@ import { initExtensionAnalytics } from 'src/app/utils/analytics' import { checksIfSupportsSidePanel } from 'src/app/utils/chrome' import { PrimaryAppInstanceDebuggerLazy } from 'src/store/PrimaryAppInstanceDebuggerLazy' import { getReduxPersistor, getReduxStore } from 'src/store/store' -import { LocalizationContextProvider } from 'uniswap/src/features/language/LocalizationContext' import Trace from 'uniswap/src/features/telemetry/Trace' import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' @@ -46,7 +45,9 @@ import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/conte import i18n from 'uniswap/src/i18n/i18n' import { ExtensionOnboardingFlow } from 'uniswap/src/types/screens/extension' import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary' -import { SharedWalletProvider } from 'wallet/src/provider' +import { LocalizationContextProvider } from 'wallet/src/features/language/LocalizationContext' +import { WalletUniswapProvider } from 'wallet/src/features/transactions/contexts/WalletUniswapContext' +import { SharedProvider } from 'wallet/src/provider' const supportsSidePanel = checksIfSupportsSidePanel() @@ -173,18 +174,20 @@ export default function OnboardingApp(): JSX.Element { - + - - + + + + - + diff --git a/apps/extension/src/app/PopupApp.tsx b/apps/extension/src/app/PopupApp.tsx index a8019aab03d..e8d9b541be9 100644 --- a/apps/extension/src/app/PopupApp.tsx +++ b/apps/extension/src/app/PopupApp.tsx @@ -18,8 +18,6 @@ import { getReduxPersistor, getReduxStore } from 'src/store/store' import { Button, Flex, Image, Text } from 'ui/src' import { CHROME_LOGO, UNISWAP_LOGO } from 'ui/src/assets' import { iconSizes, spacing } from 'ui/src/theme' -import { LocalizationContextProvider } from 'uniswap/src/features/language/LocalizationContext' -import { syncAppWithDeviceLanguage } from 'uniswap/src/features/settings/slice' import Trace from 'uniswap/src/features/telemetry/Trace' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context' @@ -27,7 +25,10 @@ import i18n from 'uniswap/src/i18n/i18n' import { ExtensionScreens } from 'uniswap/src/types/screens/extension' import { logger } from 'utilities/src/logger/logger' import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary' -import { SharedWalletProvider } from 'wallet/src/provider' +import { LocalizationContextProvider } from 'wallet/src/features/language/LocalizationContext' +import { syncAppWithDeviceLanguage } from 'wallet/src/features/language/slice' +import { WalletUniswapProvider } from 'wallet/src/features/transactions/contexts/WalletUniswapContext' +import { SharedProvider } from 'wallet/src/provider' getLocalUserId() .then((userId) => { @@ -127,20 +128,22 @@ export default function PopupApp(): JSX.Element { - + - - - - + + + + + + - + diff --git a/apps/extension/src/app/SidebarApp.tsx b/apps/extension/src/app/SidebarApp.tsx index 832a636f750..814bdea941c 100644 --- a/apps/extension/src/app/SidebarApp.tsx +++ b/apps/extension/src/app/SidebarApp.tsx @@ -4,7 +4,7 @@ import 'src/app/Global.css' import { useEffect, useRef, useState } from 'react' import { I18nextProvider } from 'react-i18next' import { useDispatch } from 'react-redux' -import { RouterProvider } from 'react-router-dom' +import { RouterProvider, ScrollRestoration } from 'react-router-dom' import { PersistGate } from 'redux-persist/integration/react' import { ExtensionStatsigProvider } from 'src/app/StatsigProvider' import { GraphqlProvider } from 'src/app/apollo' @@ -38,8 +38,6 @@ import { import { BackgroundToSidePanelRequestType } from 'src/background/messagePassing/types/requests' import { PrimaryAppInstanceDebuggerLazy } from 'src/store/PrimaryAppInstanceDebuggerLazy' import { getReduxPersistor, getReduxStore } from 'src/store/store' -import { LocalizationContextProvider } from 'uniswap/src/features/language/LocalizationContext' -import { syncAppWithDeviceLanguage } from 'uniswap/src/features/settings/slice' import Trace from 'uniswap/src/features/telemetry/Trace' import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' @@ -50,7 +48,10 @@ import { logger } from 'utilities/src/logger/logger' import { ONE_SECOND_MS } from 'utilities/src/time/time' import { useInterval } from 'utilities/src/time/timing' import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary' -import { SharedWalletProvider } from 'wallet/src/provider' +import { LocalizationContextProvider } from 'wallet/src/features/language/LocalizationContext' +import { syncAppWithDeviceLanguage } from 'wallet/src/features/language/slice' +import { WalletUniswapProvider } from 'wallet/src/features/transactions/contexts/WalletUniswapContext' +import { SharedProvider } from 'wallet/src/provider' getLocalUserId() .then((userId) => { @@ -204,6 +205,7 @@ function SidebarWrapper(): JSX.Element { return ( <> + ) @@ -240,21 +242,23 @@ export default function SidebarApp(): JSX.Element { - + - - - - - + + + + + + + - + diff --git a/apps/extension/src/app/components/PasswordInput.tsx b/apps/extension/src/app/components/PasswordInput.tsx index 0213f88aaa9..7ba406b366a 100644 --- a/apps/extension/src/app/components/PasswordInput.tsx +++ b/apps/extension/src/app/components/PasswordInput.tsx @@ -58,7 +58,7 @@ function StrengthIndicator({ strength }: { strength: PasswordStrength }): JSX.El return ( - + {text} diff --git a/apps/extension/src/app/components/Trace/TraceUserProperties.tsx b/apps/extension/src/app/components/Trace/TraceUserProperties.tsx index f817ec2fee5..2f5f28ca040 100644 --- a/apps/extension/src/app/components/Trace/TraceUserProperties.tsx +++ b/apps/extension/src/app/components/Trace/TraceUserProperties.tsx @@ -1,12 +1,12 @@ import { useEffect } from 'react' import { useColorScheme } from 'react-native' -import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { useCurrentLanguage } from 'uniswap/src/features/language/hooks' import { useHideSmallBalancesSetting, useHideSpamTokensSetting } from 'uniswap/src/features/settings/hooks' import { ExtensionUserPropertyName, setUserProperty } from 'uniswap/src/features/telemetry/user' // eslint-disable-next-line no-restricted-imports import { analytics } from 'utilities/src/telemetry/analytics/analytics' +import { useAppFiatCurrencyInfo } from 'wallet/src/features/fiatCurrency/hooks' import { useGatingUserPropertyUsernames } from 'wallet/src/features/gating/userPropertyHooks' +import { useCurrentLanguage } from 'wallet/src/features/language/hooks' import { useActiveAccount, useSignerAccounts, useViewOnlyAccounts } from 'wallet/src/features/wallet/hooks' /** Component that tracks UserProperties during the lifetime of the app */ diff --git a/apps/extension/src/app/components/buttons/CopyButton.tsx b/apps/extension/src/app/components/buttons/CopyButton.tsx index 18e25f007b8..ac94f03c820 100644 --- a/apps/extension/src/app/components/buttons/CopyButton.tsx +++ b/apps/extension/src/app/components/buttons/CopyButton.tsx @@ -60,7 +60,7 @@ export function CopyButton({ onCopyPress }: { onCopyPress: () => Promise } color={valueCopied ? '$statusSuccess' : '$neutral2'} cursor="pointer" flexShrink={1} - variant="buttonLabel3" + variant="buttonLabel4" x={valueCopied ? -2 : 0} y={0.5} > diff --git a/apps/extension/src/app/components/modal/InfoModal.tsx b/apps/extension/src/app/components/modal/InfoModal.tsx index de0b281bd06..fd8190f76e8 100644 --- a/apps/extension/src/app/components/modal/InfoModal.tsx +++ b/apps/extension/src/app/components/modal/InfoModal.tsx @@ -65,7 +65,7 @@ export function InfoModal({ {linkText && linkUrl && ( - + {linkText} diff --git a/apps/extension/src/app/features/accounts/AccountItem.tsx b/apps/extension/src/app/features/accounts/AccountItem.tsx index 9904e1b2a71..dd38f50df86 100644 --- a/apps/extension/src/app/features/accounts/AccountItem.tsx +++ b/apps/extension/src/app/features/accounts/AccountItem.tsx @@ -7,7 +7,6 @@ import { removeAllDappConnectionsForAccount } from 'src/app/features/dapp/action import { ContextMenu, Flex, MenuContentItem, Text, TouchableArea } from 'ui/src' import { CopySheets, Edit, TrashFilled, TripleDots } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { WarningSeverity } from 'uniswap/src/features/transactions/WarningModal/types' @@ -15,6 +14,7 @@ import { setClipboard } from 'uniswap/src/utils/clipboard' import { NumberType } from 'utilities/src/format/types' import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay' import { WarningModal } from 'wallet/src/components/modals/WarningModal/WarningModal' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { pushNotification } from 'wallet/src/features/notifications/slice' import { AppNotificationType, CopyNotificationType } from 'wallet/src/features/notifications/types' import { EditAccountAction, editAccountActions } from 'wallet/src/features/wallet/accounts/editAccountSaga' diff --git a/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx b/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx index 7cd09e1a168..215dd4975ef 100644 --- a/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx +++ b/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx @@ -246,7 +246,7 @@ export function AccountSwitcherScreen(): JSX.Element { px="$spacing12" > - + {t('account.wallet.button.add')} diff --git a/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap b/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap index 0dc2aeb2294..174d0b56392 100644 --- a/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap +++ b/apps/extension/src/app/features/accounts/__snapshots__/AccountSwitcherScreen.test.tsx.snap @@ -170,7 +170,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` data-testid="account-card" > Edit label @@ -222,7 +222,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` Add wallet @@ -404,7 +404,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` data-testid="account-card" > Edit label @@ -456,7 +456,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` Add wallet diff --git a/apps/extension/src/app/features/dapp/hooks.test.ts b/apps/extension/src/app/features/dapp/hooks.test.ts index c1edbe5114c..1fd4394ec3c 100644 --- a/apps/extension/src/app/features/dapp/hooks.test.ts +++ b/apps/extension/src/app/features/dapp/hooks.test.ts @@ -6,9 +6,8 @@ import { } from 'src/app/features/dapp/hooks' import { DappState, dappStore } from 'src/app/features/dapp/store' import { act, renderHook, waitFor } from 'src/test/test-utils' -import { SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_3 } from 'uniswap/src/test/fixtures' import { UniverseChainId } from 'uniswap/src/types/chains' -import { ACCOUNT, ACCOUNT2, ACCOUNT3 } from 'wallet/src/test/fixtures' +import { ACCOUNT, ACCOUNT2, ACCOUNT3, SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_3 } from 'wallet/src/test/fixtures' const SAMPLE_DAPP = 'http://example.com' const SAMPLE_DAPP_2 = 'http://uniswap.org' diff --git a/apps/extension/src/app/features/dapp/utils.test.ts b/apps/extension/src/app/features/dapp/utils.test.ts index 96bc38eb8b0..35d4e569039 100644 --- a/apps/extension/src/app/features/dapp/utils.test.ts +++ b/apps/extension/src/app/features/dapp/utils.test.ts @@ -3,9 +3,15 @@ import { getOrderedConnectedAddresses, isConnectedAccount, } from 'src/app/features/dapp/utils' -import { SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, SAMPLE_SEED_ADDRESS_3 } from 'uniswap/src/test/fixtures' import { Account } from 'wallet/src/features/wallet/accounts/types' -import { ACCOUNT, ACCOUNT2, ACCOUNT3 } from 'wallet/src/test/fixtures' +import { + ACCOUNT, + ACCOUNT2, + ACCOUNT3, + SAMPLE_SEED_ADDRESS_1, + SAMPLE_SEED_ADDRESS_2, + SAMPLE_SEED_ADDRESS_3, +} from 'wallet/src/test/fixtures' describe('isConnectedAccount', () => { it('returns true if the account is connected', () => { diff --git a/apps/extension/src/app/features/dappRequests/DappRequestQueueContext.tsx b/apps/extension/src/app/features/dappRequests/DappRequestQueueContext.tsx index e4a0ed5c100..bf5adb0674a 100644 --- a/apps/extension/src/app/features/dappRequests/DappRequestQueueContext.tsx +++ b/apps/extension/src/app/features/dappRequests/DappRequestQueueContext.tsx @@ -91,7 +91,7 @@ export function DappRequestQueueProvider({ children }: PropsWithChildren): JSX.E sendAnalyticsEvent(ExtensionEventName.DappRequest, { action: DappRequestAction.Accept, requestType: requestToConfirm.dappRequest.type, - dappUrl: extractBaseUrl(requestToConfirm.senderTabInfo.url), + dappUrl: requestToConfirm.senderTabInfo.url, chainId: lastChainId, activeConnectedAddress, connectedAddresses, @@ -114,7 +114,7 @@ export function DappRequestQueueProvider({ children }: PropsWithChildren): JSX.E sendAnalyticsEvent(ExtensionEventName.DappRequest, { action: DappRequestAction.Reject, requestType: requestToCancel.dappRequest.type, - dappUrl: extractBaseUrl(requestToCancel.senderTabInfo.url), + dappUrl: requestToCancel.senderTabInfo.url, chainId: lastChainId, activeConnectedAddress, connectedAddresses, diff --git a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapDisplay.tsx b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapDisplay.tsx index 21b448b565f..3bf51d909e6 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapDisplay.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/Swap/SwapDisplay.tsx @@ -7,11 +7,11 @@ import { CurrencyLogo } from 'uniswap/src/components/CurrencyLogo/CurrencyLogo' import { SplitLogo } from 'uniswap/src/components/CurrencyLogo/SplitLogo' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { GasFeeResult } from 'uniswap/src/features/gas/types' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { ValueType, getCurrencyAmount } from 'uniswap/src/features/tokens/getCurrencyAmount' import { useUSDCValue } from 'uniswap/src/features/transactions/swap/hooks/useUSDCPrice' import { WalletChainId } from 'uniswap/src/types/chains' import { NumberType } from 'utilities/src/format/types' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' export function SwapDisplay({ inputAmount, diff --git a/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx index 14013600245..992c91821cd 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/PersonalSign/PersonalSignRequestContent.tsx @@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next' import { DappRequestContent } from 'src/app/features/dappRequests/DappRequestContent' import { SignMessageRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' import { Button, Flex, Text, Tooltip } from 'ui/src' -import { AlertTriangleFilled, Code, StickyNoteTextSquare } from 'ui/src/components/icons' +import { AlertTriangle, Code, StickyNoteTextSquare } from 'ui/src/components/icons' import { containsNonPrintableChars } from 'utilities/src/primitives/string' enum ViewEncoding { @@ -124,7 +124,7 @@ export function PersonalSignRequestContent({ dappRequest }: PersonalSignRequestP mt="$spacing12" p="$spacing12" > - + {t('dapp.request.signature.containsUnrenderableCharacters')} diff --git a/apps/extension/src/app/features/dappRequests/requestContent/WrapContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/WrapContent.tsx index 9b17541d972..96088ec04fa 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/WrapContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/WrapContent.tsx @@ -3,10 +3,10 @@ import { useDappLastChainId } from 'src/app/features/dapp/hooks' import { DappRequestStoreItem } from 'src/app/features/dappRequests/slice' import { SendTransactionRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' import { Flex, Text } from 'ui/src' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { UniverseChainId } from 'uniswap/src/types/chains' import { NumberType } from 'utilities/src/format/types' import { useTransactionGasFee, useUSDValue } from 'wallet/src/features/gas/hooks' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { useActiveAccountAddressWithThrow, useDisplayName } from 'wallet/src/features/wallet/hooks' export const WrapTransactionDetails = ({ diff --git a/apps/extension/src/app/features/home/PortfolioActionButtons.tsx b/apps/extension/src/app/features/home/PortfolioActionButtons.tsx index d87f7086222..525bced6b66 100644 --- a/apps/extension/src/app/features/home/PortfolioActionButtons.tsx +++ b/apps/extension/src/app/features/home/PortfolioActionButtons.tsx @@ -51,16 +51,13 @@ function ActionButton({ label, Icon, onClick, url }: ActionButtonProps): JSX.Ele gap="$spacing12" hoverStyle={{ cursor: 'pointer', opacity: 0.8 }} justifyContent="space-between" - // Reduced button label line height to 11 as suggested by design to eliminate extra bottom space. - pb={11} + p="$spacing12" pressStyle={{ opacity: 0.5 }} - pt="$spacing12" - px="$spacing12" userSelect="none" onPress={actionHandler} > {cloneElement(Icon, { color: ICON_COLOR, size: getTokenValue('$icon.24') })} - + {label} diff --git a/apps/extension/src/app/features/home/PortfolioHeader.tsx b/apps/extension/src/app/features/home/PortfolioHeader.tsx index 4aa18b97021..6c4b943416c 100644 --- a/apps/extension/src/app/features/home/PortfolioHeader.tsx +++ b/apps/extension/src/app/features/home/PortfolioHeader.tsx @@ -13,7 +13,6 @@ import { Circle, Flex, Image, Popover, Text, TouchableArea } from 'ui/src' import { animationPresets } from 'ui/src/animations' import { CopyAlt, Globe, RotatableChevron, Settings } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' -import { useAvatar } from 'uniswap/src/features/address/avatar' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { WalletChainId } from 'uniswap/src/types/chains' @@ -24,7 +23,7 @@ import { AccountIcon } from 'wallet/src/components/accounts/AccountIcon' import { AnimatedUnitagDisplayName } from 'wallet/src/components/accounts/AnimatedUnitagDisplayName' import { pushNotification } from 'wallet/src/features/notifications/slice' import { AppNotificationType, CopyNotificationType } from 'wallet/src/features/notifications/types' -import { useDisplayName } from 'wallet/src/features/wallet/hooks' +import { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' import { DisplayNameType } from 'wallet/src/features/wallet/types' const POPUP_SHADOW_RADIUS = 4 diff --git a/apps/extension/src/app/features/home/SwitchNetworksModal.tsx b/apps/extension/src/app/features/home/SwitchNetworksModal.tsx index dce2b2bc9b9..7a114f2cacb 100644 --- a/apps/extension/src/app/features/home/SwitchNetworksModal.tsx +++ b/apps/extension/src/app/features/home/SwitchNetworksModal.tsx @@ -53,7 +53,7 @@ export function SwitchNetworksModal(): JSX.Element { {dappUrl ? ( - + {extractUrlHost(dappUrl)} @@ -98,7 +98,7 @@ export function SwitchNetworksModal(): JSX.Element { {/* TODO(EXT-207 / EXT-208): fix button component styling and derive text color from theme */}{' '} - + {t('common.button.disconnect')} diff --git a/apps/extension/src/app/features/lockScreen/Locked.tsx b/apps/extension/src/app/features/lockScreen/Locked.tsx index 810a6fcdc77..6342b8974df 100644 --- a/apps/extension/src/app/features/lockScreen/Locked.tsx +++ b/apps/extension/src/app/features/lockScreen/Locked.tsx @@ -8,7 +8,7 @@ import { useSagaStatus } from 'src/app/hooks/useSagaStatus' import { OnboardingRoutes, TopLevelRoutes } from 'src/app/navigation/constants' import { focusOrCreateOnboardingTab } from 'src/app/navigation/utils' import { Button, Flex, InputProps, Text, TouchableArea } from 'ui/src' -import { AlertTriangleFilled, Lock } from 'ui/src/components/icons' +import { AlertTriangle, Lock } from 'ui/src/components/icons' import { spacing, zIndices } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' import { ModalName } from 'uniswap/src/features/telemetry/constants' @@ -132,7 +132,7 @@ export function Locked(): JSX.Element { linkUrl: uniswapUrls.helpArticleUrls.recoveryPhraseForgotten, icon: ( - + ), isOpen: forgotPasswordModalOpen, diff --git a/apps/extension/src/app/features/onboarding/OnboardingScreenFrame.tsx b/apps/extension/src/app/features/onboarding/OnboardingScreenFrame.tsx index 9db21a56879..9e9d151ef60 100644 --- a/apps/extension/src/app/features/onboarding/OnboardingScreenFrame.tsx +++ b/apps/extension/src/app/features/onboarding/OnboardingScreenFrame.tsx @@ -48,7 +48,7 @@ export function OnboardingScreenFrame({ top="$none" onPress={onSkip} > - + Skip diff --git a/apps/extension/src/app/features/onboarding/OnboardingWrapper.tsx b/apps/extension/src/app/features/onboarding/OnboardingWrapper.tsx index 2d33e4e04bb..1049a33acc4 100644 --- a/apps/extension/src/app/features/onboarding/OnboardingWrapper.tsx +++ b/apps/extension/src/app/features/onboarding/OnboardingWrapper.tsx @@ -6,7 +6,7 @@ import { ONBOARDING_BACKGROUND_DARK, ONBOARDING_BACKGROUND_LIGHT } from 'src/ass import { onboardingMessageChannel } from 'src/background/messagePassing/messageChannels' import { OnboardingMessageType } from 'src/background/messagePassing/types/ExtensionMessages' import { Flex, Image, useIsDarkMode } from 'ui/src' -import { syncAppWithDeviceLanguage } from 'uniswap/src/features/settings/slice' +import { syncAppWithDeviceLanguage } from 'wallet/src/features/language/slice' import { OnboardingContextProvider } from 'wallet/src/features/onboarding/OnboardingContext' export function OnboardingWrapper(): JSX.Element { diff --git a/apps/extension/src/app/features/onboarding/Password.tsx b/apps/extension/src/app/features/onboarding/Password.tsx index 119c71b38f8..9eee86e24b8 100644 --- a/apps/extension/src/app/features/onboarding/Password.tsx +++ b/apps/extension/src/app/features/onboarding/Password.tsx @@ -41,14 +41,10 @@ export function Password({ } = usePasswordForm() const onSubmit = useCallback(async () => { - if (!enableNext) { - return - } - if (checkSubmit()) { await onComplete(password) } - }, [onComplete, password, checkSubmit, enableNext]) + }, [onComplete, password, checkSubmit]) const handleBack = useCallback(() => { // reset the pending mnemonic when going back from password screen @@ -92,7 +88,6 @@ export function Password({ value={password} onBlur={onPasswordBlur} onChangeText={onChangePassword} - onSubmitEditing={onSubmit} /> : undefined } nextButtonEnabled={true} - nextButtonText={t('onboarding.name.wallet.button.text')} - subtitle={t('onboarding.name.wallet.subtitle')} - title={t('onboarding.name.wallet.title')} + nextButtonText="Finish" + subtitle="This nickname is only visible to you" + title="Give your wallet a name" onBack={goToPreviousStep} onSubmit={onSubmit} > diff --git a/apps/extension/src/app/features/onboarding/create/ViewMnemonic.tsx b/apps/extension/src/app/features/onboarding/create/ViewMnemonic.tsx index d27ee4f0855..dc1a48af1a8 100644 --- a/apps/extension/src/app/features/onboarding/create/ViewMnemonic.tsx +++ b/apps/extension/src/app/features/onboarding/create/ViewMnemonic.tsx @@ -3,11 +3,10 @@ import { Trans, useTranslation } from 'react-i18next' import { MnemonicViewer } from 'src/app/components/MnemonicViewer' import { OnboardingScreen } from 'src/app/features/onboarding/OnboardingScreen' import { useOnboardingSteps } from 'src/app/features/onboarding/OnboardingSteps' -import { useSubmitOnEnter } from 'src/app/features/onboarding/utils' import { TopLevelRoutes } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/state' import { CheckBox, Circle, Flex, IconProps, Square, Text } from 'ui/src' -import { AlertTriangleFilled, EyeOff, FileListLock, Key, PencilDetailed } from 'ui/src/components/icons' +import { AlertTriangle, EyeOff, FileListLock, Key, PencilDetailed } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import Trace from 'uniswap/src/features/telemetry/Trace' import { ExtensionOnboardingFlow, ExtensionOnboardingScreens } from 'uniswap/src/types/screens/extension' @@ -43,16 +42,7 @@ export function ViewMnemonic(): JSX.Element { } }, [onboardingAccountMnemonic, retrieveOnboardingAccountMnemonic]) - // On Info step, next button should be enabled if mnemonic has been created. - // On View step, next button should be enabled if disclaimer is checked and mnemonic has been created. - const shouldEnableNextButton = - viewStep === ViewStep.View ? !!onboardingAccountAddress && disclaimerChecked : !!onboardingAccountAddress - const onSubmit = (): void => { - if (!shouldEnableNextButton) { - return - } - if (viewStep === ViewStep.Info) { setViewStep(ViewStep.View) return @@ -63,7 +53,10 @@ export function ViewMnemonic(): JSX.Element { } } - useSubmitOnEnter(onSubmit) + // On view step, next button should be enabled if mnemonic has been created. + // On disclaimer step, next button should be enabled if disclaimer is checked and mnemonic has been created. + const shouldEnableNextButton = + viewStep === ViewStep.View ? !!onboardingAccountAddress && disclaimerChecked : !!onboardingAccountAddress return ( ) : ( - + )} } diff --git a/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx b/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx index 0c56db9dcab..d24c3e56805 100644 --- a/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx +++ b/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx @@ -123,15 +123,36 @@ export function ImportMnemonic(): JSX.Element { [errors], ) + const onSubmit = useCallback(async () => { + if (isEmptyMnemonic) { + return + } + + if (isResetting) { + // Remove all accounts before importing mnemonic. + await dispatch( + editAccountActions.trigger({ + type: EditAccountAction.Remove, + accounts, + }), + ) + } + + addOnboardingAccountMnemonic(mnemonic) + goToNextStep() + }, [accounts, dispatch, goToNextStep, isResetting, mnemonic, addOnboardingAccountMnemonic, isEmptyMnemonic]) + + const debouncedMnemonic = useDebounce(mnemonic, 500) + const { error: mnemonicValidationError, invalidWordCount } = useMemo(() => { - const mnemonicString = mnemonic.join(' ').toLowerCase() + const mnemonicString = debouncedMnemonic.join(' ').toLowerCase() if (!mnemonicString.trim()) { return { error: undefined, invalidWordCount: undefined } } return validateMnemonic(mnemonicString) - }, [mnemonic]) + }, [debouncedMnemonic]) const errorMessageToDisplay = useMemo(() => { // If all cells are filled, but there is an error, display the invalid phrase error @@ -149,29 +170,6 @@ export function ImportMnemonic(): JSX.Element { return undefined }, [expanded, mnemonic, mnemonicValidationError, t, invalidWordCount]) - const debouncedErrorMessageToDisplay = useDebounce(errorMessageToDisplay, 500) - - const enableSubmit = !isEmptyMnemonic && !mnemonicValidationError && !errorMessageToDisplay - - const onSubmit = useCallback(async () => { - if (!enableSubmit) { - return - } - - if (isResetting) { - // Remove all accounts before importing mnemonic. - await dispatch( - editAccountActions.trigger({ - type: EditAccountAction.Remove, - accounts, - }), - ) - } - - addOnboardingAccountMnemonic(mnemonic) - goToNextStep() - }, [accounts, dispatch, goToNextStep, isResetting, mnemonic, addOnboardingAccountMnemonic, enableSubmit]) - return ( - {debouncedErrorMessageToDisplay ?? DUMMY_TEXT} {/* To prevent layout shift */} + {errorMessageToDisplay ?? DUMMY_TEXT} {/* To prevent layout shift */} @@ -241,7 +239,6 @@ export function ImportMnemonic(): JSX.Element { handleKeyPress={handleKeyPress} index={index} word={word} - onSubmitEditing={onSubmit} /> ), @@ -279,12 +276,8 @@ const RecoveryPhraseWord = forwardRef< handleBlur: (index: number) => (event: NativeSyntheticEvent) => void handleChange: (index: number) => (event: NativeSyntheticEvent) => void handleKeyPress: (index: number) => (e: NativeSyntheticEvent) => void - onSubmitEditing: () => void } ->(function _RecoveryPhraseWord( - { word, index, handleBlur, handleChange, handleKeyPress, onSubmitEditing }, - ref, -): JSX.Element { +>(function _RecoveryPhraseWord({ word, index, handleBlur, handleChange, handleKeyPress }, ref): JSX.Element { const debouncedWord = useDebounce(word, 500) const showError = isValidMnemonicWord(debouncedWord) @@ -319,7 +312,6 @@ const RecoveryPhraseWord = forwardRef< onBlur={handleBlur(index)} onChange={handleChange(index)} onKeyPress={handleKeyPress(index)} - onSubmitEditing={onSubmitEditing} {...(showError && { backgroundColor: '$DEP_accentCriticalSoft', color: '$statusCritical', diff --git a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx index 423ba1d40b5..842ccbf3c07 100644 --- a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx +++ b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx @@ -4,7 +4,6 @@ import { SelectWalletsSkeleton } from 'src/app/components/loading/SelectWalletSk import { saveDappConnection } from 'src/app/features/dapp/actions' import { OnboardingScreen } from 'src/app/features/onboarding/OnboardingScreen' import { useOnboardingSteps } from 'src/app/features/onboarding/OnboardingSteps' -import { useSubmitOnEnter } from 'src/app/features/onboarding/utils' import { Flex, ScrollView, SpinningLoader, Square, Text } from 'ui/src' import { WalletFilled } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' @@ -25,7 +24,7 @@ export function SelectWallets({ flow }: { flow: ExtensionOnboardingFlow }): JSX. const [buttonClicked, setButtonClicked] = useState(false) const { goToNextStep, goToPreviousStep } = useOnboardingSteps() - const { generateAccountsAndImportAddresses, getGeneratedAddresses } = useOnboardingContext() + const { getGeneratedAddresses, generateAccountsAndImportAddresses } = useOnboardingContext() const { data: generatedAddresses } = useAsyncData(getGeneratedAddresses) @@ -33,13 +32,7 @@ export function SelectWallets({ flow }: { flow: ExtensionOnboardingFlow }): JSX. const { selectedAddresses, toggleAddressSelection } = useSelectAccounts(importableAccounts) - const enableSubmit = showError || (selectedAddresses.length > 0 && !isLoading) - const onSubmit = useCallback(async () => { - if (!enableSubmit) { - return - } - setButtonClicked(true) const importedAccounts = await generateAccountsAndImportAddresses(selectedAddresses) @@ -51,12 +44,10 @@ export function SelectWallets({ flow }: { flow: ExtensionOnboardingFlow }): JSX. goToNextStep() setButtonClicked(false) - }, [generateAccountsAndImportAddresses, selectedAddresses, goToNextStep, shouldAutoConnect, enableSubmit]) + }, [generateAccountsAndImportAddresses, selectedAddresses, goToNextStep, shouldAutoConnect]) const title = showError ? t('onboarding.selectWallets.title.error') : t('onboarding.selectWallets.title.default') - useSubmitOnEnter(showError ? refetch : onSubmit) - return ( } - nextButtonEnabled={enableSubmit} + nextButtonEnabled={showError || (selectedAddresses.length > 0 && !isLoading)} nextButtonIcon={buttonClicked ? : undefined} nextButtonText={ showError @@ -91,13 +82,13 @@ export function SelectWallets({ flow }: { flow: ExtensionOnboardingFlow }): JSX. ) : ( importableAccounts?.map((account) => { - const { address, balance } = account + const { ownerAddress, balance } = account return ( ) diff --git a/apps/extension/src/app/features/onboarding/intro/UnsupportedBrowserScreen.tsx b/apps/extension/src/app/features/onboarding/intro/UnsupportedBrowserScreen.tsx index 8a7bd3e8587..a2d707b5d03 100644 --- a/apps/extension/src/app/features/onboarding/intro/UnsupportedBrowserScreen.tsx +++ b/apps/extension/src/app/features/onboarding/intro/UnsupportedBrowserScreen.tsx @@ -2,7 +2,7 @@ import { useTranslation } from 'react-i18next' import { MainIntroWrapper } from 'src/app/features/onboarding/intro/MainIntroWrapper' import { isAndroid } from 'src/app/utils/chrome' import { Flex, Text } from 'ui/src' -import { AlertTriangleFilled } from 'ui/src/components/icons' +import { AlertTriangle } from 'ui/src/components/icons' import Trace from 'uniswap/src/features/telemetry/Trace' import { ExtensionScreens } from 'uniswap/src/types/screens/extension' @@ -31,7 +31,7 @@ export function UnsupportedBrowserScreen(): JSX.Element { p="$spacing12" > - + diff --git a/apps/extension/src/app/features/onboarding/reset/ResetComplete.tsx b/apps/extension/src/app/features/onboarding/reset/ResetComplete.tsx index 6b185100c61..0e64b2b9976 100644 --- a/apps/extension/src/app/features/onboarding/reset/ResetComplete.tsx +++ b/apps/extension/src/app/features/onboarding/reset/ResetComplete.tsx @@ -24,7 +24,7 @@ export function ResetComplete(): JSX.Element { - + {t('onboarding.resetPassword.complete.safety')} diff --git a/apps/extension/src/app/features/onboarding/utils.ts b/apps/extension/src/app/features/onboarding/utils.ts index c7c618c798a..7e0c93ddb42 100644 --- a/apps/extension/src/app/features/onboarding/utils.ts +++ b/apps/extension/src/app/features/onboarding/utils.ts @@ -1,22 +1,2 @@ -import { useEffect } from 'react' - export const ONBOARDING_CONTENT_WIDTH = 460 export const ONBOARDING_INITIAL_FRAME_HEIGHT = 636 - -export function useSubmitOnEnter(onSubmit: () => void): void { - useEffect(() => { - const handleKeyDown = (event: KeyboardEvent): void => { - if (event.key === 'Enter') { - onSubmit() - } - } - - // Add event listener for keydown - window.addEventListener('keydown', handleKeyDown) - - // Cleanup event listener on component unmount - return (): void => { - window.removeEventListener('keydown', handleKeyDown) - } - }, [onSubmit]) -} diff --git a/apps/extension/src/app/features/popups/ConnectPopup.tsx b/apps/extension/src/app/features/popups/ConnectPopup.tsx index 8b5055a4737..f6c9df13cc4 100644 --- a/apps/extension/src/app/features/popups/ConnectPopup.tsx +++ b/apps/extension/src/app/features/popups/ConnectPopup.tsx @@ -36,7 +36,7 @@ export function ConnectPopupContent({ {t('extension.connection.titleNotConnected')} - + {extractUrlHost(dappUrl)} @@ -76,7 +76,7 @@ export function ConnectPopupContent({ }) } > - + {t('extension.connection.popup.trouble')} diff --git a/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap b/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap index d616380ae10..6fb7dc7a372 100644 --- a/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap +++ b/apps/extension/src/app/features/receive/__snapshots__/ReceiveScreen.test.tsx.snap @@ -113,7 +113,7 @@ exports[`ReceiveScreen renders without error 1`] = `
Learn more @@ -6405,7 +6405,7 @@ exports[`ReceiveScreen renders without error 1`] = `
Learn more diff --git a/apps/extension/src/app/features/send/SendFormScreen/RecipientPanel.tsx b/apps/extension/src/app/features/send/SendFormScreen/RecipientPanel.tsx index 6623b437250..9206f0af929 100644 --- a/apps/extension/src/app/features/send/SendFormScreen/RecipientPanel.tsx +++ b/apps/extension/src/app/features/send/SendFormScreen/RecipientPanel.tsx @@ -106,7 +106,7 @@ export function RecipientPanel({ chainId }: RecipientPanelProps): JSX.Element { ) : !sections.length ? ( - {t('send.search.empty.title')} + {t('send.search.empty.title')} {t('send.search.empty.subtitle')} diff --git a/apps/extension/src/app/features/send/SendFormScreen/SendFormScreen.tsx b/apps/extension/src/app/features/send/SendFormScreen/SendFormScreen.tsx index b6e80310332..9e6d19542cc 100644 --- a/apps/extension/src/app/features/send/SendFormScreen/SendFormScreen.tsx +++ b/apps/extension/src/app/features/send/SendFormScreen/SendFormScreen.tsx @@ -6,7 +6,6 @@ import { Modal } from 'uniswap/src/components/modals/Modal' import Trace from 'uniswap/src/features/telemetry/Trace' import { ModalName, SectionName } from 'uniswap/src/features/telemetry/constants' import { useUSDCValue } from 'uniswap/src/features/transactions/swap/hooks/useUSDCPrice' -import { useIsBlocked } from 'uniswap/src/features/trm/hooks' import { CurrencyField } from 'uniswap/src/types/currency' import { InsufficientNativeTokenWarning } from 'wallet/src/features/transactions/InsufficientNativeTokenWarning/InsufficientNativeTokenWarning' import { SendScreen, useSendContext } from 'wallet/src/features/transactions/contexts/SendContext' @@ -18,7 +17,7 @@ import { useShowSendNetworkNotification } from 'wallet/src/features/transactions import { useUSDTokenUpdater } from 'wallet/src/features/transactions/swap/trade/hooks/useUSDTokenUpdater' import { createTransactionId } from 'wallet/src/features/transactions/utils' import { BlockedAddressWarning } from 'wallet/src/features/trm/BlockedAddressWarning' -import { useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' export function SendFormScreen(): JSX.Element { const colors = useSporeColors() diff --git a/apps/extension/src/app/features/settings/DevMenuScreen.tsx b/apps/extension/src/app/features/settings/DevMenuScreen.tsx index 37231f99aac..d7e8ac89523 100644 --- a/apps/extension/src/app/features/settings/DevMenuScreen.tsx +++ b/apps/extension/src/app/features/settings/DevMenuScreen.tsx @@ -4,11 +4,11 @@ import { ScreenHeader } from 'src/app/components/layout/ScreenHeader' import { SettingsItemWithDropdown } from 'src/app/features/settings/SettingsItemWithDropdown' import { Accordion, Flex, ScrollView } from 'ui/src' import { Settings } from 'ui/src/components/icons' -import { Language, SUPPORTED_LANGUAGES } from 'uniswap/src/features/language/constants' -import { getLanguageInfo, useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' -import { setCurrentLanguage } from 'uniswap/src/features/settings/slice' import i18n from 'uniswap/src/i18n/i18n' import { GatingOverrides } from 'wallet/src/components/gating/GatingOverrides' +import { Language, SUPPORTED_LANGUAGES } from 'wallet/src/features/language/constants' +import { getLanguageInfo, useCurrentLanguageInfo } from 'wallet/src/features/language/hooks' +import { setCurrentLanguage } from 'wallet/src/features/language/slice' export function DevMenuScreen(): JSX.Element { const { t } = useTranslation() diff --git a/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseWallets.tsx b/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseWallets.tsx index 44489fa5c46..c6b25f871ba 100644 --- a/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseWallets.tsx +++ b/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseWallets.tsx @@ -5,12 +5,12 @@ import { SettingsRecoveryPhrase } from 'src/app/features/settings/SettingsRecove import { AppRoutes, RemoveRecoveryPhraseRoutes, SettingsRoutes } from 'src/app/navigation/constants' import { useExtensionNavigation } from 'src/app/navigation/utils' import { Flex, ScrollView, Text } from 'ui/src' -import { AlertTriangleFilled } from 'ui/src/components/icons' +import { AlertTriangle } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay' import { useAccountList } from 'wallet/src/features/accounts/hooks' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { Account } from 'wallet/src/features/wallet/accounts/types' import { useSignerAccounts } from 'wallet/src/features/wallet/hooks' @@ -24,7 +24,7 @@ export function RemoveRecoveryPhraseWallets(): JSX.Element { } + icon={} nextButtonEnabled={true} nextButtonText={t('common.button.continue')} nextButtonTheme="secondary_Button" @@ -101,13 +101,7 @@ function AssociatedAccountRow({ py="$spacing12" > - + {balanceFormatted} diff --git a/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/ViewRecoveryPhraseScreen.tsx b/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/ViewRecoveryPhraseScreen.tsx index b3963b47dcc..10a827d9c7c 100644 --- a/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/ViewRecoveryPhraseScreen.tsx +++ b/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/ViewRecoveryPhraseScreen.tsx @@ -8,7 +8,7 @@ import { EnterPasswordModal } from 'src/app/features/settings/password/EnterPass import { AppRoutes, RemoveRecoveryPhraseRoutes, SettingsRoutes } from 'src/app/navigation/constants' import { navigate } from 'src/app/navigation/state' import { Button, Flex, Separator, Text } from 'ui/src' -import { AlertTriangleFilled, Eye, Key, Laptop } from 'ui/src/components/icons' +import { AlertTriangle, Eye, Key, Laptop } from 'ui/src/components/icons' import { spacing } from 'ui/src/theme' import { WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' @@ -76,7 +76,7 @@ export function SettingsViewRecoveryPhraseScreen(): JSX.Element { {viewStep !== ViewStep.Reveal ? ( } + icon={} nextButtonEnabled={true} nextButtonText={t('common.button.continue')} nextButtonTheme="secondary_Button" diff --git a/apps/extension/src/app/features/settings/SettingsScreen.tsx b/apps/extension/src/app/features/settings/SettingsScreen.tsx index 89e0b00e1ae..b9d43138a68 100644 --- a/apps/extension/src/app/features/settings/SettingsScreen.tsx +++ b/apps/extension/src/app/features/settings/SettingsScreen.tsx @@ -14,7 +14,6 @@ import { GeneratedIcon, ScrollView, Separator, - Switch, Text, TouchableArea, useSporeColors, @@ -34,16 +33,18 @@ import { } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { FiatCurrency, ORDERED_CURRENCIES } from 'uniswap/src/features/fiatCurrency/constants' -import { getFiatCurrencyName, useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { useHideSmallBalancesSetting, useHideSpamTokensSetting } from 'uniswap/src/features/settings/hooks' -import { setCurrentFiatCurrency, setHideSmallBalances, setHideSpamTokens } from 'uniswap/src/features/settings/slice' +import { setHideSmallBalances, setHideSpamTokens } from 'uniswap/src/features/settings/slice' import { isDevEnv } from 'utilities/src/environment' import noop from 'utilities/src/react/noop' +import { WebSwitch } from 'wallet/src/components/buttons/Switch' import { SettingsLanguageModal } from 'wallet/src/components/settings/language/SettingsLanguageModal' import { authActions } from 'wallet/src/features/auth/saga' import { AuthActionType } from 'wallet/src/features/auth/types' +import { FiatCurrency, ORDERED_CURRENCIES } from 'wallet/src/features/fiatCurrency/constants' +import { getFiatCurrencyName, useAppFiatCurrencyInfo } from 'wallet/src/features/fiatCurrency/hooks' +import { setCurrentFiatCurrency } from 'wallet/src/features/fiatCurrency/slice' +import { useCurrentLanguageInfo } from 'wallet/src/features/language/hooks' const manifestVersion = chrome.runtime.getManifest().version @@ -115,15 +116,15 @@ export function SettingsScreen(): JSX.Element { /> void + value: boolean + onValueChange: (value: boolean) => void }): JSX.Element { return ( {title} - + ) } diff --git a/apps/extension/src/app/features/swap/SwapFlowScreen.tsx b/apps/extension/src/app/features/swap/SwapFlowScreen.tsx index 45e983252c9..8e49713f411 100644 --- a/apps/extension/src/app/features/swap/SwapFlowScreen.tsx +++ b/apps/extension/src/app/features/swap/SwapFlowScreen.tsx @@ -1,6 +1,7 @@ import { useExtensionNavigation } from 'src/app/navigation/utils' import { Flex } from 'ui/src' import { useHighestBalanceNativeCurrencyId } from 'uniswap/src/features/dataApi/balances' +import { usePortfolioValueModifiers } from 'wallet/src/features/dataApi/balances' import { WalletSwapFlow } from 'wallet/src/features/transactions/swap/WalletSwapFlow' import { useSwapPrefilledState } from 'wallet/src/features/transactions/swap/hooks/useSwapPrefilledState' import { prepareSwapFormState } from 'wallet/src/features/transactions/swap/utils' @@ -9,7 +10,8 @@ import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' export function SwapFlowScreen(): JSX.Element { const { navigateBack, locationState } = useExtensionNavigation() const account = useActiveAccountWithThrow() - const inputCurrencyId = useHighestBalanceNativeCurrencyId(account.address) + const valueModifiers = usePortfolioValueModifiers(account.address) + const inputCurrencyId = useHighestBalanceNativeCurrencyId(account.address, valueModifiers) const initialState = prepareSwapFormState({ inputCurrencyId }) const swapPrefilledState = useSwapPrefilledState(locationState?.initialTransactionState ?? initialState) diff --git a/apps/extension/src/app/navigation/index.tsx b/apps/extension/src/app/navigation/index.tsx index 61e2200d8af..4da4bb238f3 100644 --- a/apps/extension/src/app/navigation/index.tsx +++ b/apps/extension/src/app/navigation/index.tsx @@ -1,6 +1,6 @@ import { useCallback, useMemo, useRef } from 'react' import { useSelector } from 'react-redux' -import { Outlet, ScrollRestoration, useLocation } from 'react-router-dom' +import { Outlet, useLocation } from 'react-router-dom' import { DappRequestQueue } from 'src/app/features/dappRequests/DappRequestQueue' import { HomeScreen } from 'src/app/features/home/HomeScreen' import { Locked } from 'src/app/features/lockScreen/Locked' @@ -15,10 +15,9 @@ import { focusOrCreateOnboardingTab } from 'src/app/navigation/utils' import { isOnboardedSelector } from 'src/app/utils/isOnboardedSelector' import { AnimatePresence, Flex, SpinningLoader, styled } from 'ui/src' import { useIsChromeWindowFocusedWithTimeout } from 'uniswap/src/extension/useIsChromeWindowFocused' -import { useAsyncData, usePrevious } from 'utilities/src/react/hooks' +import { useAsyncData } from 'utilities/src/react/hooks' import { ONE_SECOND_MS } from 'utilities/src/time/time' import { TransactionHistoryUpdater } from 'wallet/src/features/transactions/TransactionHistoryUpdater' -import { WalletUniswapProvider } from 'wallet/src/features/transactions/contexts/WalletUniswapContext' import { QueuedOrderModal } from 'wallet/src/features/transactions/swap/modals/QueuedOrderModal' export function MainContent(): JSX.Element { @@ -91,10 +90,6 @@ export function WebNavigation(): JSX.Element { } } - // Only restore scroll if path on latest re-render is different from the previous path. - const prevPathname = usePrevious(pathname) - const shouldRestoreScroll = pathname !== prevPathname - const childrenMemo = useMemo(() => { return ( @@ -127,11 +122,8 @@ export function WebNavigation(): JSX.Element { return ( - - - {shouldRestoreScroll && } - {childrenMemo} - + + {childrenMemo} ) } diff --git a/apps/extension/src/app/saga.ts b/apps/extension/src/app/saga.ts index 78e34786e9d..567ac497b60 100644 --- a/apps/extension/src/app/saga.ts +++ b/apps/extension/src/app/saga.ts @@ -2,9 +2,9 @@ import { initDappStore } from 'src/app/features/dapp/saga' import { dappRequestApprovalWatcher } from 'src/app/features/dappRequests/dappRequestApprovalWatcherSaga' import { dappRequestWatcher } from 'src/app/features/dappRequests/saga' import { call, spawn } from 'typed-redux-saga' -import { appLanguageWatcherSaga } from 'uniswap/src/features/language/saga' import { apolloClientRef } from 'wallet/src/data/apollo/usePersistedApolloClient' import { authActions, authReducer, authSaga, authSagaName } from 'wallet/src/features/auth/saga' +import { appLanguageWatcherSaga } from 'wallet/src/features/language/saga' import { initProviders } from 'wallet/src/features/providers' import { swapActions, swapReducer, swapSaga, swapSagaName } from 'wallet/src/features/transactions/swap/swapSaga' import { diff --git a/apps/extension/src/background/backgroundDappRequests.ts b/apps/extension/src/background/backgroundDappRequests.ts index db4c5b27284..47e9f920ce3 100644 --- a/apps/extension/src/background/backgroundDappRequests.ts +++ b/apps/extension/src/background/backgroundDappRequests.ts @@ -30,6 +30,7 @@ import { hexadecimalStringToInt, toSupportedChainId } from 'uniswap/src/features import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants/extension' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { WindowEthereumRequestProperties } from 'uniswap/src/features/telemetry/types' +import { RPCType } from 'uniswap/src/types/chains' import { logger } from 'utilities/src/logger/logger' import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' import { walletContextValue } from 'wallet/src/features/wallet/context' @@ -204,7 +205,7 @@ async function handleChainChange(request: ChangeChainRequest, dappUrl: string, t await dappStore.init() const { activeConnectedAddress } = dappStore.getDappInfo(dappUrl) ?? {} const updatedChainId = toSupportedChainId(hexadecimalStringToInt(request.chainId)) - const provider = updatedChainId ? walletContextValue.providers.getProvider(updatedChainId) : undefined + const provider = updatedChainId ? walletContextValue.providers.getProvider(updatedChainId, RPCType.Public) : undefined const response = changeChain({ provider, dappUrl, diff --git a/apps/extension/src/contentScript/injected.ts b/apps/extension/src/contentScript/injected.ts index 34fb02c62a1..84bf0e7816f 100644 --- a/apps/extension/src/contentScript/injected.ts +++ b/apps/extension/src/contentScript/injected.ts @@ -31,6 +31,7 @@ import { } from 'src/contentScript/methodHandlers/utils' import { WindowEthereumRequest, isValidWindowEthereumRequest } from 'src/contentScript/types' import { chainIdToHexadecimalString } from 'uniswap/src/features/chains/utils' +import { RPCType } from 'uniswap/src/types/chains' import { logger } from 'utilities/src/logger/logger' import { arraysAreEqual } from 'utilities/src/primitives/array' import { walletContextValue } from 'wallet/src/features/wallet/context' @@ -203,7 +204,7 @@ async function init(): Promise { if (chainId && !provider) { const chainIdNum = parseInt(chainId, 16) - const defaultProvider = walletContextValue.providers.getProvider(chainIdNum) + const defaultProvider = walletContextValue.providers.getProvider(chainIdNum, RPCType.Public) setProvider(defaultProvider) } } catch (error) { diff --git a/apps/extension/src/manifest.json b/apps/extension/src/manifest.json index a2efdcf5d83..9dc866075c8 100644 --- a/apps/extension/src/manifest.json +++ b/apps/extension/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Uniswap Extension", "description": "The Uniswap Extension is a self-custody crypto wallet that's built for swapping.", - "version": "1.5.0", + "version": "1.4.0", "minimum_chrome_version": "116", "icons": { "16": "assets/icon16.png", diff --git a/apps/extension/src/store/migrations.test.ts b/apps/extension/src/store/migrations.test.ts index c187d8a8245..8c6b7c93b73 100644 --- a/apps/extension/src/store/migrations.test.ts +++ b/apps/extension/src/store/migrations.test.ts @@ -6,10 +6,6 @@ import { initialSchema, v0Schema, v10Schema, - v11Schema, - v12Schema, - v13Schema, - v14Schema, v1Schema, v2Schema, v3Schema, @@ -21,7 +17,6 @@ import { v9Schema, } from 'src/store/schema' import { initialFavoritesState } from 'uniswap/src/features/favorites/slice' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { initialSearchHistoryState } from 'uniswap/src/features/search/searchHistorySlice' import { initialUserSettingsState } from 'uniswap/src/features/settings/slice' import { initialTokensState } from 'uniswap/src/features/tokens/slice/slice' @@ -31,17 +26,15 @@ import { UniverseChainId } from 'uniswap/src/types/chains' import { getAllKeysOfNestedObject } from 'utilities/src/primitives/objects' import { initialAppearanceSettingsState } from 'wallet/src/features/appearance/slice' import { initialBehaviorHistoryState } from 'wallet/src/features/behaviorHistory/slice' +import { initialFiatCurrencyState } from 'wallet/src/features/fiatCurrency/slice' +import { initialLanguageState } from 'wallet/src/features/language/slice' import { initialNotificationsState } from 'wallet/src/features/notifications/slice' import { initialWalletState } from 'wallet/src/features/wallet/slice' import { createMigrate } from 'wallet/src/state/createMigrate' import { HAYDEN_ETH_ADDRESS } from 'wallet/src/state/walletMigrations' import { testActivatePendingAccounts, - testAddCreatedOnboardingRedesignAccount, testAddedHapticSetting, - testMovedCurrencySetting, - testMovedLanguageSetting, - testMovedTokenWarnings, testMovedUserSettings, testRemoveHoldToSwap, } from 'wallet/src/state/walletMigrationsTests' @@ -85,7 +78,8 @@ describe('Redux state migrations', () => { dapp: {}, ens: { ensForAddress: {} }, favorites: initialFavoritesState, - fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, + fiatCurrencySettings: initialFiatCurrencyState, + languageSettings: initialLanguageState, notifications: initialNotificationsState, behaviorHistory: initialBehaviorHistoryState, providers: { isInitialized: false }, @@ -241,23 +235,7 @@ describe('Redux state migrations', () => { testMovedUserSettings(migrations[10], v9Schema) }) - it('migrates from v10 to v11', async () => { + it('migrates v10 to v11', async () => { testRemoveHoldToSwap(migrations[11], v10Schema) }) - - it('migrates from v11 to v12', async () => { - testAddCreatedOnboardingRedesignAccount(migrations[12], v11Schema) - }) - - it('migrates from v12 to v13', async () => { - testMovedTokenWarnings(migrations[13], v12Schema) - }) - - it('migrates from v13 to v14', async () => { - testMovedLanguageSetting(migrations[14], v13Schema) - }) - - it('migrates from v14 to v15', async () => { - testMovedCurrencySetting(migrations[15], v14Schema) - }) }) diff --git a/apps/extension/src/store/migrations.ts b/apps/extension/src/store/migrations.ts index 662873d8aeb..3b750fa4b68 100644 --- a/apps/extension/src/store/migrations.ts +++ b/apps/extension/src/store/migrations.ts @@ -3,7 +3,6 @@ import { activatePendingAccounts, - addCreatedOnboardingRedesignAccountBehaviorHistory, addExploreAndWelcomeBehaviorHistory, addHapticSetting, addRoutingFieldToTransactions, @@ -11,9 +10,6 @@ import { deleteDefaultFavoritesFromFavoritesState, deleteExtensionOnboardingState, deleteHoldToSwapBehaviorHistory, - moveCurrencySetting, - moveDismissedTokenWarnings, - moveLanguageSetting, moveUserSettings, removeUniconV2BehaviorState, removeWalletIsUnlockedState, @@ -34,10 +30,6 @@ export const migrations = { 9: addExploreAndWelcomeBehaviorHistory, 10: moveUserSettings, 11: deleteHoldToSwapBehaviorHistory, - 12: addCreatedOnboardingRedesignAccountBehaviorHistory, - 13: moveDismissedTokenWarnings, - 14: moveLanguageSetting, - 15: moveCurrencySetting, } -export const EXTENSION_STATE_VERSION = 15 +export const EXTENSION_STATE_VERSION = 11 diff --git a/apps/extension/src/store/schema.ts b/apps/extension/src/store/schema.ts index 5e7937ae5ab..2242d5ad78d 100644 --- a/apps/extension/src/store/schema.ts +++ b/apps/extension/src/store/schema.ts @@ -150,41 +150,4 @@ delete v11SchemaIntermediate.behaviorHistory.hasSubmittedHoldToSwap export const v11Schema = v11SchemaIntermediate -export const v12Schema = { - ...v11Schema, - behaviorHistory: { - ...v11Schema.behaviorHistory, - createdOnboardingRedesignAccount: false, - }, -} - -export const v13Schema = { - ...v12Schema, - tokens: { - dismissedTokenWarnings: {}, - }, -} - -const v14SchemaIntermediate = { - ...v13Schema, - languageSettings: undefined, - userSettings: { - ...v13Schema.userSettings, - currentLanguage: v13Schema.languageSettings.currentLanguage, - }, -} -delete v14SchemaIntermediate.languageSettings -export const v14Schema = v14SchemaIntermediate - -const v15SchemaIntermediate = { - ...v14Schema, - fiatCurrencySettings: undefined, - userSettings: { - ...v14Schema.userSettings, - currentLanguage: v14Schema.fiatCurrencySettings.currentCurrency, - }, -} -delete v15SchemaIntermediate.fiatCurrencySettings -export const v15Schema = v15SchemaIntermediate - -export const getSchema = (): typeof v15Schema => v15Schema +export const getSchema = (): typeof v11Schema => v11Schema diff --git a/apps/extension/src/test/render.tsx b/apps/extension/src/test/render.tsx index 5635c454690..3cf8d43db20 100644 --- a/apps/extension/src/test/render.tsx +++ b/apps/extension/src/test/render.tsx @@ -13,8 +13,8 @@ import { ExtensionState, extensionReducer } from 'src/store/extensionReducer' import { AppStore } from 'src/store/store' import { Resolvers } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context' -import { AutoMockedApolloProvider } from 'uniswap/src/test/mocks' -import { SharedWalletProvider } from 'wallet/src/provider' +import { SharedProvider } from 'wallet/src/provider' +import { AutoMockedApolloProvider } from 'wallet/src/test/mocks' // This type extends the default options for render from RTL, as well // as allows the user to specify other things such as initialState, store. @@ -50,9 +50,9 @@ export function renderWithProviders( function Wrapper({ children }: PropsWithChildren): JSX.Element { return ( - + {children} - + ) } @@ -112,7 +112,7 @@ export function renderHookWithProviders( function Wrapper({ children }: PropsWithChildren): JSX.Element { return ( - {children} + {children} ) } diff --git a/apps/mobile/README.md b/apps/mobile/README.md index b14cea828f0..95e7789aed8 100644 --- a/apps/mobile/README.md +++ b/apps/mobile/README.md @@ -121,37 +121,6 @@ Android Studio should have an emulator already, but if not: Open the project at `universe/apps/mobile/android` Tools -> Device Manager to create a new emulator -## Deploying to Physical Android Device - -1. Enable developer mode on Android - - 1. Open Settings - 2. Tap About phone or About device - 3. Tap Software information - 4. Tap Build number seven times in a row - 5. A message will appear when you're close to enabling Developer mode - -2. Enable USB Debugging - - Go to Developer Options in settings and enable USB Debugging - -3. Connect device and Allow communication - - Pop up message must appear and enable transfer. - Run the following command to verify your device has been detected: - -`adb devices` - -4. In your terminal run - -``` -adb reverse tcp:8081 tcp:8081 -yarn mobile android -``` - -if it fails, quit the terminal and run it directly from Android Studio. Once you get the first build retry the previous step. - - ## Development Once all the setup steps above are completed, you're ready to try running the app locally! @@ -215,13 +184,6 @@ We use `redux-persist` to persist the Redux state between user sessions. Most of - `zsh: command not found: [package name]` This means whichever package you're trying to run (`[package name]`) wasn’t correctly installed, or your Terminal can’t figure out how to run it. If you just installed it, try quitting terminal and re-opening it. Otherwise try reinstalling the package. -- `Failed to load 'glog' podspec:` -Resolve this issue by checking the path of Xcode, make sure is inside Applications and with the name `Xcode` -Once confirm run the following commands: - -`sudo xcode-select --switch /Applications/Xcode.app` -`pod install` - - `unable to open file (in target "OneSignalNotificationServiceExtension" in project "Uniswap")`. Resolve this issue by navigating to the `ios/` directory and running `pod update`. diff --git a/apps/mobile/android/README.md b/apps/mobile/android/README.md new file mode 100644 index 00000000000..42328a43c8c --- /dev/null +++ b/apps/mobile/android/README.md @@ -0,0 +1,4 @@ +# Known Issues + +Android 14 (API level 34) features cannot be used until we upgrade to React Native 0.71.13. That means that the sdk versions cannot be upgraded to 34 until React Native is also upgraded. +https://github.com/facebook/react-native/issues/37769 diff --git a/apps/mobile/android/app/build.gradle b/apps/mobile/android/app/build.gradle index deea58167d0..f28d644d743 100644 --- a/apps/mobile/android/app/build.gradle +++ b/apps/mobile/android/app/build.gradle @@ -90,10 +90,6 @@ if (isCI && datadogPropertiesAvailable && !isDetox) { apply from: "../../../../node_modules/@datadog/mobile-react-native/datadog-sourcemaps.gradle" } -def devVersionName = "1.35" -def betaVersionName = "1.35" -def prodVersionName = "1.35" - android { ndkVersion rootProject.ext.ndkVersion @@ -141,17 +137,17 @@ android { dev { isDefault(true) applicationIdSuffix ".dev" - versionName devVersionName + versionName "1.34.1" dimension "variant" } beta { applicationIdSuffix ".beta" - versionName betaVersionName + versionName "1.34.1" dimension "variant" } prod { dimension "variant" - versionName prodVersionName + versionName "1.34.1" } } diff --git a/apps/mobile/android/app/src/main/assets/fonts/Basel-Book.ttf b/apps/mobile/android/app/src/main/assets/fonts/Basel-Book.ttf new file mode 100644 index 0000000000000000000000000000000000000000..136d64dd476835469eccf8dcf46c396fb40f16ef GIT binary patch literal 44472 zcmcG%34D~*)jxjEGf9T*dqP4;CYfv`WShxkvJtW;gphFM7Cz-l23 z*RSc`x?TwuOYy!C=}l|9*YrbWU6xc9R(;+^p)@yLOH1X48L8c-RVP-M~-@A(mRFtTe(=aL(eBV z@h8fK=|74F17I7*J8p}h&y|z7nFP^)3C5YAIr#V^t}jIeb&FEvUg53m7g>g8k)|9L zX?Rykp&}Vq7~LhRm35*uHZxN=1< zt_(aUa(cd$3Q@!5$a}EJ1cbTDePR-Ro28t^^9#5a;+lp_#rNmLEb%R#V?~Uz1NU4p z%g}-QpK*=geJ8#fa9@M(w~6UWo(NO!0IXMtK*OCPP-z?aN?DJ47vSs@3kWddZdS@f zx-ul<=@;TM#UHTG78Obgew&ReUZm4(5up^|IZafEvwV$wq>%P(n1!_XU9rma6`Y5b z0Eg#z z(N0H2slhCADNDqGb{8_<825?+<^NDv=zgT<-xdfHEfQ1dd9e<7t58mfT#4_0qMt_a zdzVO(`F|s(DqoAKhIHJ4dx>|(y~ky^4Zm?;a6hAH`b#$bR6yaJ|-} zeyd34zHq&`FSxJeo!iazd)~S2T>pjcOruxeJ-2@e?u;Xb^)zmI&0JYUOxWSZvwbiLmX{5gK({$w0`+zt1LT*Hs?JH{Z71CM()k4qjK z7rbN4%5mek=j-2@Zn*z0@y_F2jycen>|e*Y$JmqO-{meo!WjAy#?Y;}wqcySkMGlQ zO~LnHV2n)$okgg_`t<z5*8WV7}>l8n0@*9rW#1=k+!-AEVinfRU4MTsfu zR1r6Po3cktGWY_AJVvh*;SP8`@5%x6frBPJXv)#&&OUJ9#-+`Uw)35Sis__7=kv^O zuE#YSynk3&46zy?XIw~reihp9xPC3diLXFW>NQ#1?)9`tqq$-sU*bn2t7s>_Zv($u zjr$s0tHIy;wP!Dbn5|qXq76yl&1kP-5_pa;c+PjYw+WN-E$*$tWN5^F2z2p3xVK== z`55G6(#OdEtDqUMWJG_lper zCwMscEdTDf3|@u+Lzp4mP-wW>@POfk_$%Y@ihn--m+>FRe{b?LrJ8b0#inZ0 zdeb)3Ly4)0a}$>&-k#)>6qXd9l$lhY)SvW9${Q(fr~dT2k^d+d^ZaKLccSc9mERkL z!3SlV4K`W!bMbrPkHw#ge~W?KHfjkePc+DW@;H-E=3m(w1)g7)g)_R)U262D$W2k2_tuc3o^r#t9D`YAm`56f?l&GfV?`OQV=0nnbf`5pzYWXcO(C1Jp2I zbczKSKMNuEE*485i7yk~XxLTafVf6nD{d0EiDTj(akn@w?i2TlpNI#VZC;Ogo$(Iv&hW1E?({zBecbz` z_gmhdcz@#)>tpe0_u1@or_ZZK#TaIsZY(!0F>W{h(0IS`l<{@r`^L|W=O_71s-Lue z(ruGonDn`CfN!O5pYLYh+k8*@KIi+TUzA_IUzgurzhi#y`O^5;3K0%HWj4Q(m6(&$x)V z%DBF``{Ul5nmo02>YY>HnX1NH;``!nj(;isyM*Zp^AZjwJeF|Q0OX=aPz(b|<}@blzNO9x^{>{#~+?oSxj8ygB(u@*~MFC4ZExro^XIrp!y} zN!g$BSjz8H)YPQZ>eNN4L#bD#9!q^9^{v!1so$mfr6s48rgf$5PrEPey|nMrQ`1}1 zH>cm1{!aQ=)6%DPPP=;AW7E!LBxkf{Y|OYXWIo1EL4dsXfux$ozm&r8p1$Q#VN zD(`sSOL=E4K9(p;x~16CYFT30Z@JTQ+VZaDBg^MjVU4q9SSzhf)@9bKtVgU5S)a4M zZvDOW%lx4HxcrR#;{1mEW%)PfpUVHhrr0uUO}34;W41SJ-xNd@bQWwbc(CC2_BeaC zz1F_g{zLm?_7Cjm3X=;f3s)8%F8r0-zYhvOD?C@^R}@>6U({4IP_(n?NYTln*NdZy z(~FCX>x-8aZ!f;D_@m-)N=i#Mm%Lu;Q<`5oSbDhhlNkjwj?FkzR$g|0*_SgbXFgc& zQ+`$Xxr)w;^%YlF9IH50@ovRul}cq?<-E$(mHR7?RX$XCs`9NWzpCu2JymyCJy-R+ zsxwvRt0StjtFNy9-E5SX(P}i~vfAZ^-|@3m*%5Vhesliiw&wh+ zqYhZEj=tL7WWU_rY{!%3ip#CL>F$P~;;-R&!xQ*xIDY&%&pTNoN0oNvd+>XalAoGG z*<{Nvuv(&`?b(!uh6GV$L{tLBXgo*Nk%JUy$R;{M>} z>jM{d`OC@LTcnMAZ%9*)0o(qVwW85x5oRgKPfhZP2)B}1B!yUn{yhrM8*grGym`)# z=F;XC_0_AcqFVX=eLPKFadL3QBkFeLu=)yl4c{)mW|9|rG7T%W&Cn&7Fuz&Q-lVhw zn>oUmR)#jGnv;AYBcgFdSuJ+HY(8X(LaU9bz=$E=9_^Eqs?5)h>sU1X2lXxOO|zF- zk6*cJMPpV?QdF?|fjK2VKWo}eD}Q3WuC-~(`o|8ozLn56v#hnVvaGSdyKy8Oj%8x)48>bfHrP(}Sc1rUMemBkLg$oMh^Xwq{d)f!*vA z@^EWu>5S60YYz3ic<#lXm(*%4ZP>_q!8#sD7SRQ^{4{esp$Yxh9BeI}F{AX*%OCvd z7rif>d!d)ht)`8%81xm&)R-1+PqU{P?dIq-W3(~a{&;EN;`mjo;ui;&1}@=;CA4u< zjWs97QoV6wwIwIVTEk`3h(slWK1Z*K6srwX51KJYTFH0u%P-@9;_11kPtWBxj_kzz zy%RDD+Q1{kT2q)el)L}7LDuvU`s24Wmy*#-!k%bLv`~Wjm)|yPZ7Ri$^Wt3z+03Ow zLt35yWPAc`mA{iYU@6U7g0J{fL?-$=O1T?2!$|hF6oi11(6PQ2QfX@;NH5-G-2-sikZXvJc zcHcXdTa69HO0AYQ4{1L`ol}Ldq763tC}Aa#vtFNI%A;r0H}kh#v!TCdr=i=cx~Q=9 zs(lS}DY5CN>z53!T@o}oC^mFvZAEea(e_-e>R@7*;W>DBDu3v>VE7_Nv)6!QJZ_m*75%hJ!%#vN_aDk%?de)|Bv2C2jRh>bF$V zy;|+~^C$GE+O_nDKWwKS^%(k;`@kEx!|H*Oz@vZ@gA1?{LaT+FLD}>3DUedtgHsj; z)aH~{&n_#h^Xm=S);)OjW_q#U$@%KxuteM3ikf-VCE*>*4=nH5#dy*B*#Nx6L3-tW z)^UgylPiW;YfU)(2eP zy?7g-I#5wkYz=E%^6W$V+U+GREoCK5^>VpDkc)-lhqf^%2QCtQ6r(jP+?KnTrnX*V zT3Py}a_h-O`_wnDrD!T>U|0=;`_LP(Mgybh$0!MH8ki}7med(7*{w)Q%`dP-MHnQl zN*?scd;97wspUJL-C3Susi&mDs>+p>Tgv9l**T{%U}aZLTNnk+E@M3apC(4>uV=2*bl|A#CVn)@hS;{?QkacD2kd7JMCK8{K^GC9r=gY`m=A{u_WVC~=fI$RNFrfwSEL04!(_(|B1%<5ZU%qo$U5TwM zX3CVjOfPRp1(Bxw)X72F@p&tbtV|iF> zfwt{w+)W|Q5pK($NoJ!?;8B>d;=u>>0T3AxPvN7y&WC=vZ*5}N`dfbS+#NSRR+?q; znZ6((q^V%R?%vs*l|E&83)cSSM668FK1X`b5V|g`5Kv1CSt}Wt3A;WZdUBe z)vx!cUk_H(%sVevm6O9QPtv{WqdXpFAx|Ch1Y_+39$`&%9T4WkaGTW<83DD2gm^q7X*}m=Y z(wdkhdtX0#>{Zz(4D%ttJP9jn2gI2a9?GElm}iNRBab|M=ehnXzh1xoxgXv6^zi+P z7}<241`p>AL0<3-JEjNu4ZQyeW*pZc32t9b3oJ^Kdd zE)QD~e`NcSXP*wJ$Qz)|ot^gDn|EwG+)@sQvlho z1c0nlZ$w>;cR%ETJk9empr9Ak@)ZG z8kAQyzNUEffqS zaEmg3_yJDObuW8bL-08yH~E*y*uDd zvb_0*`qmpAM?O1(|0sjomWSf}B=p=J8V@j-wP8cEMnwND>v!+mdc!rd8hQ9p$l#j( z0rk|s?K8J?`x%bMBpiX5nFQshG8AAZ5C{vBbx_Pn$~zh;3mbcDdU}UnmjJC;Nu9S# zh^DQoS=67YLB(YwV3fb9e7#+Jf%5ic=u(BM%2zViYEB958bnBWp7<+TXlWAab>`D zLzf*|-QPQF#P4?8CbR)7K*)ZW9>E| z`tT!LKlx_M&reeyHL4>->XVo?W7NMfo*A}YGP+a+VtJPcNp8xP@TF^ z{Ti?CWx9cUhx9qh38r@*SKv{RiIk~$sXJ)98iB#Lf1VOBr(^g_q+Kwwjw(<#a2c&j z01H07=9*7$Y*vmp;k}D2pNL^iPpD5roM(E~>M|q0zn0%S6cRWt@<#zT8Y-HG7x6-Y zV0)Mjng3R<19-(hgE_tZ9=f~z?G~EO3kqT;LLz=-KxrR&lzCD#;Eq=chTk|cTdU_X z#X=Y+{EpJh(bU*=#SX=?8!BT(n8}e9g_R5!bPS-iB)}!dD0l@|Yh>nUb7dGcz1z3HmbylGBZ{!G9AsLK|t zI&fvc;>MVvCG*;r&a}ofEw=|Cz`(5 z(>-ut@8FWP5k3ADc_oboTBF`e3AM&GzJ*QMd0d`VeGC>ttz zsw~x^emxb|iU_~%`E&bALmOFM3q1!kq<@c$5cMAZ*it2HxZf(y)OEP zq%q*v$0%{*QX>$Y-x}RLis2k{ts3TmVa74jzCX$_LXzc~Kx(bL^i|wLAMD%r!G5wI ztgk;<7jV-@H{JA66-c}vD-_v3BXvp=^2%`?Z4Jf5tBq}}fSiIrMNh$M9@%ROy8oq* z>t{&mz<`-QTb-v5Ylfpv@kLqM7-Sadpv(fh(ODSX-@UA04F+Iuack7|`XGEp`N{10 zD9>W{)`y_h7u1OI&?3{zG=Q*-x8}E(on8q8(h6ic0IRts zU#Lg}{2~p{STY@_eQ5b6+PM74z#wfH9HPPHbd|at`S#OJzL1yU`y6>O$Cr>j+M0$j zhxsaE{jOc>pE|j2>(+HAPn{b6;*m$b(BT=Wknlj)C+Bu7QdwOjn-xxb_w8NvTv%{M za-b& z{|FMvZ$;SD9s46tz4bl?sSj%CSIR!c_46YkMbG~2JxGQGHXx~0%>Ra%C* ztjwH|c6F6;dO=T7X@nu7w5X?Gy0L0fN?OZ|su^Lk!|*vLBL(1yUGTPe3%&z9mxJPW zH8<}utikVQ)IUqBKOBlMR1?M86aT$;dUaT52PPfHuMNQXDaW~eQm4t|iDyequ_mX>$Oxm2eyM)^%rnc| z0~b!}ZCy6d)YLlnnYk;jTN~ZH=(1I7=I)psgf`6(OX#mk6v_g3C#+9>+*U2`pTssGHA!Hp*lExe#&01<8h1+Athcf4~6DKZvbp4Tt zM;_@paU$Z5%amKySE*S2O~I!xG^%TEhMBhJ{7oe17Dcp= zoKghvmIWI*%P(MoitHA~oYT|*E~q$#1}q`+(+V_R30;oHAu-b_qP(GTYFtcqTAR;e zA@D}C1^_Ke1 zm3N-I6aPDA6^Eu|)XXfanQjg(nzgQT!Fq-@j`mS7bed8o54YH@5z*FE<~EK22=tDX z$@kbM6O|iE@@>^rX~@qCjY`hTE3t*ghKJ2crhO*=pxA^fv$FFtjh2MqK<`O@DJkih zxnaSf0scYJ35lq8p(ukN!5OUMKwb76nn}h;Z|(Lib$8QI>XNszEejWJx&G?wwVO7k z9C}G_wwXXplSpqbgii9{9ty@xHjypF3$~&>dJTB@#VnTuUkw3bV%ZZygTW!eqsjLC z)J$d=R?G|qX{?;Wa$9L18ftGF8fvTP?5rs7>H$)!Nz-RvyJe2mWwXpo<%s*M?)=WT9;JU8RaWqA<3hby_VQS3eDVBoF>2$P`{5yLKXHZ!|xSvm8U|d3ctf?|Rj!hQunZ1Qd z4NSFJc?op^1yQf?UN&;CVN#IEHP6{0}4tQ4+P&`3om;mj;(g{x@Ft*eB&ycU@?P^S~JDMvD#*FC!OVFzu!pu`jkya5&@Y5=kw1t*yw8bl~Xcu~4ySs6A`OL;^ zO=)SS#MD&U(^fXKt$pW|y!4E`yo_nNvK+TDJCkf_kv!|j+rpzqySq>GN11c5@|ZJGnT^_Pl4g$_ZNq?i4Gh%#O4eWZ=AsVD{ndHfu0{;aA?egGItEl*!E|k zGg3xkc>*K{w+J@Bcu6CE0XmjPDCQqF)R3L9$n+XxlPQ=XZ88SPRI?_q$#5S*FQyzb z4B^S2b$(JmG-~OfA3#+^e(vUuuXgVq4qz>oX7m_a1{^uqzd^T_(AQUVEqmUr2*Z$D z39fMX01B4p!Q)X3@b4_9t-fQ~_N5(^>0VTQ+pb;1(4slOakgna#%?srcyM_DFOfnd zR@u=7u7!q$bR^B4GSkl-+Md)BH`9;m-Ahl;Umj_-4n*aj|Gi5U7(b(U;}tTmjL=th zT&^uQOZlSJy~v?0Teb{)kCx^r>n8L7TT!8d!Aev&!9mgFuvnwny~Fmty9{z4C}#@CG05<%MH5B8kuNgBe<2O zK)X<&W~oDK2EL{{hkyKH*GFBySTNl3*kfIfQi}@JhUB{?(jJ9%REnm>8Wq&R&_J~i z(z; zIN*mhiTXjZ^GD533X^M}iw(*%Kgi52|1UwV$4B!stva)h=Jk<%u2HF5_DqdT3tUQ& zB--l$L9-ER@EchV7Oqncbj{j7wBkRKa?~$eN|AK4*ii~lfITZhJR$MGay#PzJp2hX z-yaq!eUvi3pl&7hN7rrDb~C4|T(;wiHkt1H^{l2sc^@L(WTf+vGZ^rKH8>|dg<)4$ z-|=>TzhP)sTN{ry=IN(22 zoz^N!_Z;NYb@P?MIlQ;J+p)B@z&o;S0c`DIDucWv*8{G)-)DgBG!KiGM7{7dYXSSx zHs(?$_=RDdGV9PYiDSz=zjsWLE@k@YSkNdkN;7vAgphOXLYHfV`Jptv9e!3lsT<%7 zOrAw-fkXLfr*4H~o~*&k_?@hAB^M?NS#dnrUvXuo=8z8an0Dy=G=F$3hFC5c#gP%R z9JqJ5gQ~`2>T^kCxt>)>iW`e8_K8SSeCY42Uz$mpYZ&{5?YrmhvU~0+yZat|rrmw_ zjN|-JcF%F9alrFS*b)DVaXJMa<$`#9FZr6jxCcw~mikpnjZR7<7NC`lRSh#6dv1MZ zVRggI=I+DKvSG2xroNr?X|0uVb9XEA7Fyb~-Z*l5-y%y#_M5jKIkM?Uk~&cLKoT9P z8`yM&$E>u&Nm}8#1=Od2dtznou*T5=P+q5IlG6yz(=O*(2B^)mj7U)0oz61O@AWLg z1r8r6p=;C??Sw*_2x*Q+S^t1_@LKhtq^BCEh42SlC{PJpj<(6jW6II99#B0ed-a44 zme!e`fGNB}ReJTYB;Yb)jb@V|#Qt!49}N5k&B6!fUF~V(gB}Wb6D1#l><#ZbIWb{v z3H3CdFtER&wszK!dzTONT&~ugv6Rh#_6YMHY*+9*dd}5%&EfL| zAebT?YblqHRF|fe9iTT;3!SWtYKNkaKxcU+x8HK|KI=CF*M5j_$H$oj5=xH6ia9xas zJ(B`7`mOh{X4Y!p`P9G#9A-`BD&~`(HccHs^|``I&ARFAqes9uv#_@WGt(Hpd1*L; z4b??71vi~{5rjE;>!tLdmkTW!u~P=?Nymu1EoEVw zC}-@s$ignG<4cB-0v(bvq-4m!krfkzo9K|7Z89}v>)~UUK!#es8)m>plmYKHtn#J8 zPR0Vxyx1np3pN4H_z2xytcSJB`G61 z8U`1D2^(99w41}W<*92QUxatpx=R!KhGh-`{)eNwcQ&Q3y4Jr&7vIA}xIP2h7U>(w z!zRmJ0GQo0<)*gA9b*k=e+BZput}VmmiqQMX7O?A!b}l9k>&kKOdiioP}Ru`)a2SO zAIJ*4iqrVegiQ7_;i@ z&oJ^4(tGLUdaOH4vSr=6QeX20U>qr7$|vX*Hm|V+ zmu8G&`3)OCbZL$Snfz2m@)w@DsdZ__+RTd5oYa*WyYo9D6l>?IE3W$URlRc#HZ&Y; zQ1)7Kil!vah>Eo5R3^_)RjO`YyY7~w*IxFJ8Zgi_r+=Wa3GLT>9e5sqE+^bW3lTk@ zb^b$-mC8O>W4$uqP)4jC&uTBnmBMQ?*5$B&g(fw+S?;L~-BjmlzSm}a4;%iNvUqNX zoaR>6U(k~`coa2U?N-ugIjq;=b(Fq7VFf>m1Hz?SIK^n=;HeMx@Bd)mL(;E6n{Q=t z>YsG)0!Mj_Q`VJ?nOi+!q@^BH=#B0GkItBGaLaL}Wb$3Q^kw=)jeU9PQo3qT{bH{A#USTN9{IHrq$D`k zA7hsvY1;b3n3^JW_x30ysK#ciS-ZcWxHjKbw|1XheWt!9J^tljim9tfH@zG}|H`dS zxM}@B&FtJN(@pD_*FN0TAO4?oD?W$QK)2FgK++MLNYcy+u9|sin2}xsbs(i%T|Ebw zl&Z&d9`G!a<@Iqr5l(>pHn^2}@&ZM=z{&j9L0RJ$8>o@jDYufDuhxtUF7Q5z1Lmtv zu4)_)>OV^oNOCKj8R+bB3s*!K`z=WPvem<}c5(M!xC@9_yz}JAbR@b)z=uJ~svz_>8Psam*-2USYXG z`L=9$@K`Wq<2?bDbHAoHZIe8T_06ypx@t8)Q{ScRIc};@GvG~9b}iO-?;?vvb>c^hCbv-u4B(_D4T?ZvZ< z_5Suk|9ayrig#<9@~@c%_?tN#I@&--`|d`$)38U~t=vm)Ck49H>N|0JvveR{yLh9~ zhtM65#4GGu7bSNgpv7uHI;v zR$wFL1eEqqS{w560}Q#meFA0Yjl|P$qzsL9wzpRH1y;5!KwBgA`V6C@Grh?5j&V+v z%ei)jpif`XX;6&gsG2&}W@D)6I_Ij6VPoBtrf-F13#xLt+8tl%O{~N-kGl&4+M4rw z$JvP?eeU4%!t=MZ$LZw*2V>j~c@PK@Y(^{X z(dE*xF`GyZqft`DGd%3Em*nyR;E3f>ZiA1Uowa(x$7_PDMxXXy^Yq7EgSN@}U)|^K zmb%yhi-JrzdaRZh#-^INjg^yVehy zgB#qdFVqjuFYBnU>sU&Y#_b2?Yly|W#_I?hqj&;zy+d|fqfXyNf<-WF)h_2LXC_JZY_gS|uTTnCH;=Zv+lk@h2j)I_fgq(++ zVy@oT7<_DwchPRUIAPP_baQKx`sz5o*hF8Yc)~8LQh%jGt!yqXZr&>$$l*(#rcND&S+{@j z9Ln}D_O)@b9MMZWg{uE_u^hEE4Y!TjjU;Zd{^t2pTYvK$Jkgr?K`yazg4N=UP3r0K z*NQr`C?qj^W4RTI$4$ZI@aoeuDPs z6QcUwc#Rsh0c!XM9lEt;QBRM{?l;5Gmf=yOodb5}@fz;gVmuM=~^Xb{g#o^5E+`LJn%zR-B&xQZHW z{(WBZNTyhQUcAs|MutH8J{{1eVe2@X8gG#M9py}{UNL5GqulYxyqR@-U+eQRd)8?+ zM@ObQ8IoKz!krkE+CmMw1_bMc1g-9$d2IAp+`IFvw%0>W&^2zGJ$Uzrx@~mBhojv* z{@GgLGX8na<~Al?2nlqx%W$1`;oY51CgFX-ZJtg%FwaOv3@A@XU|AanBQ85$OfInG zU2yk{;*g|+CfEk!zzN&q*~bT~|BK^dKK$P%Kmp4#7i#?|4X``|9WUz}P~*kg4C`w8 zgl{@y7C@SOrb2$%CQ%O`Ndi^MDhtEJq@YQ$<YZ?rE!>K~W;L2OLet+7&PT@GlY6;X`;ugo9vqIMq)FUmPuI;i_f%Gn z?mBAT*;G=}H2eq8jYkUNf(pu#J{{~C<7qjA{`f@?h2A{&VR5SQ;Fku{gIxCt%1KsO zPk4cHPI;8m!8&PYIZ}ho<(x%1VTkQ0eP=XnU8p%uDiPogtJY(+!|tXcX2-oj78f3i38EKZNYYuKVA}{}bdl z@Gc$J2pP0eP>5c}Jv}`^EKT&tLX?wRh705>|8q5Lv>cWP#Ur3=XWR_72{iQdkaQK& zU6I(nj&%1(T`4T|a(AD^ALN>^lwV3X&=P)wIYs(K0341EgU$GK-{@|8s8y;xHr#tb zUsgf~WErf7b@ed;ETFm30_8rzvpqfd|B~x&K^Qc#&2V^*=bk}@V*n`Sa@^{=Jv)4; z+@@GFeWckn-q9lh^Z;DVvFbNkQ~(B;asE5Nso6zPmcuS0%Zg+b3xnw}k;rX~CI(S6 zmE0t^F-q`&NXTxpz>9hBwI6#|js_X9dUL!j=$|v4p#~19d(%zeh3+8-Zd$p$jmxP( zIoh5`_R@spBzKF1JIjgE_D1ee-_iI|ashpGvHMpH+0~cD^EJ0{MQ}ECbid8r4 zlxex#5?L;Ik_IzxF6}w6VFP^XrXdj_MzRJg@A$CUZQPy4NINElM_zrkfBt-WvGcvl zdM~3y^R-d+&G@yj9x-9liZADCwCW)XC(tD zax7>uEkaPH6Bg2jf-|^<`hX;1un?CR7w4bnfgtHY-)Adlzj1cj8uXFnw&C`EZB(2a z3)=7oIl?4-I=*~(H-n~4iFR>kyiZ??csqh{=sFY^DA7SWUGZLP%|4=QWyVF{Vy(zU zZWxs7nWC|f%CbvQ!7AlZt?Y2Esovw2U7DMQSVy$qHW%BD>x$~b{ks<{HpEDKI@?_1 zx%HUWttATg4Q6fLXA5%Ff{qxOzeh&Vsh%BuvfcYAV8yh=5v&g|dIxM(7Ea8w=$<=cCP@8Xp>DGPT5oVDq_K%kNK!QJTE+rWVmv9m_C# zX?}_<7fAn5-3H<5ANqF|0B-egP-Lm$uJL?1S$E_wWe91%DKE zt#CCpI$&cNBSOY0bCoj2dQs9I7s;W-16HR9;yngnsmlPoyryFBNVheWrmpq6Vp!w&cbhV$+hXf4r)j(@3GayvueM28|2jwO?hsjp$5^(U06 zt}jfvRS%0}$;=E0Sa4>+FBSwiBIAUslQ1MC&J9~&A7RZ!2K;s8J^|^(Ak8kCR}sbv zb|z!zKy)I!?R6WwVauNGZBsmyWP|y3!R;AhfFQ&EE zE?tUNEm{PZq3*d2hBs#y6xFM@IX3uf`rd_-pNGo*72wK~W)5De;7sz01 z)I2j0-%97tH#x%f{CtbrrbX=O*SPd(+#dCPrIRD~4F6kW(i;EQ;s~(i&yB;_QXQ<{ zC7{5t&iGx!3TP~U6rVmAuMDrQkGcR#m+0(Yj6tie?D8LrSw-qRmIJRo(hEbM3p`P4 z)QXO9!LEfB|37j?u%g8-lKr0vXtnVOIvgh=!f2FLErL-r2GZ1vL@|=~v5Q7B;`vR+ zWRT+*BSFfAm@&qM!#y&?i-00#;@}L@j&|_?4Wqd5kr>wXdTFi^XF;n z^mLsze)nF4o-{t8UIIaljxkA3I%gUO9(Qc%e$s()8vRr6|M}0X=c-GFXzJ zs^ZXPq0k_^Z7!omj%60+z&-~x8@|6;_dlHqnhZz3mmr=BJSC%T;|5f5>1td4*GVR4 zbd?ZmRBCQ;(2l8--J`7JhGGYB>B4f*6?}W}VKQ8X{$uYJt^c5c#QMl;qYe!r|MlL$ zd&*bLSgQdYU_?HS^TKjTj4@r+hb1FUWdf>>9UC}$l+pCt`RaQ#eg1DHjlk2L*N-1dWM6~^Z}+hg}qIK9DZi7X$|7f03@_c+xNlyhIBs$g z#;bMwI&_WRp1?ZrtJz!K${pX?F36?ypSppri~2Lih2OD1NZSVsI|Xa@95y-W!BwD% zZev>G;opC~-XiA~Sf?ZZ`42oA=kW8>_8Vvxs?ji*13_u zxdr#+cnx>7Thoa`nq*0aS2>6c?@CpV>WdI{*fApH%EqHbEdPSG;P1@3TIst8DH`FF z%tpE8CCxqblbISJPQSK&Pgkug?A`D*girmw9Hes{lLdkt{Hm^Y|&S);9X)IQ$3!}LN^Hid57Ja*#g+08|1pq znckI(>uwj=Te&jLeog=5f$y4p_Ue-351J^PJjC-XuQN0`$r}!i?Bj^Il2)7%rHMmy zr)zLZ&0I4kK&8g_5eXRO@p?cnkE34kKP_@&I9;t5Io}Zi>xdQ-OS7apB4I%(A|qot z;FSB^*tf<}?&wyxLao4IeYYF$I0txw=#_Ec;pC}B}TNu-WcP~sX5Ae zx^o&__TceeO{~_m9q^;zO_Khh$&S5v(ks+0;--v0t>j?7l%+A{6V}T-QzgdspG!JNZ%X;!nfC?c{n9mx7Yp<)j!<6Ul~}oq*6Z-Z*6I}_ zJw5NaReNsBXtl`eQLpC3t>yi%o}Rnhs^x%$&T3uib=B<|w7gKd(rQgYsCNV##pyUw zP#EsfqK-DsbE*FVWfW*-Bsl_@(XEOmV#R5Z%-WiHoYA9*Va)nF#vDr<^6Ub7RF6k) zK>&bNlAhTEoVSA0Dh|I;SC7IVx&ZZvoimz-1GQQ06vf_Z+Yx99!p$x%O%~Nj9g&;0 z>v@+s!eOeC@(SWK368mqcr0wEMua8=XGEL%tiyjR8lUEpM!B@~SkPvM!w!C|@AOif zEZ8{(NSI*D`a67AF`^JtPxo7a#|M^a_rOJkSxR2ftg18Yhf-jRiJoK0V>ev1*FrZ+ zo8lNLhEhDlmQhadnozI#Bij-1i@3;DRe;@!Io`S+phGaCF5Ek^@l0C@*53_ht(C{@VE zvWno*sXoE-jSP}R>MxZnykprw@Qyr(HS_)p^zX=KrO4Sn^zT8ve^H0yci@M|BS#WY zpO6d$6o3F-$_UQ9L|&Z+*rY$6bg=hQXh2czPCU!{v>8{m1EZ`(baV)*CxF*ab-Zdc zzQ&!zVGr4&Bm=H5cq|z-e}mlIY2DKl>5_o=dq&De&Wt?C_%otad(fyYXynM|5yQxT zkG#YAq!BLCx|dB!!)$Tl_gy0;BWFN6pi`q#QqfI^QJUX zd+B(Mx-dtH&mBI4HsGY-U*as%zsmQ~ls0@@gOb{SNVR7z$d0y6!pAmA@4y0l$P+0% zk+!T=N0iId*M6oRWWRW&N#&RFe2PCnx0;AA9MKyG0w~e!z#!EvQd%?Oo4L%O{NZQn zThAuiZE+8fY3{1a&s@H$g-j2|+3ZPl`GKdNI#4{=UdW?`F@y+W&mQytSD#|i& zj82y*o%9lld&(nJCyxj0>T?g+Da&(*4UESfwvCW3DbE!)-jY8Cv{CsJA!9C}V&_JLO7G$D5J$4?H(9hk~H! zhP`iOsp?mraLOHFo{%!Fu|LCN^hca#@8XD}I7b1*l4y+7*E^cwt82rdp4ofV=zj9M zDmu2Rd4ApW6m!7kYZt8wrk~8kAnAOl&QMog+u{cU81|-&lsV6?fF^?DkK^!)XoOB@ z(3NAOyE4vRt~P-Sa{#3$l`i#B)w%`w^G3>?alx@Jy5z{<%-|-D4h~0~iw6i-dCs4O zHiQ5-(pSdybP1jxTzqWR4|;kWr%b4yfVBetbinV3waqp_$5a76>gn9cacd@uxcw-+ zQ^pCpt%ge&F`h!CzY;89;U0TDU7b@u^H4d&j5?`~hM^hG9d&e;wjTI7YkCdHtDdD# z)TVbmYNNUd99NzC4)u<49G+!A=;vLy_!01_7fd$iuLr^n;F)F4nB0&Bn8-lHxTMEH z5B~Jn+`}z0eJ=XeaZUvIBW%5%7CqT5o~K3J0pjtn<*8pYy`sOJ@v5<+bJZwEJO2QjQieAfjk&^&(oaG71G2lVyw&Hq0M?b1>9Ll1 ztu=PxY7Ld`a*Mc(^#;NkjtROfF~wzq$GXHi;r*D*#(>^%x(v+vPx@&F%=A4Lf1Y~{ z9eLdrepHA;9vrjk1Ir(~*-*AI5IEA#RKQw#6c%8|ak7GXoJqqK7)d5*OBnFOF{DFf zJQ;3>8!QqzV75h*nysL25*(_{o?QVzq=M%1`~=$QC{~ z@->_mS#$H8IX5@blk)bPs;X*A;g2zgNOsO&G1xhOaCwEYpg1qn(ZGMmY6%KX;O7zb^Fw` zmYC$^*vUy|pkh{0eno6pd3$1!lJsw$e3v@?YW62OG06MQgYlBb0XbRWKYTRrAgD`bL{q<_-T{K zH!H2mad%L#pe;!(y` zeAf85GDKYrS4N!HEexkXcL~rWr@~Vv8!>rUiDQ$e%|b(B#@YuwKwgM?30?!zu%|?0 z31c+NAIxc1Z~5PFYDQ6i!6Sveg^v{U7tLsyJh-E}52x(*Rc{}RQE!jT_~PK?g(qT~ zCZAjwbFEq!S4e|#cDlCWP5FmId%whAMd$T%5Tm-Yb7Wv(Kfi-m2O6yAXd!=;o;&zKdy~VwxSd=T(-%wVj`T-@Y_kWlhPi&aVedn7l&UG89OVMQH)nlMAQygIGVBg*NYH1+79@BueZHmEOb0kTtbXv zclef19O&CM+;Y#vLB9>cgtL#WGKPI3`~Sj9Izg~!p6Miqx&)BNjd^~Yr(rNYfvLtp0Wy}h+B@F7qv17E$7`9K z1uqyKJ`#rsB9Qk)vmRN-i60*Z_iYaHZN3nk1FrGqT@YD88#tu(_@HA>0?isy^f=u0 zfc;V^6cdGv!aZRtE-5JY1<`)d7~SJH$P4~w-y0fqnh2HtUpCAknpnc9_qIoRPY8EH z2}><>K%#s2g%$Mug;1W{Fq6d^4Z)wCIPv&+)WJTjQ%Am2Ue#e5mv3E?sNy79$+s3x zD7d(>g^TblFUY*#8PWk?oG^)EQOi^Sug(hzW?I+#j1jA%Wh-0-7OJT#9v^wC#BQvo z;58SGs&@!q#|x@G5K7sSlsnx8GDWuUX{T7`E&1?iC%!F^nq7H=oGGNxe(9o@JMLR2 z7R20;f9XP*gxe6VkHs3%40&IZ5ifxQJGr$y{m5yAnNXgb_za1;%)T$u(y0^7IOML+Mb zB$#p&iyT7s1&K0ijNr{p-wVNe3Iy=Ky9nRj(2ISq{MCa#v1ouN7_T4X1o3}t)mx@6 z^$ZJ8^g}taF4Br*tVmd}(&vUthn?d!3&VAgQDGxWlx_iLUs8Fu0iJDG+TD)&++b*jIaFUvj!d2oc&V#iRVFWGQgp#DLo_=7S6h^A~} zh&HJoEB9*heWi$0UQ}-8JSmit=52@$C*?&ok#28OQ~XBBDi(6`lJO=+XsRp^;e zPsL~+nB2qdh7_ZBMGca*1;}JwcvhFU(I1hY(^rZ()Nu#b5pE>!=#=m@!+{$5vrH4v z=BwOMqb4CU{jp75F3XQoUeMC}lEE16ZBHR(2Pg68B!l#4;i9Bq`bO|YbME_I`Wh{TF(;<9Fzo6D?eIL@xli^3Xmd$#UgX0NQY zXV--p>jEBnYVPID)`-Meu~%%PX!GV}13Tuh>?cggMFg z+i#y~r5@^Sovj{Lp{!t9{19jPCc^0Bt1vBh#dwNjvsj+AK8u zIu9I;_DM`iW5ZB{&tI#T+wuph`M|U4fqdI?ep-@kwPsgi-`)y*RO3rqvDI3<=*S}d z){@nkwE%y(F?cw05Bk{ml%KH|6nr7V<-(IEWZvG3D4Fvvk6PzH!!IttY?4p@u>t0n zwklgoa7gCX;j8(^Ce=!5PXH5?X zEhdP?2ps^7?^vGLm5kjveL3pze`h_&4`lf7EV6YiUD~x!emL4`P%@NBn$9Z4#{aw{ z3G}06s4MBP8b@cqf-fxe_-ndF;p%>5YGqiq0a#VPwP^P-_maJIwh` zgQ_lcE|J1K3+Dmz-cnF6s0!|7(P>a$7{Bd$<&~~izWBip==$p=Q@Z~@{KsWgj2tuk z!jQmp=w%YNe289=5z2Gwb?WzIq>W_kA)lW;OFrtkXMd*A#3sX6hIX#O%alzaWn_w{ z5Fh1Q^~|E&7u$E?fj8~MtRp`5}K$AC(Le^oxqLSFhAY7RRL zG?)&%j8oU7{RAC{zEQ~s$E-=xkBFjtN`2=Y_5F9~!|zU>{O(b8&09Cz@YW4feQe$O zrsj3u4mCFqH62LI$*#`HNeYaJ2n-4j4|tnW-+o(t|MrvLojCE`_Cs$SI`r0p_03I} zUDniG)Uv+0xv*$*Ze>nRWo{nMM#Fz}tlZU3pM%Fmz()?cLblgKly^Tv7e{zWqn7(w zx(RIDay?P^4*d*TX?u2*Iev-Iub9V_=315tGYS))NTOpJN5OM}SgSu1^wK}mpB3Q# zclxtI#8aI9>?OjWzn0txRHM*#{naloAl=p;pg*?{v0ZdKK}s5$qV!-R^!s1`TWm& z^=Ad%^RMd9@Mjf&)}OsZGL`7h-olGE>d!vF&o2Gh2>Zk1`tu|arG)6uzL+WV^=CiP zsdVel{vt#9RDTW-sfG;wIgmaz4Cv26qS2>De-055KF{jUp(4oVkKzFgC=0Y+d5CyC z9nV!_9p;2>Vo0nI%f+DBh~Ikf-2^#%J-)3FYmmYu+A!Oj(AO&f>0`})^(53Mq-8_;{mapyaW1@100;!pjH-dsUVC9~Je_Q0gY_wpM zsL;kQk=_sUcQ$jxvtdGV+pL`ojbJl6a1%$=px$aQheJl+{99;E!% zQR_zeW)0qr=FsZsLmiG*@>`8)9r;{|*91w8>oAE9l*2WdK!Z$5{rH`KVP3Rc!p6gZ zf8};MAk^B>FSer38Ga_j)e@K8&Riy7gW(xOJ`DzLz2i5=4VS3p)_B`!A2FGYM>{zy z)()&2TGPF8#k#dw{oqV~mD@}!)^6C?y?XTujFj%ReL3rfOq(|FmyLt{rrLFDH=5ek z4Q$-fJ=8zlv~ArcQ}4R911pBsm^Q964R&wt2Y2l5w0kC4Xd}A zy7`r9%ZiPIT*4apv~JTzojJ=E{htQc#mV~;QRvE8{*RLaW^F}E1sD9FSMiFF$^fmT zH~a^TSkw7p1@)5_xgW_xPmH0;7EglyC zC0-McVE*qFhcNEm#F%*m-SPw}~U z7VEvprbe10PU2MXCTgY@noF(JM(xx=^Ju>Kk2o*R zijT3HS%8y=7t$hHOiO4f4uS3F#X0p+KMl}w8l)Apl2*}bS|ff&YiS*=r_01ASd$Nl z-;2M9KZ*~;pTtKv>Gea}fc4HM+Duz$D{VuFqaC!9cF}IS9OtoKL3?rX@_xFKuA&2U zHC-d_po4TRT}N0{(G7HnZloX5O>{GC>xb!9x{Yq9BXkF>@;{F(H+i=Md`rbP`f)b|K0U+v5=*2#dqR~cq+aZ zKZqOgqxeZY6VJuZ@Jsc-h+oBT;)QrAUWwP@ckOfS8|_Q@dX*)XJ*yuZSqhJn zB$9h!RF$zz5nQFq?8!aqf)vr(1AVO&E^?n*WlOErU23)7k^9stqmIkMi+olV`NcF| z39`vboK5rtmY1`<1Co~`)()msHVKRBJPoUIEnmKqhZMP3itMs9cS9ah}6jX@&!vb~-_pAE4HeAks zty;d*hdhuK(L8DLGUrS7!zKHwvE?IDc#SX~E#{wby)aRq-R-p}1#C^C{Cw2L+O>sc zj%Bw|)6zTZTtYqTSQ~u5$@G~tQyi;D_sU*{xT84D=Z!O)o!IQeW+x6!7>8%3<8Zmd z1sKJ6@~1Xd750_*{d^HwdBqJbMAXHnVBrm-|znmyu6p0ckey- z+;h)8>%D@65W!-%Fo=0|b&Kk6ul3y}#A99fG+|op)H;!lC-K-K{2DuVVSdre&s5D8 zf|la%RW0kAd&)DH{z-^2kwW;KTGQOu<8YuR@fh9_{%g9nw%=|qxLSztejyH-JKCCC zQ)?gEjqlFmvUcDD-v(bB>O*;v*0H|d{=Z*McnW`?7Q(o^YeP$O%8IEk0l?>lFq~T7 zZ0}LbVmZDq#rx*&=Jjnk)hQuD{OA@m_fXGX73FkDlqI^-& ze}U@)zVE=_KDckj-}m5N37Ad-)*D2C;in=%X?Ofn*^T=ezG<6V3XnE3s2E<>%r%fEoD zP7$G`3!4%sLJe_%Wi0B!GyPlS(os=OvxFV@EcBz?iF?`ZN@1b@0FF)(!0#yA0PC}& z++aqzED=H9i+K|Nz`bHXTgNd5hw(m-Nh{j#(ECyVc%BgjjBoKTyb~l6s8J-#@}G$W zgFmk6co(>rcxT*uU55Mc8IJ{zgWE;^j^AJ`rr`cZTz^*1I=*p@1CNFKH63v9-#ixX z7mvjve3y-j@jlFDXu;<^78nQj3uEvi#=?gCo49@h9Ln*LbO)_Vx_Zs=os#8n0LO2k zpJ#FZ2>17J{|fiNVGIno{|omzrcHwtbL4&5-#C2!rkp3BRi;myWdGfGM!6W)5qWSx7NQD7raim_&vRD z;Ouwe8_c~&Fvs}XCyID1$bxGE{(c?vlzDNa`jLL!g8LR+_uzU)L^@XCegOA)+yijo zd&f##YxVnl+~e^1MqJS%R*e_20|%93fH@5PDFB|I5fRQld*78CFpf^T_M%HC-MGfl ziC=fTIq`=(uc+X;+FJ1u?lz}yS16q|BJc~SYJ!N(9}h%jUsN)5Ld?lU}- zv^VKTNlzucn)KJC@5}+_40C~blDXF0W8P|hAUPv>e)7uXTT}c}B2to4a#E(Jw57a| z{!;qu8TWtd_>TgKihs=FINJGuzE{Sgog%bzR(aPT41Q=Q)nJkBoJrc9bS&v~(o0Dn zCVgpE%qFxmQMS`>zArf?d0z6uS{EcUtOY^i(Xg;l?X2=49TBw!UXbpc(9n?u{X`}v5FKxwV+h{xOpv&d= zJ82i~qpN8@D4gHFmae1g=>|GL2lX zAp`j-0sILN>Wx!!NwSJoX2joGNrUhKHTyx9^%rAAfCv;p&sznV}w^}h3Yuhw2UCadND`L1&^687KnvnkytD) zgS5R=EECH`gIFON#Y)j6R*7cxZJ)SWTqCXnPdh4(iMz#J;)J+I{8;=%+$ZiAC&dHe zr{W>;pg1KS7C#e@iATlbpr9u}Kfe%9iKpo{&{?Z!6P*|_yZDjl5$iBgo5fn-e80Gj zUJ`u-tcx{b3q6N%d4YQAWl-l1>Jj&fC&d+_MRe1zshVD)=f!$)Io$y|-Xr#kBNRzd zOeK;oKqKPk^rrX~O`;#sNxGAc^GMPU#a22@x6(0jmAGD9DQ*zgii6^ixKSJsKM;rM zx8fFYySPLAP<%xTX_?qai|I02BDT?TT1uFi7#r>11YmMA`t~(d(j3tE9y&p%K}GL? zb9|u$DQ0E1vR^r&ykiJ6WE(mRcNrcvykz*3;Y%MspHiRep$Wa?qxvTKT775x?({wC zd&2i=-*-8J{|aFPzwH)26Y4-3VJ2z%V59Y*5J*-j|YDd5)zUWG9jcRWOK+ZA*VwA6dE0x z7CJMuJ+wFU`p~;Vp9wu578157?B1~RVQRQJye`}xek}a0@NXgtBIZSOM;wZHG~!&u z`G~JgK_;uI)pWpg+VoMRIdV>9N92jfvymT1g+!G^Er{xkdNAti=+fxj(Z7vJis_Ge zZLI&;%CY@p9~}Gf*bA{?v01TIv3p{ljD0`OCvHOAs<><8PQ?8w-ao!5epUQ|_{ZbV zCj=x+Na#tpE#afYh{RQihZ3Jj{5mNsX=&2_q%%ohj7u0db6o$prSztpO!+7^C3SV`zSKuj-%V4}GSX(ItxW4pJCJrV?OfVt z=^{NSeM0)u^d0HP)1OcOF#Y?Cu#B{f@{9!;T^V~aj%J+9cs}EN#`l?NnRS`{nMX6v zW`3D9HfwrTZ`R?gb6H=HPa8jH{Lb;`#($k1on4pRoqa6(`5eETnK_4Y-kFdxp=ZM5 z6VzOD?t%xe_g2Fk4J%u+Fo-O>cXi?FDqECw>i#HdaF8;Qpykt+w?ImYRKDPK-3M?}%%Pn1& zot9fH$1TrT-m`pb4YI~rv#gV>mswk_+pPPnN3Ex=uUP+N{oMM!Ex?v$tF+CwEw`<; zZL=M+J#G82)UR|x>7r75>G9H+O23(yGO=djzKJI$zB|cp(#%OKCiPD`HtE?(ACv`^ zWtS}~>n*#j>>R6SZvR5c6Urx)mzU2jZ!h0nezg3-@>k0LRQ^rH^or#bT@~9Z4p*G2 z_*3QB%A(5N$_FYhOtwy5J^9e&XR9KrR#ly=4yo?0ezzv2rnlz&l%gpoYvXF|wTEi& zt$n)o-P$jw224$vT0XUR>i((6r#?CL+|=Jr{j@HxZfV^kb-%6qe478X$Z2`g>ZYxl z_RO?Tr-y+%L&~7Xl)E8SziliT@O$Ah?KBL?{&{&{MVYaQH3qm}roC1d) zBZRHkWJ!%O6wV8@ZIL$vDm(HeP{css?tTZ zcZ6>X+}31o+HtmiaZF@L>b&BbitzdEAq~rd+o#trijE2%pHWnHSNPhVkj92!n6iAu zc*l2!sgM!VE>X)2~vO0kp_7ezt1)IW^TKiGP7?%bpEjyBMZ z4Qk({NfT+6{NQ$eOl*I2O?$%}2T*Ge8IG@&E0r_A?s%+( zB0VM3YDtYW;&(|#DmNa3E4sMI#+Sv9ilU<;jTx2_tD(de19W64EqO5uH>6x~)8d8m zn_c(uhtWOdFCem?lWXI=aaR-^1z@Q=CTt#+E7v z>8|Edt94>?&GhLvwLP_K_nEflXLj%Ul`IqL=oa7WWhzl5BQsSFsBvTU^yxLt6Rp9To&JzktMZ! z|9-7ZC;)g7eU_h7YUl=pVLM-f>V_Y}-;BV#eT$QlMp3-d8sO3YC|xv*>3gd@5@xM7NuziI%g2mNWAqb$ z+CQbBWoKK*KA(O=O=;1@%95M}TV!QbRar%?&lbO+o)u*a!lB)0JvBU)qLRS{iqlQuO2wLo9fHa>uThu1^c9^@yEfl& zLpyUxz{_|xpVasxSrGx?}aSWwzw1y8%VH=RZOiY`{ zNn}l7#7o3ba{K;mE$zi*$j+>23fvgnyL{7uoW!-ex@zi*tkprZyS>pqlQvB(X^WV@ z^2z&l&o8Z6Ib%`@h!R$39tSi$7X4x_4m>3LDaPUmlO?yC0_Pt{*je$2a^$6!P3lW~ zDTc-`VK@zP?8X7kD9LS@>MSLhV5I0gbDHRwDEt-@NFF@J^>q6Dbz9Rb_dL6&GJPv$ zudb|IU1{l`S+}DuXzj9Xg%mceWI;>If|6-rRJd&!{rgBs^gO;fG z`8sRk`ao4^_YCH;nb&ul)mEus%$TfVoCM_uP7q3f|E+Gtw>Bj`xqn^v6}>eRizcR| z7Ze!$AO}R3SB@J$J$ru3=5-Na6;tvu(@Iiu=S+GVl7Rx+SZinoJ;CAx8ZNSB^4j96 zJQa)GWJ)#aw9IP}E`8#Ia!hXT(%EZzG8=jhJoWRNZhpX;YW2%*3y7FrwDgMhSO`?zS_gd5i`?wmgT`u^i@eg4qt zcPYkJIH}22P}T$*RkvU*8FU-ZZWP>SHDcGidcSQYednJ|paMLHsseyU- z(w!=d5wJ0#%si9{g?cTM;Qa5qgO7*WlTU?N*{^sS?7)3c3LEC3AK4TekR$FEWW_*TAgpsp9 zns#qLk$6Suig~O1dYk7o1zr(z?24mjo(j6MGhzCQgC87RS)I_l@7(Rj&Z3VD?;U{G zpI1H|T7Vg@v(!3@Jp9uK?o$7~qhr_R*0x{Wdgl`Zr|JC-yShNp3=fx&M|toD8(6>m z2NHaiZ0fIRhFV5%cf8jAK*zwmj=}eX@IItR0=fXyM9@=)g8U|mRU`qyAzLZzy0acK@|nf zba_X8Vbu-&y$2SQr7yBS|D$6sxZvNf!B64I;h47gT^z0is!#0LK{GB_PN|<$1c0)t zFX1(387TwHwKhDpZpRM(hD4m>Yx+ALwN=)F%2VrEvlKYVv!N&B@V-+szArvoCUpZ~3lG7;pv{ExL57*ONg6H+u%Ig@fF|g4vb%Jl0 z{lcQL6ggL-okyPhx%$S>fBv7dJv}X}HwL|S_{giTs&Bp83aUKRvr(tVT2vPxq35B{ z=Dr~nGX@IUX*2-3&Lw@u2cMz!8i&D14=O z%W!~^#0VV{zZB(ntt%ufM;m6gs%Z>P&sk+<>roA&@f&EOgh?9Mw0Y7FxL9HbFEB`c zB*8NPu1LQeqTd~S?zYRBN#Fl#+dWQzsydqdeX2STEDiXrfkWyyG%RBEWbRcuYKOqu~DIE z3#_$O5iQ*tE}OR`CMqN+v!vqQh$S1bcr%?rK2-7nKQuhZa#+Npia*%#=D_>E!IbO3 z_tk)_6W=rKnyr#{&GPpf6malz^{vZ;Zrn#dR@+aXrrXp8p8Ui#3w`30T%$l|pfGZr z{`pnkUHu)#<$c8r+K}@C?-}mKV~|FV^3`}MHW||Q9@ujI)jQ8_y6Kip&tax%Yu5KD zXByy%B*^hkw6O_~;4jR2jhU$?LvcJQo4)zv#uF!Q{N$U1Kl>TXsI$KOQhiMQA&pW0 zt@W2-+l+GlTAN^K;U@a@9xL6kY z8lD4vK0!L~En&lXM$<9npmnuvQ{pYIIj{SSquj(`PjVaG9oob*C z^)}zylA;QOaC9BKv2V+DO?4re1+%Lb6x7rdpx7B8k78!bt3%JMN+&1?kT5lN!>0ptZvx4wPAJ1q~hk#ZT{O=POPpewbe{{p}UjLSIpS=+kG>ZmrYz5IIoe)7VTcN zpr(2u(=Vhu`X_LS)d2dCT-mtRm}p*xpajimEVbLK@(QEE?W^ef8NvZp8Cg2p99yUU zjp`Od2-DdE*Oq`yVLqFCWpp1M^f> zdslBu>cprUz-gZwqJURm6=UMoO}7q%!t*EviZC<-dwEV?RG58IcFx%FEe-W6W`xgJ zHO-`KrkIM_6d>Reim9BE5?if)Naf30myFNL9Y@tpoJzU^PW_C`ecW3EQj6xqY#zkw z1ap-d;e}PkE7N%(>M`=lAm^VOiQoV3{{8RnrviIrrM;3T9%#GariO-_G}7YGP$rcwl_2ISnMaNb>av$M-Y~ zp4%vH7lt;-h^#GY)}rvpnCJ`H=`p6st*!Q@O9SHl{8t!k!qIs9?TzZc3u9qvVtTUy z_D?|l%nPKLnVBJ%YaR<`TC}k;uK*LPX?g+Zfj(D1lM{<#)#q2N&P|$(qOu;w*#-O| zZZhU&Do$NbN=x#*%NZG*)Y#Rp}vewUFgrZ^Mx3+qti-oC!QkKMnwvvcqLCr@7Z^2CWRb$A@r z5+2NCmR(IyHRUAcZkcGOee2F&goS3Lni3PDXE%&{3vC^zRcc&XirKKrr)n;uW~99W zUdhir*YaGtOZ{Ign(N7^e%VO*t5>LR;N5D6oqCk};5ih&FrQR_RkN~&J2*8|jYNv{ zGe#v5?lIBS5^T-QE-cK>wFdWOOPa z7Ct|`tkyO^8!Ul@-LYHzM)|v3qe1ERhKAjS_4qss?Jv>VH-Yh@8JI>w`0i(nfmKHW zVv&GhgokNfx$lzNFBeZK0^P-GhsFO+#?ws;GU>?u}eD zKN!Ln!Mn@$suR5ON_!;FEyE1EmfbJ+v{`&SdahPbYHX&otH(=a0rwqcl-*glL&XM@Su>L*PTQcZbm zT&dNTGtru7wc5s+@tj{`n^0;k9e3UGl9J^mG^xA*AC61H*98@2MR-n3!q)|*HN_=0 zH6_K|50+t@Apb$vr&OK{SleURq72+{pKSQ0G+lk-#J-bj?+AbJLHk1wg&$j|98uq* zJoOJt5|fr(bIp>ZL|Eh$H~N#(q+E=d3L6^eZkl=FW}38#~| zDZ&B-$;TyANjCxbq5>?Y3|ci|QG<-AdryoRne^Pk$x|1{$C-+;yP_d}V>3ab;-0z+a#qZ3op!m6gtEvv~H?!%p?#Mq2TgHM`%*I-9{9_@3N z6|gq3tnii;7WV9M+9lb(#p@pUK6IThR#Kh9-S9S*$mnmVn?{o%obA0Bjw zsjGt9{l+I{78YhErTeu9u9&v4qa)}QDtP4;^^N|+pB+B@S^eyZ;fZOJIwqyXM_6Zf zpM-X*Aa?0W3Wr@Zo;5&Ik*zo~rZ@wW91B+1VR zHD#@?C<~7c533kQSH=a53CrKMs%V0LUR-dnkAGxU)&yHxQ0o z{T52@nuO@+1m#TsiN3xQ{p#JzDyx<*n_StIWPWYl zyhUM?O;HS!QbFCyZOm&;(1(hsTzy`tUfa&40-jW0xY{rldKSZjdCSu(lkL)j?vW5B6l!AJvA`pBwPg#imc?Yn#7@i@A5XW> zAio8zmdQkuEs;UKp`np+v5{kQ^5f#dQFjs|eWn_sHEKe=LtP}id}@THIW!-tSyVl- zzI^f=-zJKSi5gpMOc)zpk}$T=x5;M?{b2IMifD?SRA8|cp{1y>@yawMH!7|$*fNp( z;-*i+dY$@U&z_@DCmBDW6~{FC8gvG$i@QvMq2)oB+9mC<7FgpV>~=C0W=}H_OD6v) zo0gR@iJ}IUy%+~^6&0Ya0>_ieRp3KmSeIb~;(wN8={YDP@>?^1O_SO%yQOtjW}UKW z;5uc~rnU96)-nv@x3IA<=dow@2-Es+VXOd6Ku35EP-5g_01P7vj8qa^QCRuZx|w6m zd4VtF6;y>s&yV40gE9$-zc@n1V{GIdX?+ndNPMI(P(wx`)oJ^L?afC%h-satY zJErDS@^_JIYVr(4lvDx=zlQZ80MSvg{FfV)=~PT6h?GWcwaBzZ4Z_{8Zh#AUclpkJ zrxum}qlwbAe%v;&RyjQI^~WDgtE-!O@+9NHAlvw>-o^xv77Q?mgYZWtXIF!X?696N zEOF~it3GJCa}+`cEIuqRz^-`=w4RMM9)<+E1aik5$&{3Fr$ludd@%7G~12Dfk9To=7$Kh570xe_+g6`??Kf1i< zq(>EoUXL1>Mx1c?0ScDe!N^e!knVJt(30Ag)~j1uDABX3>UvLbTy<^6JdJ_>P9O#W zvXyiYv8ZZwuXJq0qSR&4GyPKaJC%9Xo?N&ws)(-(e;({H(~%Qiwkd>4J2S?}hRdzz zlr80k63;4o_w3m-5H?twv#vX^#)WHh5J4N@?#!v!SOoc~#J$%1c{bZT>%4@>$OO~( z9(5}pS~D}O){M;QCjR!q!-K6bj{wYuDd&~GNFDeC&G zR(?hg4xD&!{j*&s*A2|O>#p_3DOddsh=zUYWzv5H*+-YXSu!4!?O5=ZToE_PB@z2_ zW{5B8$NQLFGT-dJ@qG`c(oN5XOpA%HVMZD_<_e}$&2}CyX^gc^XnzJL{P6xzFUYiN z&|Rc3iT1nsjJ(T(v^>gx01`bmSf1(AReZ3lpB!h6GChhHYNVOtR)ZuH#qR2f;@}Z@LE?dBaK-~xl^4+cP|TGwdpUT|Pp(kF3-oJ#^+imz+S-=C?$`lj)YtQb$NL7ypYi^9 zy_`_R%{9|?$!ovP;v-*3@UHHr9XPo{*Z9GmIcz$!8UbEZRsTGXqm-DLc+kz1pce z&v=Y=cs2Z{GKSrlCx&ZS*w49hQE<~tuYP=?^U=ZqpP}6WKOMx85nK?$lgUY0!(i(7 zlG1X$n_#LNiY%7rl9V9&g6&6>;htyRn`5%}9XmGj&O2wy-${6I{?~EvD*TXt!CZ}( zF-)4iKB%h$#lF%WKp8P9nZ&U}ioJSi`OLlAZpObz7r2xDrkU20S->^Ed-iR0)jSHogZ@+o%j$NHMZr{G6YU-X_y53l~ zNuB+>f{D<&(U|l%8KH}2YhDk{%7=wI6)QEH&^1=3>q=TQ8C(aH-LYwQWvZp4c~y^n zN!o;h^l(#jWLe#m(#VALpet6-SQSpewU(((T`j7K{@tFNmNmg=t)X^ORjtoTUb1;^ z&>sP}0U9vmXSw?6x{z#qG*25X0KphXb+@rAZ{XQW^0^Ixh4nY^gG=-Jy#czLdofT3 zYA*qjK{))7sgVzy=oHEp5NBAQ?smi|>);tUltS}CQn*IEwO$^`=^A)rDhs45QrX2! z(%TQI1E@ZlU#fW|U1Rhp)}&miRSe~smxd#1@M5Hmqa!TO#aGW>0^TH_)oIBHOJu>| zY`o-A?2;3;OQA>-p5K zgO!yl76#;6&GE6Z#z6D-+6DFX(!pD8^ZiXtK|#$YMHch8@iC#ih)91e`?z5}8)7SG z-X$&N-U7Ra)m-|!`issXvw`_evk`NTzqHLu0?9B zhH^$}lKIT=-NXDC#HA6o6i8%j#Fx6}D82lfoTfFSw0R11RDE+eltM3f5i8!$<@mYj z89&D$1;Y@|3&v|~V^fd;2YtZx9lw0I=o!#+C{eH1OV7xaJ?qpB@|yo%`l4f%kFY|HN68cm%WH__mY$UuWMH_3f--NB z;xTkEnFHCfu~K=jPiFcHgHat~j(}#UaK;Ia>aw!fQYp#>h)Ai2;Kc;%Wb*mxglC z-SMt8IgJl(!+GH498&@%j-*5*rA6sQ9}G01r5LgbcUQc&+I#uqht$REy5d#WI~diy zUR4d$dek&n58H8~fe&3TVWT~&bD=#(n-iyGb*E*FfVS4k>eNs4NC9VkjMEs&N4(Zm zZy2fBYx%s{17Nq+(gSWe$8=n>JqOljmz3&-g!8Gop+ZEBsRGJ)?WXEX$#Pf5k^ zKbqwn<~RUJN9-lcOdaQLdDmDdM+3|QDc$HE5x}HWJ8Vz@_<~2BET<0}VekxCaj{38 zr$(rfd5vBt^Ij)q4PR}jMqc-L)XY3~cyNJtXWcwjYz5ajtZ_J~KaeCa#iMd&rd1>0 zB9!A1Bz~d&xO5iJsD#r%#B}e-1hB-~A+ZVUC!Z!`je=R5(xaj*ENZy%wONRI(*kIw z$lw|J9)WKcj>r%i6%l3}{l@e*2%C|uDXxAGiJN#&b~W2arm=t5vc6Yp}u0c?}#Z8b=>V*%@)nzFNH_ z#EP=qj1UFAHFw4B4Q_QvLNpNkfk6@0sRtB|P=+{qWvAC50z4;*edhK`4O z{oWlpZ?{(rKOBf29d(gv92gQo{r|@I!1EX> zBe04xpU~qi_2_2_bg@&$Rc2P$_wMB&Z;oND__vHbRW2_sZtT(GSQWEctVf_KS`L(f z*Gl$pag2<+XXtfaDiN#iN{BLGq3m?Ig-}Y<5qX`|^le^iN6`-H5w3B@DB9s|jq0<* z>xMe4ycR2-0rk}InmBUf zuokC*-XNRlE2b06oTjO-k4lJKihtq)ca2;LiDT=HPZ6-N!gF8rF8ajuPHMO+Rn#6&S2D2}tJr%>8aN2upnuXe>n=RW-lWuHP>gY>wwY%`>WNA31tuEZW7D^X7E z8JNMEJHlxr^opd6B%TE=vt3MbARfo*fK`V1=wU?c8%Iwc1>6RiyT%do5@(QKzE=Jv z;Xp5V2N;fRLpRuViL7?yy;FlTvmHIC^-OL@{I{cwc$hRBDqE<)5}Xl7pfRm7_PKM8 z-WT%!J8qeJa6=-&Z=l{YUr*sYdu557qn!Pu$31C4C6NS?zS3M1AIYryod8mcgnCbA z-mhms*{=ckG`|MwL2j{(pNf?5U}0wHoE{EN9n56NG)KpeICW4$#WW)7z;m@6e&A^^ ziNDyF_p5@vc#$iW|G2uQFazw)Go}BBy?YwC9%u=A9wO>tElo>Abk#Fa%SSw-{!FXH zm6s?hkmHEFyw5q#Lgq2b)MU>*#*fqpq%oo`#F#0Ok~TPBhiw{|V|tXC+)aS(AqRL% z0o_kDNJpN2B7O~H?8Jk%F9G5^IP)glxxZE98D6Pta_oq{Y{@2Qom4HK(x8?KWl+CfH&21Ta)B2y z544v7fu>Jrumc|&>?|c{fYaFh`%$IZzfbm)>s_wXwGOw;Gda8;J4vW%c!{tFGQ%tL z>1`I9g@@7@WdqZH_RN_bbLP-%9nY=VxP~It`*JqseB6P0$?zu-;MHtmX^Qxaj5KH?0SLqv^dten2i$v&_} z0JLu$&c{Wsq8i1+v2|)^>2Mw`2@mL3+b<#vb-G|7Z5p^Xj!+Lt@&(6m+dtyMV>}7u z9H4)~&Zy;04+oP$pH&`-u8(Uo;`^bX4Xl&1%N<`Fcc)uHV%$OwAJTP<0Otl5y5YkO zN(>Xjh|-+btobr@Yszq-Qj=EYMh^^1J!N<#%DR=SopqbEuKEsFceynidj`?n9#v;! z53$FG;s89p4stk;4LF^a^{o$&)008J?6}e{JHCO8r8(K=aW8bOQSMS>=o4(mFk|4f zF*h%`4RcS%QkBXv8izl;L1Q)yey;IP&hZ|EFExEkSWMxnaS=%N_JHw;lo+MaXHx1k zT8pG_={HbbmutU_nbn65vL48`B1R6SO=w8@)VaJR;%CJ)7z%k z{e=hA@JPZ$?g6vZ+YAR0w(cJ(WR&Q-+d{$aPRM-CfUH!GyTlC-`YppNo(LW9$z2qGHvnbSWTuK5uIe)$k z`l%};f8}`&`%! zKsJ{=e=w-Q!q}wUsBpHPE+1;04r%A^!HjvZJ-`MY@7xE6^$!lnNRzT{p#mB z=XcNTck%o|Tsm#knyqPgbarXn`b%$&>PD<#kc$2I0447;<0m5~^tHentr1$qnQoYs zi+~4mH5?3NRBQSLZH5soe>@d z5MdYD9YOlQF1|woudy6c&baVntC7=QhYVvchn{P923XLPVhO4<+35OF_Dos;Y-y&u zTSwkFiLoWud$~`99OFFTM7JHvY-cMd-jxc1gvT9w11AW zaRj3cYcJ>T@cvOHhzGnVY4GN?-m!sON8U^-=$duTD8cnVcy;7WrTR7pI3orF{d$2S zz!eK!iuclhcUXtZ+lS>EDv6z;kkNai?5yFxevuQj*{hF^w#7z$gRxFeKnf1JOpc!? zE$JNK(rD>6ZRTE#mNX8bUX+*y=a(OLq<6}orc0zHD%GI5C^2c4@QYFtk6S3{iT4FV z)D*ZlZwnRk&jgm$bPMD^uiZ?%hq{Pn zxpp@RD|A+yrFd*}k{z~KZvnD8_yIg?O1|U=AuhbZ#3=KEX|;xzSAMhOO>HD<0U_W- zIo@lfOX`3LD5vR-*dAyYFv-Mfp~Zdc6-`0BW#|ShgZrtm$B(h5oARJCT9kaC>&6>* z+;9V<>P&}vp3*wbNIYr#zCdnFPpM$_a?p0i<*}Ir3(gilO2+0da{CwF0A@WvYOqaj zT+Um-EN@(ZJzxM4`ljV(aIOz(^v?A0%+R1az07V8xRNzowl^QoR1#;*)<`jt!$nuU z;T044yhogsD<*Q|aKTp2{;(ev_75qcd*shN!SZ>m6K)ptJpq< z@O@Bnq|77Z2O$|_tD;n+N$Rqm+bX5fT!_f$_Z(eb>JB#B1rY>(@9=vpRl^V5iTarX zxzez_+_u;mIh;O2I@YeuRZd6k{H2YsC+S-*?mXmQP^J53OJc5FClj=IAE-F`5;i}? zvpb`*Gy|>Yeo)TPuk+Gq>;}63pb;9jW3Nr3oF-|^0a(xscT4`ux`QSI`6AGeV-2w% zBes70y(a0^r%I`BD3c}a z!{*0!TY^5!D^N0h3yN3Yao@6%h5iH1eJdeT10(E%GO!QCY4g>}{t9J3ci$n4MRjcF zr)`sk@rRz{-mVr6t(6_H+u!zR6`oO7tGsr5wd-E?tlfUAN3*=CpQ~B7cHM1u2CZEf zQ)!2`@|QX{=~QAg0bpRGwp-`&Hn;XisAH;DhmUh}FuDt!=cuh5t^2Ea541?gIDdiM z4PMGSWis}#dqZ(ijExm%?A?N_bPm}=-onzE3j-Ingti3unUluEg_+avcktrS#q;#P zU#P33x0my#j4O}^!7HTg%Oo{Q46G}}0^*A^+y5x9Uvq}0{Bvwk z_mH%I&GuuclJ>8B$mrFe1g`o2Dg#Pc#X#))KS_g95TSJEf0qgc%*dEzoQ}%$8wHui zj9vimeuHb<&>a^P-)rW#EpuCLzVrz0^@-c~y63(NzmUPN+IHS(QRcT9mg;R51}BnWd}-^Bs97U_sggk=$3$A+s6}< z-S9hk>NR+5=$XhBdGG3}e#ezMa}@^n^a0Y{^Db_-+wbsTU>w`%wjqt148(dA`%1y* z2PKR@G0P6p1&kHYcs#@ltd*MV!}=5Fr=YBHNHz(!0Y@d7L&P3dppJV9J%ER_{dpmy zLh1mP+`RrNPG|oMo-Tf@x8>M->v<_3Iz6}Yj2yaMKOdtA`&zRt+Yb%!ZbP;h+Ra-G z)z)J1#_Elau@BtfJG|*=v5gWrRQu{y{`a}Af)|1?{u>CHDOAqTnHy9?I zRjchY449m6>l#u&lONb-3@4aW+FVf6DXH^#|i?xIINw;l$1m$;V|}h^9Sp zW(50t7=6GD`U~THk>g$Yo-hD?S;!&dZ@s@`OSSruR#bj>3(9?a( zbM*~lc^uIIJeKMK*XO_un`k&*MLi$|bG(5~Bo#-zl7h1Ocn_5X9vXeT6*a(xSJ{S! ze>K2s07!Mmqej11c#<#X)=DMK@veb*9vHNkyJBW929i9A9BUoLjt?AyyLd#b`6Aa6<$NiV)OB>* zJheSfiM9-UivA58bi9i1|03&+q0E7UOO>Rh0Ts&cD^NA&0LzlMO4?=)0xgP6$#l~` z^*iMj_3@MH11tq91uCaVv;Ly6?9Wy|Brhn!q%zW z1wIST%_|u1BrVN}snXbp^=z;G$$x6)AdpTrn^kIup4`AV=DE!}KFgrYrLo_Y=kC$;8mc?vwS_dZ7^ISW zZX_+o%o8>+7Ejo&g>XcP?yx}|8w#2?T&zQT!!;XoQN1t}FvOz`flKQ3(l)|zZg48| zj(<+Qe$YJffMg**@dQt5_}<15^i^h(=(sbo)zKL_=M5?1g|WM>`mr~t%&CR}mg7La zR#st5AhBqYUnZiHv;fp7_GW3}=-ByYzWqp3tz8Y@{_&OZv6c1nr{tK&1zp~^d~Gn@ zghP6i>37cYsh%`>hOq-o404O3*mYJC)-gWw0$T{i;K&XJT{$_JYxw(3pG*X|#gs_A=BKG#v~I*Ve0lm=zwGJE4aHs|op6Xi|JMn92arQLq(CGF zJR?xA`-w)p7Py^iq`qvoJ5M%JU*^IbOHk}O^MPYyB=9ol(wY9|O3GlcM?3l9VY_{} z!yi;%mN)7EXuOQog$Lf`wO4`5T7bRvzVtH32fLC?-X7dWZD5)!rAPLG_x{jq{_Fwv zs(rLRz3tT+jh3S1@&%~Jhe`2~++b)(Pu&f z*W)upv=buanl3{~r^@$1W3KawFsC&7_lzmxQ6{fbid00VdY@FJ&X)8d$J}*}0=S&_ zNeVp99;Ychj=J1JT-3d?9`=0{>*w#l_u+X05BJM?3eUSJ?qR`JALI(yS5vH?2f*=s z!}(@p*E~)IP(SBLUvHx?B5oO7sMBdn)$|D7TY%XaP;8}sS(-&FuWeYyr1<5 zXIW1J>U30c&k!{N?0;zDyao?&q@C%*dW{Pf9y0x89~RU+Pxq0eg1&?TKYY$XxP)hj zP9x{zkkbY3k@z|8snalaoVa1%8{^w+mhify;fcKGgj4q#+{MsK1(UGyo&!7wlZVd0 zp@!&lUTyq-2ufX(ZR0Qs8gw9>H~K#1VXXA?MjuocIL{l!cLsmA@0522vYp?#>u8$n zd76(gR8Be1FuaHkH~KlK(5tY+a=+9gpgAHwn=?w_m*Jai=sj0!`q8Ptoo5+MvUNXX zb)P(Fk+n#-GLByAm*=svhB`tSeq9z}fA{@#4sdatuAW88erP&(r~OX+SAy@pd-=e( zia)+~y~`31{JmP91_T6j0^JDL%5bSW>1WGPPW>1ECaxNBrZ0%|)XryES+!WjsK~Xo zc{mCCg}mDQywnto*sWlMSIhHYB@g5?VSQ0CU$^4y$ztu=$3K`uMm~Gk=N`AShcgg| zfS3(EvT%g+hkcx_8(YvE%yWmt?=lB9C<9U!8WaS?x?L~x^1FOg4>#l zGSDAPd@d};M(*{m30rQ#LT`?bRD6zo71kVNj*5+siHb3-HqM$nb>3vgvaQ^h2Hp%Nb^x#FU!hc_6GaOp=>?u4Z;kX~Kjtqy&ei+vH5lQ3d2h&SSrX-lG@rmO@v&&YuF3GdbNGwQ-O^k)m$hgl24(6jj zkn>F3_YfarvDIeDZfsS?ha^S%uT5BJ2;DWwcUj7;s?=MKOy{*a9XKcloMXY$q+G#} zdL9TXMLTN>Hu+-`GxCExIr!m;3$ml4lBV|8B}GM#Uoa;tv9O>ZHqM*@P;EGY#gB|R zNrhHxVN#Bfj1y8SY#+v$a&km#wQ?N%HCce!AaZErLkZZJF4^S8p&j-(jw8H?Tm?Lrp`(gn4mgRU5P96f$e^wt@dT7v)W^p!j0}GgXk)H^W&~*Czd12t^qx$; zloKRI?$Sk1lo+W?@L{H)Piu7g2$wtPvMi~IB0L7ZwkY4xfzK#sQH6dW@jmcylM*vB znbb{XVMfFA$0tudHXNmB{OkN^{OgiL6BqSL{?%~l{A*zKsQk-^zmY>_t$FBKy;I)0+d9=7r<5zH zdYPvb#$9~SC5ib;KJki<^GxgqjNNzLc!gXwB-SrY%<{zjoRNht56*mP0+_Ghd6=co z!zp66KxFnMvSAm;zC>|x)bowzF#8^*Z;7Lc`r zqSyhuvY(dHQuREayItfsgSrh|H!^0U#*hWKIS_IAjSmfmfgKcnJwtT8`VZwQP5&wv z!Pw*D7A})c>6yNU7!xVasT1ki7BxMn#h=ctrgO%YKsCLEu2oC*KD)}mRc^8w(v805 zi|CwxOOSkR^DJ1hyEt59J~OZQRXmn2h8blWxj1-01d>a`z&&6ou&zE$U{^ z_s5XIX!5nCW1m#D6ky0#U@*Dc9YWRxw0-r?z`v2ITVwMSdCCve4?P}7I|h#(6EPt~ z{#`fZ%$T1$wYXqhPFDyOFKpR)b#r0G zvj_3{+a^w>k1`puXh7ZbkAKik)$r9{vhOx& z((uC|Dz+@YR#^|NiS{qRe?Wd;fT0^^zr7V6HS9pP2(4gUw|Ln7-nbOB<$@nZgMbY z(&!#9+2s~1>3l|FGGj^e*VtkVr>5&6Fc4I3V-CKIJs?BB!AK z$Nl6}_vfFv|Ka|ujdwD}`*Z0Dl~zm;mJ#Ydq9dTL*c9vb>`mF~H}7OV#19nkPA27d zUUpgMT=`25J^URP6sr;p-5KV=bPNCUjUv#RVpUfnidH%jdz-qcyXm^Us-vli?V;{v zY$y`ti+@gvL!p&SdA--|y^hPh4GQGBKinC53iCCEQ=NuQtgG_iYQIccW&v#u?02x`85TFrZ^M+V_*&JGsc;#e4hJQ z_RGrXGw(CqaonVIZh4;VZsCK_-A{PGLq8MUqt4-Lgpnn6NNw(QsT(lX{F6e*H130E ztLWCB3DIT0)SngL{=EKd5N68IpM69mZPcHAg+kZs&&bB5C-i3{PWTz4Kl_V7rAmJu zBSI8D(UE@w#02Fx`g5R&GEC5)gM`W8d?#3Z?aM1F|AdGPzx(y)FcIYUnf@FujK(p* zIQf7cMHepZnSl8p>(2^GzoI`IM3wkZfA$esG);f@6+X02fA$j@bWndb!vFBH{_HQJ zl`Q>v3|7d(jr_j^l!4i_PQ z---J$p^6~;7mA5EU&ahcbA#v+TSc$v6l+9>=*MTP@wZvb#pnI_bUofMi-m{*UjR8g z56{)WL>KOZW%}e_ZK6-K;nU6d-OBlj_nC_d3MWo5PubA3wYPIkN56UXR`cAR{?7Fq z%nPd*%+51ccXgTNH+|;bw!XIB&26nHS0kEbRb5z$>Sbk}ViN!nHO+l(UAgsbt(}|j z*8+UC248gHb)=OpXj`+Xs~Hc&Lq2K5YR%p?xq&#zy-BmHiIE^2Qq}OqQ^0jZ3a*jr z@#>m;EyKWI#xU^^G~?XKp3$!L+^w`; zxSuiLQTF1k=cBf64BH0O%LB=Bb{TyEKq=2teyM`?zG$&0x`2j1ja&OD$E z&pcRKi`*8s%zS{M+JJxjt+UmB`OSKKH&{YzqZMs9d&%EwMC&Z)PP}F@RkmRki%}1^ zWCjf~DYfBq{)Bnd8VMUu1OAlz>4Z@0Lz}RJ4j6tW#4d@;W>+aQu)*+jpqvH+_uly# z|Jl}-(c=&-rNSR+1$zn&6~Pg z+j{%@H*9E?Mf=-&*JEd7lY@TXLq)=b@#QItJn0lwXJVM zn_LbpwAp*WmHWE3nw$A6^Ony34z6LneA=+7UuW8~NB`C2x;S}XA`0CZ%m2}00hxEy zANn1>CcI^UCDj)`W+QamF_?XUkY|Fi_J_hF91g372{Kd^a$z;eB z)tKv3L@nsP4z|eYVuqM0W`XAG#T>Bpd15|Ru!Z2hi(w~QB9@9}V!3D#D@3DMDVoG8 z(M*cCTU;gfil@Y3@iF}W2gG&a4oCwh$RMs2?};nL&Cnrz#SP+!*pHL1|3rS`m^dl^ zCB7Elh`Yp3#jnMS;z7s;E#eSn^vjqx=fq3mb;v%iir2&^;2^&dZ-_U=LzqKfh#SQ_ z&~-B>3w-Q{=?ERATg4CQHu@p_^mouPx|5F6 zkLWJCn@-S==^pwC-Anh;NxGjNpr6u%^bnn*hv^ae89hpm(c|<4ofeOXpNYrC6XJRC zsCW!Q-a2Cj&2%etw`+tfZb#rm-=*3LPnS8{silwOHAI8WPR9ars59=FXw zxqBvFkmqX0bHJ$uN8$x}t_Uwlw?@D_zx}MLdzqphbE(E!yrRwxV)&{nP}3D?K?Q25 zKnu>G|cjUWX7FU$vJ;J@( z&Oi5lD^h-j^E29wx~Ql_ycM0u;73kuk=}U?JN%U7vX{}ClE=)D88K<*C`A=fn!GAa zD}mBSq&Jz4))j20lJaIbLLZ%kZQ55O9O0c$4!MP_YM-oVpQ6w{dDlL9*Z!3BrP_y4 zSlYbY^u{57+w}%`=L@DdZR9s*VVnevVJj4bux>#iv_HtQ0 z+B`^|KWRckjC`gfPSB4u6SNP+B!IZ6N;AbIftVza+o#-aFg|HaATBAOI|NyuaqA4T zlxD`>X6Q}%J{Agyg#w~J5cPo%dKiWBk1%>5>%lLmLUwSDB?98;0?`kU`$yr>v{i}9 zG9V)|kUzol-=tZ!8a0~|g_>2!uB5NHk^$M30oj!S*_A;w0u#2o=aKF=DXecK*WPvZ z_CemS;hIx$!ziw*a+BNZ#zCpQb&+^?gc?`nrl2rFN=t_9K4kYHxmPlDV5Y%;8mTyy z#{o@uHIA@Wv*X#UGc$v`icGju+wF4Um%`yjIY{ulboZPi?v01cZWj!Hf4=|=T3k&RZQNg>rpdzC5qSz5sKok(Lw*{7>G^uv%6^%6-yD@f+ zy%T$ju|^oS8Xurkyc1F)=x0btM_%Ec?ex;jS#xgEiN{pzuy%*gswv9@7OIN zsq>zQp9&G>)d(TauCWQe0qL#B&qBy94)BMjWSjCI3r9ZO(Z(Gi3g~mjY}3d*`aB_pE<#Y{n6k~0uNw3L{GABd zZph0mDEu%F1t8@52J(#v#Uc7Uq$oLj**?T;h(o(~h+&=s1l`{0(xW=ADt`Z3aaG|3 zxD28R6d`6B8j9{g!W!t~Ncq18W(QJM2f7f2(mx}Qe+-u(@6Lxxn#30&ZVU1M5_|#w zFQEPRa0TGkKm1NZOleUl(@%<9Q`!%|LbwUxdjglkhqLf~AJVoEU!}Vt7b)xo8YFa( zLThVm{r>QR83*u}{}TQ#&;Rkw+<-dd0HpK6xIV?0&=2F5J+4d zK1V_H{}z*cuu^Y_O*7>cE{LP4e96JHYpADflyK@cjY!{5`m!W^|*!h5rI$ zGEuYY0PX8fd!k1F7!m*;2H^mNWC+IpEl{J7BOL{0{vP~+r~ij{G{mT?CitML4^JU{ z1L1Nl{KFBNA~+weL#TvshEhO3$l(gz0%%!-wTutdQl?3bNB$K5;SZ)K;b#pG>ZGe- ztwF~BAuvk;pR`*q2+&5>>IWi^zuYFI zo>G1OOB+!h(5@cHhYFKoe`*qmKm07wAawo~p#2@CFxMKxH(d;&$QrK(xHod31|V0u z9PEb!jJY7_*RP?k`XYB~2h^bz&`pFm8#SfFkvkmI~ozJxK@H z9Ml4AS~I#ggf!$s=RjU>q$l;ImICbW^y01bq9HFHXaHZ@5y}NZxd^c55vVf+l5Pf} zDFkNOK=QDfu^ZPT2} zf_O66sceAdL70F%sC?8|O8B)Cpm?YZ?;A0I^UEaa>pD0QS!4Q*h#A*ls4hNZ`E;T`_Lp_+M$H5ZosCAvx z-5M{JV`+Y{2fbMd^Y$X7rR&33NkQHU7ntMnpWwIgs|H`K?YD4HV z^`K3mt(ZO5xc0k^1b+&3FrnrO8&r>(i&B{xF!sMfjp>WX59H{@IKeo01?4?pPM(RH zP_bx)6fB?{5D0!XOq!3-`#gj`bV2BSxg4r4L7V|$7=&dIDj+067zKDeAw)okh2Ue& z>jg2aWZy$aR24&ei~@TR0Da$rQb7Exl=eq2L2k%{5J(*YSSWH zj;X=G$CKcyYYWs#A`}~!*aI065@{=sA=G^MTu9KV*EFp7Ay)^#EoioeZwSeRKz@}d z#G0m&0=2cK87R}ynpPkdC0f%;WRC`0(<*=ux2DxdkBY2m8^i&BnZ7O3pjFm1i&~;> z)-(t7Z(GxLh)1uiX?ye*3d&_Q(ARHapFt^XLDDRkr{pw+SbCZ@O~d>(&zfdHmzP@8 z3RI6iX-zA^{@%2vRRDiuO{-BmMqy3cAZMnNHEj#yptm*6qP|SNHO(O}=7KeC2ez(S zHhbzhj8j=Q4T@3GavCb(uIgz`Q;^QHrfJkbwZNKYAic$!Rv;IZRc1{NcvjG%Mda+`}_6y<>87(v6AvndTyy zZg`fdpdd5F2*p#)1)1qN=2Rl{$EZFTg@t(qZG3%8N=kfkrRw;kWDuYgR!9h1LH~j0 zo0*fAo1bke1lhgKMOh}c^C)9xPC=n5D=QPEG3BKC=H?rV3dl!chS}IPH>c2;kegOm zV#+tSG>*zGGN$C_q-Ex38w+!d8Kz=0w4EuH6f_p)q(Z9{=H{kKMGMXO+0YP>0VPs1 z3CjY~7KE&|CAvUn612QACNssHQ(!iRrRST?*=FEL$^i%S$UNwqf~-+S6Uj1`WEN%+ z3fWRBx2VwCbyAJ~xo!TV&S*0-f;IDlSuGSssu6{wT$G1Kp?s8y(oqH~1XwbB8&NF4 z3jvx97)F$U!cZ?1gM1(zhO*$#Sf@;Z^kqf`$PCb8_)P`O&d4M|vLKZUB~pQ_5AY^` zZGnCqSezb^s>SoJ!K{TDYhb-4>IEQEF3JIpwbW{{|CvH2$YBI&j8LO|h*N=5HpKa0 z+l)Xh4Sws^w{E(&?%~irnaCSjf$&dCXXJyHlg0rNZZg})N%&j%!^?HwQBl2L>CF&?RJCh#kQmamKTf7A1Yayig4 zxj=!m710G!Z*PejsUZusCYnO<3LxJk=>_>BZDWEs6(lC*jliGOUCt>4S7%#<_7^;7k$^lSBp^k3;O>7VJ}=_`y%BWtW@ zbTR6U?nV!zpRtWG!kA|qW!!As=H~9^;TG?f=+@tDu-ihn&)jKumAiwx*4@Qj@7}^a z(tW7A+5Jq@3r(+hY_)t4=?@=3Dk7H=talr<2IP87{Y5tbxdJ4)&eFFT#HbinlFNe$ zu90g3$hAg)P+zXUpnt0WU2iecMq49qY+!6;G)i)XN^%v}$Q9?7;Fjbzz-^w}r&hU~ z+#A-&m0CwG3gn_byo2RriX`7D=@(T!fff4E50B+9^7~=whZ!HHeHdLOR{d1Ff+@Bck^ks*&BKaP0JJo@s{Ncj8m(WXZQkGhhahwC1GA;ozQ(;vca03b0BJ3Z7t zgw%t@cTe6e|KYLiC#o6N)$IZRe@VegoPI<94riNEr^DBKXerW8q^Cdn56*cJ!0R#2 zOan&G7#R=fVc5kmK1={ZR`mbzAHg6%h{;U>Nwp*;Mw{H+LrD>JJJbs0X>iI zNE>J)?LZHpm2?YQK|9eZT1_X@LueDt(VxIxp&qQ^U12ZZ0&KEB3PPR0=0~7t)E&jc z9$_eqO*4$t5ojD5k0zrjsElq*Yw0F*ChbcfMhDS3bRJzs*U)|R06j%Np|=R5zbHge zlnte$>QfD3F&~-HYx^FQpgI2kC{>9J&pi zLARtA!8rJoHd8OCU+6vb2zowkPw%IGrsmRZsXwVdC`{YI{zM5IDo11kyAvnW05t>6 zZH$_rcCZ&}4P&bjtUvmIT}ng)Q4&1}^#|LU50<6~O+`Z}cXSjTLPyXkRE|!d)94#? z2VF-u(Jk~V`WgKKd&Mi1n$l3V6i4xt9X*(GqI{_4R12yl)sAweI>61*F&N8-VZ+|iNry9y zTsRZVp_-y>stFoP1;W1B4;4^eXbcsAMpC|LH06&bP_583sy&*H=1>vn6RInm1a*Pk z-dW^;P9iNjg9cDqG>mdXc~mnriwdI;(EI4U^db5v{S|$TK0>dhKc~N-H_@Bv4fGm% zHNBBuN3TbdVEF#ti z9Y@E|v2+i*H62O^(IH@$g6YrbWweHRPczh8>K#3ko=i`rr^C*B3O$XULFdu~>3(z` zoeC#0j66<0%pv>z|NM`FjXP0Xu6EBuKD{gssNy|U@qxC~Q;0@8rb;hvXr#FM*HLAo z7AqYZ`L}f12UdUeIW6@J%7aeYfkrlfG35dM93-uOBT-M(7iK}S!YV>zKm*Ir0`wVL zgEpcsK@U$sD_#XXxdXcK9QwWjdXoi>t4|4(8;l+w7(Z>P4paoyo$5;sp@va;R53M< znoP~5KBZPr>!^*?m()J0oH|8)P2HsKQBPs){7Su}L>Tc7vL*Jx-q+ik&Mh(_U&opOznf6Qs6Uz)?hB3v=L}nhdg4xI%W==5Q zF+VVmnBSNxg`J{-qOl@S5vu5<=%(nY=&Kl_NK<4f@)cthlN56l3l*O!Rx36ub}9}i zjw;S5zEOOqc&PYE@w?(rMWvEavPxd5Q#MjIR{APKlM1^T%+8o+@(CEJgvN-{8o8Od0+WV`BM2t`KPi{#i$%r^;LRR6IFASud0oz zlPXG;s2ZS3R%NJiRYj^&)hyLK)pFHF)gIL`)iIb`86U{gU0!e#L&x-e4cFFW5ghnseY>xn^7t*N%(e;<^4@3YX0lbK|+` z+O?zv}<-(Vusd&e#qOrvJ-erNf7mPRd3(Km3;SUEj`lt6 z2im9GkF=j^UuM73ew%%{{RR8)?SHcW-M&g=tEs2)(1dDYG=nuGG?O$7HS0BdHAgfj zHCHvaH1{>nG%q!OX#Uc?cThUmIn;A7Iy83(a%k%i?hx(J%VB^+vO}grp~FOnSq_UG zRyb^M*zIu2;iAJGhvyC!N2Q~KV*^KbM_PPFkmiPEDO!It4nlaSC(l;nds7 zWU+O3Ba73Cm5-%`p!z z%E|Qa66ObyUqCmlsuLs083To6aOa*9pr@26fr5g&*`a7ZsXqgIlH6mx23R+cHT1}nh7bs|(r zDi9JNQ4Q@vz5@Kiq^~YPNsCB7K`ARkcrgKAijXspZ=zHPZ~I zG?@kcYGD$Sz<_=duEeTqkQ}w{U(=ZVCDL80i~AH5_yvZ2^cD5DuWAL6Q2Tw98T-*! z(nnu45=!N21&}_wk>4O$edJ_qHKgxe32lN!}Zv2KfmShZHpk~+(ZW$hsH6)1xUbAP{D z#jedF?cpCN=hxA58DExJO4p7dsX%S}_y^WBCL}+qlYgK|s;;C8Vg4pr(@b*ZOf~ky zWR_|!k?azfBI$FA1WKuC`BWKNOFmVy5oU?LS;{omAWQr@hr)p@u}kt-gjr^rE|o~H z!A-9vDG3k|m{AMKfZ>!W709eZE4*{2PgZV9R${O2nZq(=vQpW=R>R4;Wlk2HXJ)1l zP(WZSI12@fF|3womQ=N@nqli77@h^<JIS9lWrJI`Ga?+EiVYIyrT@ zht`4D;T~q?STm%n$AnC@W(@n+4h}how5pVnegmvSNQTt3LO>l|CRt<(03#;x49Ki2 zaUe_`vJoeEfgjZ-FjIonju44d<}e9bqxkZdtQ1muR9%Wv^#hCQf<9&AiPX`sn~y26K!s$m;iN5`cyWI#c}-(OaBsf9ubQGb7VoJmP}07wNS zQ9?-PNo8OXC#vV~pC=>irLWMSyv)(&{9KDA6c<9N+=8^6Oe;M?7rrGv5KF{JOejDs zvx7tdl!r*>0SSo!flC}9AyLT7O7kHJLKW&5AOQ>0sy}NakU@nq8;D313a!ivtu!G9 zo`qJHg)+xNnNMMwM2gV0CP}@lNx7JWAXUQ(wla}rkXq52VHHvmT&k88F4xuiAyuI$ zxq$E~fLN|~T?&MZM2cj~Wl2h+D3yTPkXVw5B;>Z0K&1W>j?|hYB~ePv$<3B2k(A7m zq$Cm~A(N0&AeWRyNRb2)n8c(tqzuxdIYrrU13FTQ<+21KwG2r}Oi4l#x|#|BkZO~d zD5hU$V&((Io4EmwlrM@LOqhnMRK}zWSO%wYtiz|`I)(?Qi+dv63W#8 zDHr7Q^9zeeh8cdi8Loe;$1VW?jk=$ZpJh&yhjt#^=;nO<^)a%!Cexgq3i}XA-_1ES zNh@CooG}WPBXTX$i!!sw{c%=J@ft`ieFDldXXn-tw+2*GZbVUTA#5vvR5Dl~YfAtq zHCd)Dw}cG%4-A=C4NC1N=~h2!CWHuD63R;)394KrNdf$%6+fUzdf?|LX^fwrtf^tJ zi^|W1DFCk0Vf~XC5a1u01B6BtnX+KLXM($LDV+s(*HXfimzSSAQc8kfKxT>wuG`Zx zb21A@0X(%Rr7$z6&P^0LBBwG85HOzt!xARLZtOV zN^W+toGVYAe$w(c&@W7yz-x1Zq$OF+cL1r4UtplLJq!$x3qgP77ABjsa!YFP{H3K= zV4x&yV4#c_SY6o1lvNlgFD@WurAUBvk}?6m*3vkr*(ud9@RJssfpr%jfdf5L1~&iy z-w#IebfIj>fo&*Uc}zgd;XwNq9K6O*)8Hue0reKHYL{v+945Abqr_Zwsd~5i7#ts7Q$M!R+PK&>hl9gz zHr;Jj+WctqkSX$ruNbHNpMs*!hRGS)y=VAWq;iMvi)`YyY^2tN=0T*r$i^SQ?XO2(@dw&oK`t~ z?zF|}OQ(HK~Nln7`-11=n*s2KWBN z!0C)EPIor493G1G*b}E>vnb$Zq6z-=Vl&Y!reeM5iA@HqRfsmxKjTKY(Z!#!4OU(D z78{9;qP;~M19yn+#TpJ^rLJ4b*~bs}oWF8;UtCa-DK65$4Zs3^pvG+b(?HOzb*E-i z_1G{`d2H^N+fTV3T34JqykNr6$%d}ulw1^B%8I^k8{-xRtW<;u9QIR*Wfc)hv7btu zQx&1a{;FfxLy0%5lCh&s?5pB*z6nVk!cLkl?OwlX#ixccRawEzqRC@z#!enTX_Ra6 zn8juGvHrEFS67bi-m+HjtB%eZ(XU^@ zrX$nzqVE_bC#s5i4Dokqc{k~2{l1@dL$lWI*tllZ<|T&BOZO}~y1*t;-OH4jpyw{` zIQP{}mm7T#wOATde{!I&(f8LfIJ9&25SVMbt+0w;jt6euPA74-~YHWV~=+8FHFo>vB z88-iP%41hfC)!jNi;k9Jr5LOd9UyH>(jh7wM_RO#3OiUPV8_Y{Qo1L!wx$%TaUMpv zK2}oOu{$onO&R=EsSY=p_4{*daKT!iN1}7*fmzuF`dMXV7ndGdx4q$p)tgrBay_|a zSkin0c3-W;XiTf?VtrT9N3;Xaan`L$GVET&|BCK>u>yoZJ!_M6ScyC19m7eo#XXN z?ByyB7X{HnOcRT+n^+$gaGl5Y@9O0$Dk6Tw2Hfb|pE2|DNO-(JmN z`FC;iS^m$s-Yoyh*h=7E$CXW*R5s3)f4io?0Pt`&a`?GNkG7t>e0ghZaPaV07&oH7 zDsAlI8Fx4L5IXE%OdH|_I@s}0N6Y@WB?b>YI_#v3~WcO-uBk^b0}hHP{Is)CIv{R(iY{2vOr7 zui_8`-U4=NyE-y|SVBVnw#$0F9lp1y#gL!6Vt2hp*CVBHRIy=}Y7y2d@m{R0Y^lnt zRO0%D%8g5Q>^SCncGr;ZUCsS_#HZ}~W}-oCQKS^PRnJ1Prz>vu=L@i8uArk%Fq)YY zKVSt`CjB5Xq9UoSs1(tOR#;)+W~^Q_W4$ZZoH&5_!v>sWS*qkpF^ju{<_BR`yBm9m zjc{W;0JjwN*qcZE@39%8qQnXba#cd(N8rEM<+Nk=9ZE+)ZxI6qn zQi)}p9|6Uh#5O9au#IZ#Tcz0CUFWCT_Ez~!1w$O#5-OU9)zmteD+;k2gTJU~r4yT! zHTDq=E~575VC;PT$d=9P^kuVVMUNj;kl8S=Bxj`AH6eT3i75urtpu8K`TcO*z!iJL zgrLAvo{zblecX_Iv*RJpGMibVTKDyy!QFZe9TXR9+I#8B-h<~28ZuM#WVtSaMtA;R z^DDhNDAx^4T-wvMdcN`85^^%e(4+OM$TQz73l5(gf8MovYI>dZFzIVUWwba;C(l7! zHcT16PA^Uue^8F!Hf7HN7aS#y)@9``SW;-f)A3#9(#!>^LtNxZO0TID{$YC3Rk~Dp zDY28v;!@$I)@cT4ObN-$1Pj6>a)*Qty(s2BS?&dMvx4>Wq)-a6_;anSJ{W z%ZM|G4OJTRZ0wBNU`Mb&&Rj9}fYdgupIySmPhdrF7|{i+2dfmjt;ViVxDA+b{?$Ff zk|(xQ^Y>b_`~#6%@;DMVcIEHQ#ZPpR8K-@s53KMk zw#+Jdz+!*w!qXzHw%At_TB)C_KD~0^j%V*?epl|rse5PIXlBE- z)fwAUhp`v#g#DNU&Xz*#Ag(V{9oV46+VB5(hP_;{tM9k4h;eJ)PHZ@~th8)`9=8~y zoVje)rz>18@BH%kvCYHcMH^$V*u+~OHbALaEL<0$cMq%5M5Me5qs&qHTy$1z)?~w+ zv`O5k8<@TI*jJmkA3nS}vtOT_;R67t*0`~yC4C};Y zurl0@8&s}QSE|UuqLqrTyoKGBI9J7&i|&>L+)&L|R{nw;!CDpXC=+)mHOJWP8|N=v zt>>`TG8Ah$@z!MAh49b`*G2Em0>9=otLKOITO{P<7G;dJ(O4FXzLiVWiJxRI&(m|I zMFLkb9+t4&t}O$uz!>S4cJ}e(oo8Y7*()Hx)GN}Use~2VM#~1Jm{}EpJyhIn0V_FB z9F_Qq3Qxt0mDr)uUsU4BYH^nMnNoBA)Si2b=Fgt>DVT9}*~F={r?_$xS!j%v0=F_d z`?Ddgo%;6aHp*~kpz_P*tCnwd-M*=)WGhjF#=o(g<%NzvkS`2k`K>Ve_&r|;{8mp; zotRM3OH2}b-xIxX40lfSs+@#<@#ku;>qLPgBQMF7I}anJ^ykof`1{w~r|c?$FXzO5 z&!1t3LqFkmKL-B6VJ|UetYE;LqFv4-PzmFv2Y2plY6TOIAt$(7!5`8(mO6P8ABj&5bd6g}cVpDtvrZ!L9=&ic43wGA=&v7I!SBm9o z&5yIO&T^`Rnpe@4vGk~jxWS4Gp*t(Os>GL;HLzT&G$_T*Dvj>Az~3$r_=BDL4T>p& zdA8xNm)_h@+9^_>8@LkjsqXB-11C=oJ`fi-WJqG-fgxuNmlUJMff4;|>B?1~jR!+I zZX`6@)pr-M4oAD-?$Nkjmv?%xf$E0H?}H^{XBRQdB-)0HJgf$=T3yLMQ#G2fB)biwdI<>-vDeizh(+;H=q2iz4VRc}GjJTO< zMlYS{rkYtiBds`lz|e-grSG8F0lqFG&4~}yaU(Kf2PZFDI7ZJ=dj*Em9sm{b#=cw$ zXdm_k@u8Psv8v+Vz&7=2xo}^sTJiacwG)Sv@w2RE{0yiaKOJw@U z=6=F<4DQEOOw-|dDr|>gCT^wT_FK&rwgI~n0hV9D!K&A|K2(-$>}vLVWa&%xdm77; z0D*fcHizNvji;!&9k94thU?)DxZXqIH1ux~_GY*NV!uCOIcAT4UoDUxXE?l~^w(yx zef50Jskh`0-WKL6I{P<?T#oj#*7>@+%+?2?W$o0?u`dnK;7}HZBF%zRxZy-Sv178lr?aclXxI@ zt~?_;<3X?thP66A2#93A`I37`VWq&G2d&(*XUm}toY)3aTu+uaPlyrt#S=K4Wg)It zxlkouS6EXTU8L#s)2I7RU%t8nP6E>7x`K&N;)7gHDdsFmn4{Liype_d8GwZdnu^I+ zU@(24E>8gW&`&2I4txG_1vi6^Od6V>QVjB)AQRFBX;!Ka=SzQp9_a94%!odg3haYv z@vuq*%auUTN(xWIMg~vga6jBnhuu_j*38|xdUN^yhTLDORDoNwlI4btUAcN1sC>sy zIb81ou1B4*EQE#+5?kEliY<;<#fcjAtVv3b3Gu_5xsGxJ?ZQswSXqvpC_Doj7(9c6 z9pEmdxJ#`WCLF|qb|ZG-N>7|PdGciWH%CsMI(hsg#hrFe6S&nZED;$Hlcu;ezkrc$ zL6w7@m^p63%u%k~8@%$^ng&Cl6mba`MEZui?aCEDRxSpf zzNNSYL@aJyLgB91ld+U?_^GA2PC8f6m#I0+Na_QMnt*SVD1XFR_V8i6b(^-ZmVLhD|{%92BWF z+HxGn59LN}**xxmt7gi>C-=8L#_y2W-c|r zdin!yTv`IBLus9(jV_$7ObmF@swFf6k2rJTvi$~5y9H!TV`Osat6$XnEs1+twN$1 zHj2%lTQadbho~9wmKa`OqOH_)c!9bdJYVO4@BM754DFz1p`GA)JdgT>cz{#$sRd{k zwTM~>e%H&W#nh+ZiMyLxN-aTq&|c~@Y8l!`tpu;xRp2x3NiC<=P^+o6@Sgt*Y8~>T zK1ciE75V{mklI9TM2Dyi)Mjccyd>U&T2kAPH?Nt4qo&m4*6Vy5Is6IuVMW?Cr;KzG`x=39DfAH4SH`EpCDs>r-s@tG5)VJs?b%VN2 zU8BB3ZK+%69C-YGPu-^OP(Og@?|nGDzDqr%9>M#KC)6|QNALyy34G_DgGca7@CklJ zy{3Mley4r|Kl(SsXPUy`Q(r+rt5X*0J@tXAf`9#@Gdd5CSiVLVXbOEp(=>xF!h85j zXdb*IP=P;s1Z_jB(Pel=U<-cf8^M>~4*b%ufS4L{Gs3Jsv#Kd(nyDNu5OZfj10&!NufrU&Y_3Hi-tTppDw0L=puNhQAm%bN6{m} zBYPZON{^w((i7;3^d#_Lmwnl%fmi!1@MZr5Jhtc1v+23;vSU8HI?I7q6ARI7^a;F` zSPX9_mcTm*EqLaWHyzIK4xs_ONpOL;6`#?|!P9#My-M=FUnzOxuLH0Ajr4l($lpY7 z1<(8~^fr1sy@URe-bL>O@BKaWZtx7>2fq9V!IS?mc<~>T{Q1klTl^$_f<6vcBj@N- z^lADceF^->FVL6i^YqvB74Rg#L0_l8qp#7o=x^z(^ga46eV=|n-=Tk?Z`0q?&*&%g zPxNE@DR`Veq#x10&@aIA{1yEi{NtC?KhwX$Tl01FYx+0(4|r4ahJHuCr8-ezRA+cQ z@+Z7Gu!r|5jo@t>4X;y-;7d>5ba3#J#SyiqF>N7lZ|EwzlKw!8^j~xZ0}lg`Exa%o z2=7_ip$_2TZo}9zN_fenKpKVtkNlaa6JrnWtvGm{Qv|OLGvTF37`!VP2JiQV!|N9Y zWiU>RBcov)q_;afqhlIMFL>%R@ULeuE{wqF;iXJE{Cf;WcrTO87~o$;aA(}$CBO!> z39UwYrZKz+5SS)RQ?!EdfPZIT3F-(hf4mrPc+JzCX~8su_dovdo@6xR#{`1+y${ot zX~P6DA@I(sHPcGEg6hD8F`d9Kza!HQeDlMZC?=BW#&l)6z#9`ayiH3(ThMxVRj?Kf zf|mt(Xap0(^kjN4(M)$Hk?F4zGSnnN%i)F*C_b8k50fGU?FQV2tgd(Rom{W?&G80Qyoe zu)k6E@L*v$H4C2ZIKki;0nagBL$kGk!iSj$3XLKd9t`9u3gC&rQpFC%3B@fqQ`CX` zf4nkNxn6lr`K!tv{%JH5xb5#zol)!6q3TX*le$PfQ@tAQ)vl>u+0ZsRn+R~jpI~#` z=38*Qud>zIcD6OyPPE;}+OkHrBb&<3W`E)wIXyVWM{~=$!`yA|wH;^I*v`+c3%I$z zwhw}vu*dcyIH|j8ax|ryIhu`{KO7w4eru7#dWV~ijAJLq-i{{6Jjcn7d%;*{iQW(eYD-Q!?ZKCE3`MXPqcsX9PhKghqVN7vKW>r~HF zZ+yKq^?s=Lht5gYOxIpFP&Zn)Mt5BIgYJdygR{}u%Q@EB>^#nSrSnbaxAocj#`>oE zi|g;Nf1?50z^{R+!KwyF8a!&KY8cS4U&DfiiyH2C5nN(jM!BqUIqBNXb&c!wMm~+c zYxF`uLa@+V7%Qw09_elMf%&B=i8xT=Z1Nl25?O+IO| zr^&-6FPbtTIOv`^DXO@C@y=~3TfgvV@;JhuVk+=UdviEY0;y_m=^C_8d~;gxvu4p-u1ja zz1w;B@h3z=ou6LzReV-maV|#(51q7I*Sc--MbM_tDT9bG&6b!^?SZO8bIi5>fNT;B0;CvB&xofdYw z9Tpju8uqI5z|Lu%$929I-Y0xS_~`I);mgBUMKp|Xjc6Z{7LgyZC}K&(vWOiK2OT2qGt?TP<}3hX^t$291}S|a(U#2$eodg zBhN?PhAgiF*z{@V=8)d>0$2ix~HON-<}s^gJQpkJso=~ z_IB*cI26|`E+(#bTv=Rs-1)c{@rHP}_>lOX@qOZ_#m|V}9ltmJmtJnY@_TLU^*lkJ zFf-w^ge?jC5{@TaN%%40U7|8klh`1!X=2;N_K6)6V-tra7AKBO9Gy5Tae3l~#3P9h z65k~;Ne)RtNqv)&lZul*N%}nLT+**e6}=sMYkT+TJ-+we-j{m6?EP!+-+RC7ZRsuc ze&2`cQ{3lO-zoi=etr6F=pWwy)Bbz=AMbyu|Gfd)0WJd?59m7}bwK`ri38>hST*3% zfL8|1$XP;P*rHLs|@JGbCzA z-yvy3mJZo6)MaSc(4wKshh7}|&eYr#XPRi*Wx~nLlY^5xCcjH*lJYopMCx;MdvIBs zWS(PQXTE5@VZLwv+59d|m8MH`PxDKQNJ~r`l9rb?Ic;Iu7iq`SuB6>hdy`g`UN5~x zdPMqw^kL~^(`TeFOW&6MRr5cTwlY;<+Cc6tp;Ezrf$em;X}53CrbzuVtc;w*%|>yOz)& z1+1x|`Qj=2OLuGD%Zga%f4QPQCVD7+@aN>3nt%HWZ&P-ynj0W!>eeKpVsa3R=hqSF z307EZxvIi4U072!!&;FS(mn~;!ey<7e_7ESCakprHhwW!_607aP8tX{)Y*coqrwG!NEs} z$iiKRDn`taPW24@g9+6qdwM`4r+a#U;rfc|lfCMbJ_GJq^&6r8%LKyU*316CNY%TE z4_0i`@ptltSb@Lk$>L9{wh^=+x3F8;yKt%qo8^Z80$;vHo5AgUO4?d5C4}r&snocfp#V^P;<6{7Qub#BFd0k9l?Z-q8uY zQVRPTM6I}8huf?9w{Wz6W=}zUOlm?^pq!80o->uTxLkOz8VzpHRLBRXNH#>H!k zEqAdNdkDC}3xP+7|8zn{A6y9Cyj96>nBXrM__-6r!Elx0iX%ts`Lh$cs`+y$UI4_s z>{2xjUi$MNJ1`6Px!rlXb5$rRI1NqZ4;lMT}tQ zKtYj*qAIEAp9yTV0Mz{$*r7Y?d{|AiKq&YzmWjl!h@MrH3_T4eJrdqgVpBpY#gCA= z3v3mos8bvtm0Ds%ZE*oq$V<%Mv%W83=HBcEzFMsZxMau zT=P@*X6^MLL7NL`7OTYkTk)3o0!&GbX_2K|-Lr0NQ8K;`)5KMNz8T z$?{{@v3$8N3#w0Y55ifC72&AGjkJAE)l7mm9?*`~pv_?GViC)}S$q#YjT6+qEWr-N z^(_qv#~Z>yi6;>bQ^5CumG3bi_y7ow6_@EcuvX?oIyj=$!{JqZ{usWyklh0s3j|96 z`WL}fg~LPNzwLNWf7oTkEkt0*VN*ec%8WW4Bic=NCxR5u9_RJlt0wNv<0^7ph!1P%rR>heF@ku%vAdF;CeBP^cX@X{#05j$b77L_x z+rq>KuxdO2lEy5CNy&;SXu$`}gae0S1CV}`S}|^oAlg(@`VJdku;(g9uVQD&An^&z zkFr2wb5PqiAj|W`?;C)^*6_$C3OlNr1x$J`*vyI<S~qFsbFVNjvx zc#u5Zk=w~CXw5e}whMaxxpaGIfa*vS3)B+idya=yjMc%ka@!N!r1Bva{j0_jsw1GK zEZ0ilG00{_Dg1i(v^KS@k9R0qxj<lT((*U(1t9qhcIQ~q}SjZq85`pmH1OJQ2a^VE?FtoSKryI6mtk~ z7*jiEV^5JUwj9QK;Ob>5z|HxQmWOaD!o!SQxl?qr>{N&sAZs z%ELpG(FlX+tee2&Pg`7fugS~GL4t6UADr9iU}K2J>O0Lg^*fyK|n#yWlpNRkc}TESA- zD6bIQVRU=OAN$4zh(AYe3z_20t1DJ-7?bvW`* z_2vDA-J?@-yTM%B9$Le_*m56htqnJ_qGZ0#{fYAQg{_a?xK!&%wGQcFWLtfKPaXYq z%|Sgs5+hNi>61rK89ui&~A97(q5{>9M>cNCW?!5OQvt>yIJJ+2N`9`7sM z0|!4#9%iXiI25mnW;KghyoPAvr1#n$0(@CITwrlq@rACg^Hl+>xhJimd%)~&OUi4Z z{H+(lJKTmpQsIWv!3P2So11Lbd$23T5Ul8mo0K->e}JX)Jyys;`xL)((b;Xu5(k3MkF9)?o(2U?y4CFcW)=LJ&SXkanNN!rI`&1w-qdBa{yXy$}2nRrdVtaUbN2O zdAk*E;J1Pqa0XY&=4vYi=Z6B$A&Vpq4D;(kHg*Xs_JwshTrpRk#6j|vGay6T;^u^< zvzFjPeh~l0qH(?~RG!@3Zl$``Weq$Xx~^ACUTgfDz3e(De4PDA*0ohPU@bS1T`Aya zrMhOUW~6`@lO7%iMg~47lEVU$X*HZO#xuD;Vq$ca?bQBh34wuWr=IC8?ZlwU2({Sp z4=)&jQGdL|9rYHNst6513r+`p_Y3_%*57e(#W)@R0_qRG7;i=WZ5EgTSSn($L;#up zBnyZVVZG)e7}9eB1q4rG{b^`0S@bUAKro~u1xs+X1(k(u^f%Kf)e6>7P^&gIb`yXX z#W63j1Gr|P;)>W3BJT#Qc?0quwj_he0g?DS|54YVA6w$UQayjvoR^ zUPVjBGL4wO;L0Upuw{u-?5M(%iTfC=5+)O0bPEk=fAwQ3$}1wg1q+)le?|PIy1}-D zT|Ib=&yT6iuuQD@Mt3$`nanl^zYOqlHw&0kSvU!$A1r$Xa=QyIB6`L$08Vu>umB#C zZoTSI_?EP`#U4r=-6u?{Xvo)iQbhd8I*GT-UH^PAY)YtRz7(C|R1xWII^YP39zZ z5P|cz@k+8Bfu*v%XvV3H0p*N9?X!Hv>~kI@oPiB8N#p56@x&vr%&!Gnnvk)*hXt2_ zY3!^jM)wbXkD?9niBtnk*z{6(0XYd+u#goqBubsw@3F5IciKo!;pS9~cN6YcjVFge za0(YKoPj*pcX|_lBL(=-O02bXK?fqfEjkSsJVAlbX)mqBYol_@-%xFFmfA&6gsq=N)(OBPy{xD8{`mFm{A zVwE4+FWZvca&?9)F=zC-Wsg`6%g>vh3o~eZq+=>VQN?kE1EEHp&_$-G01JXhKC0VniH%%zvGn3ZStqK z&I0{U30Mwue4XMau=Bne0v#&9>MJCJ!nm-^MQF|j^72jcV$}i=PTb`EZsA2ZKd5LT zHZTD?%sGIMc}Z8}K*K^=O)@ARESL#Ag*1}b8TPyq+=`td4MR~acGtbAOl&FI4PeDL zDyf{H-GcSWI6&V0zTHCBz+xKE1yy>3?OIwA!Q{WdcH$fGVBw#W;?)I#A-DmO^BvH- zg{(U%^rkM`J!GVc3Rvw(P;ziXgxo=__zc(z161rQpWDc_{vK<>aR8rTak5<0$vlA} zJP87ku};-5Co?6foH#M_86Xmo4eB7B-E8}Q1r&UWch(x?r}={T32coAuqytgEdJAK z@yW2;NCs8FKxt6DCF&{e0A1wIOR^FKQa|gUN(D^~C%IQ47u%O&y|MW7VoN!0M1~$d z1zYoWa1OA-(x@sn&(9K}WJz$;1z1q6}sR5j4U-$_y`Z%%=tIlsk6l*bzzW>CM2cblz zktFaoIH~f3iOEV1gbW~K(GhmbJow&w3cvm%$1r(B61HSSI$-@{vRJsaki7#VvWA>2 zUBpCTC@f{Mk>87lmFkAEd{z^I-`iZ!j2C9G)~v&LfaSy`wjFc|AQS__VF>~1RfDnB za%8;_U3u*1nSaw)~4PKi9)U zff4d6L4J??PEgP9yCpt4DvT$#XDHk1|Doop4&av) zb1d@w?r45GTK9VyN&Lf~?!~(5n_jTWhfF?|c~Yp8G|PJS+m>Qe`lT;a^6@GBhtG|_ zPSKnpX#OYdL*#NV1Nb+@=#NTO;w52slX|&lc77E~}Lo75Lg|GJ}BlqEb);vkv z=-tBliDen=jVv3zmFdHFx%!pC{xc2LmXmR^m6 zIyIYaxj%{9Jb!WAdM_m2zNObWFEJ?+oTTHd=wXp4Iw=xGACZ~>m+M6vFT4pm>ou^gam4?mX$-~QiQ|jpxi--jP}ZFNj-?}>=jzXy|l!g^28mYqHEah zUdMKKZyFz?C;AmC0YY3Qn;DUK3=ypF-&IE3kuDLR%g1EUK?p-G{VTBT zT?Xycfr@ETbcE?r=9cZiu<(wg95}=k=$xbY0%p>R55Vy^rxR|RG@RMAZUs-jV<>vg zm-HvTT3MarV!FAz&Dj!N0@n;$J#=NEdUZBNtcys9EL5}a>DEMZ?C6jK-PQ~(G;0>O zaeTjZFg7h%vJ~~9K1AhBeDJUS0DgPv=HP?qA6pt&H<+3aJAVE8w&NGhZ}Y2Ndzc^C zEO*XJ?|!d$-41OsIJqhEUB=0^3ZFH(aEE>acgojrN1vBAe?(6fy6MIF-UR35@<%0mR!4WVN3rtOlXycfT3d{hf}~VQjv>+B5)_v4O~M^E zD43p2=_%zIsD7$MlH`35p--nr^3o9k`k1@OCs!TG*(bpLIAgiJ#HtxX`w>HXKzaE} z>aa_yM~Y&-J|m|o1YbF)mGWLm;23Yh^Y`Qx0ekLGQeS!A8f4q9?~c*&+)2#Iq^Q;o zD{W+54sz{)n0%5CVRLiH0Rk`zt?10q=>k0mfLqhi&q<*WG9IQ$Od&gw7*C zX81!C!=Go&@aNrnNW8(=JxJdICK~=;x=VzpQ1_QmK)(9YBL&-#xjYbp(~FOX@Wybg zuEC}xsbDnUfJ%ei%Y!WZ7TZv)}yp+1UWH{3`JZ z$z%ig3R^5!@mK>p*&ASJ zE-{I>n!`NR4H^)Tx%Ji$|NNr8#L`K@d^$15DfYCtNa#W7=%3E*rCy{E4>AZd7c3UB z@p&oFH?`_9eArkEiN+EWGQ%Lu8@420vXa&?uu#fRvv0ed>FmF&CWePlixlSfeGefofGPQ+&s~8EUqB%P7&3$_MVGVN%aFm2Om9FNrz#dv zWGVGF!9v2DR?yL?!G4hj9F6=)=U+3VV~cOey>%Fq>e0LD(g{>XcFHSEO<lKu;KWmLr?=zims&*t&u}UKSD^ zG}4o<#?(5gC+0>cO4sSrJ7|=7@AzI@TY0tYGbC`lWi|xgCuv!|F_{O-W-yf90m3&0 z*FfiFeinP2DTlJp(9G_5bseuV@d|>OLOgYTzl)T^NK}pmNLAQGIFKoCGac3SrKPz% z8*IIpEf1%yk$o4kXP-;icQ9#HMA%aE^3ZuBhj`KifOtVqJnEk)Z_cY!ja5&vuj}l^ z%$k0WgOBPM;;|B4am@kmQeMWS2l$mn+pVlVL+US+Nd)@AM%ZkML$uL=eq(>1R4Nmwl(CiCml)8mX43h|7 z5p6n+g14YcHuFF7BsIcRoFBkecZ#i{mh@xfXeyRU#re(bd%)5#YGgg(#1dldr6dH6 z$M=Py$@3ySB!dyyxid#At$2&IjMFt~09$=kuD?raKq`X?rjqw5l0K!}0r)si0Nuvg z408-6Ss555@S$o(&w?I(1&*v@6zLSUP~Sj#lL474>~p}1Pd8xY7`-74u%iMQEyKIV zFx{^Sa;>x2$Ty4cu)UwTTT6(T`bu~?OL?6s2P=yfFIpIh!t)Yk_LVk6Gf4W<;Fshx zh)*^nJ`X{Bpk^k%gg7v}K6VwT?Q{edRvh8(KOkJu_gG-{#3ZXEiK9Q|ckC{hN1euP zNB0ge@9WcgV}01k**opZ=?!}_EWLOC5)3aHikBUWnBwrW^XrcgzPBKyflnH)8$npx?aC@lAUTA3WM3K0ijw>B$l}EMQi27V&zn zA)Q%#&TQ%M$z@jhjV7?Y1EWP`5Z1Hg6~3CydyNPjZ6WhuuKAf2tJ>(fl#OPlj&rpxu z>{m>M8SsTr$@oyw&twTQWD6Ug*0kze+#qFx-tcMHLL=` z?=eM7K0MVef7YIOdKvFXq&}N}voP_#fAI%f*D8W3QkyO}<>iW&j6TZlr&ihL4MXJW zFWgf|iIk_(9#Tq-iRzFZZ>Dt9X*A9CqZuuXl9(uBtDQoR_Y^{Br%y*zMzUbeB3@*|OlC1z6OFUKs*vG6tL@R4J znC6Z?>8dc2hDH!Wv3DS3e_&r!hUn4xKKKNbD~eH!BWJL+^u6+o6nO1_v~dE{d+fVy z)xMoqJs-BXfjv-(8ujQ8X6sbqBmbm7ws})V#)c97dkh;pAmT@u>6u|XIWJ~ebc~l6 zcX8K%HjVoYZZ$c4UUZa2tVeZvF>cnHHM2LvD?!){Sl6y0I`wn*v06F9v}Nnh3lkx4 z(hr1&BEDlR!DFI1otxw=%r4-+Ao&&1lsXL`25o9k&8^NicqIOk^&{3uL5_lnVduc> z?kJsoTCbD+Z12^=`Z=$jTz3dWR}$++QVHM5N;RnN7ITh(3Oe`n6fqmV*&Kn4k~NXD2aSfc4kF#D*=3X_)4MGQ68jFWhSmmr;ki%Pxwht zQoXS|TXZt`h)SAyKcopG4tzBp&I*qxMzo|R4< z+LOmZTU^nI#~Z9tm6yFqHX}iF6_(#D(Fl8@*xW?eFt9RIVpq8&8?KcYuB^7EMm#BD zjpA62pq{L}tB^aB&|Q+)mxQuUG~MASaFo5k)wu=QYn4OUm{33L5WcImAJ(wTMnq&B@08C@T|5!da3`BmtL~^2gB?e}Y|9(*aO-q^QYKbgwUoD`;J1UVa4_d8ft^4(0P72zt`Hq^fx|9s0;H~qDOIx^t2mn~lB5O|R!^<%aoIWTt>a^$$1 z?EWb1J}Ro}#O0BVh%ihN9qLz6DDF;wXy;YUf2Yr41z z`sm-Z`0nA*{m;3dFGUfooUSTJlxF+(K#TyPTJ>$FjhZFo@#mfn8GOKfS%sv-74TQtp`XQ%N*qPlh@w*#N9O2r;^4JM2hR&lm}Q1qC&on5@$Gnf zpR;1WbUHGe&axN(Tb85zvstJhJxi(KY!+SI?8^}3RkSox-k(#-gxVT1=NBbdWvsth zO;S7lU(Pze<4oEJNMo|dOr}<_GK--K5G81~!t{^H`i|+ZbW%t$(_m=;FD}hG{wpVL z&ibOkv7ADSHHHB^%noo20Je`Pb|ikgq=uL(D+uFtJBZD+*hoy; zI2C3sE)P4p>Pt7BcOcMiHYf9@q#cW7cSbmtU{muAoCFxm|qQ%Q5144 z_9inSGFrn#MvJ{WLS%#-1HF-BvA2@LzVo$D@l}zsD|T*6BN=^-i3EXN8i~!@sz~hK zmPS$!?B9NqkZbUCX@!KneKBwd8EQOfDDRS2-;~5R4TnNcwIO^izHbPhi%%orbMZ+- zhtI_~k?^_rzF`x-|8yylEi9<4re$s!++w#;@146cnLY$^NyGJJf6fT zJ{{vx{s(X7)6tvxbZm(7pU3C=bj)Ht9le$ElSx6p<9Rgz#FxWB>~P;N}2cvqIWTJbtuyz(+qYUdxzz z>ry{*&2&BNyjMMZO_DCvB&DtBtpsA8@g@03#)8ND&eb44gd$7;UzMrZl!vPiCTbi)@mLu;uSZ(uC!qhR@SXVoqs1D7pMfOJerI%9nLB7QVSj zcVW}ZMq7?UWw0<7nUDaul098|6Pk}RdDPZ$NZHvDP4omc7$L|+l z+j(N)!%cOhOHkwQc_nQC6w1l4!j?vNvSWVTD==r%|<{u9QC%gwXpY}V(^k+QV6X4nQ#nUvFX5#n! z+S*{(`hmAO8tdMREH5+5U}fFnA%zrQ_uwnjjmq|pjza;D!A(`zwp(D2(F2U%(F)sE zsnIo*^kX29g~Z)7I%GwPg%n{-TT+rSa7hTZs2BBM>VlOE25wh}JG_hhwhi+ZY_Jfc ze)hC!bEbNIJ&l-Tg}Ig@31Fm`mU5@fVaYBc4guRe@99_5PhqozJ6xVkzn69i?nex# z1>3y;(mk@HPKSGCIZFREd|2||;*0N+e3WVan(b`@0MoaV9MI;lPx0Z;Gyfi1MeM-5 zrU6(&KH?klwK$GR=)`9=K1Y0&nTEZW)UVJnufX+|-M~-)KRyg>^}a-N9y|y3ipa8? zsW;z(aT;J5S&{T*%!l(}$p^ld?ED2J+o|vujw-DCNQHHe;=oh@e=U!xfIMN0nNa4L zU0OM<2|S?rzKdf$wd?DK|UqDHj(0qp) zkzG&;1$jn@(UTA5Xh!p_Wk6>ky8I0VgA1b z;G}FmNa~z&U-_u|{cHEYjBSo2vUBAW?BJA@$H#atm zR~vO4)_%6-{&X%eI&S$oulVIN!Y4=mIANwmd^~76*D11JXjf1FgJZJH@yAV}QhtN3-S zTJ5;sJW^bXvkiWnoXY$|{$2Kf|m@gNm2 z8a{M9L^K0`9@E_C&8C<5p%^$iR<8_qjUNebgJH zay_1HgWkai#;45!Ypv~#_k67x5^avrr~+?BJxN(D>FGhr=9K%L@84CL+CW;4X;={6 z{K$JI41YwHj^STQBO}&Ia`(E@zzWhhWKAJ%>NNQ7P0J}~qG6;+ARktiAJ|BWkAQ#F zA;eX^6WjUmq=uH9N2UI^F?;)v-qkT9{i%O-T8Z|ieQra->Te;gPPInfhuuh7o)#bJ zTMJC9N~oYQ(UMZ|7&e$$%nk+@1hd6mw-;zK1xC{_#>fx7^@^kgsSX1ac_thyrbO#9 z5@A912T?sC72!D1=Q3P7mn=~WtWLN&hY!|Dli`DP_VPH-3p-K|A4(e5p1M$NWm=}J zxqeU1xG(~`rX3-TtV4|MJ79=i1lBOFJUNaA)F3Lb+|*tk;R;;XS$y3~Dnnc;39p7V4spj$Jo@JDe~7wtZ;l4g&|Z zXxcCB_aEUonuyq;I`c9|N<-GBnJvvFUc6k94b(Gvn5j+waT7x|2*yC^3HX>YZLkw+!pF$U;iSbHr(KwcluAFIp8{W1#cO z#WqXoY^k^F_g-(kqKN>Y_FnuYW8cYNcJ*)Gtbgw|7UKd^7^|_8V(K2E;!&9>ky^U# zr2kb?Kw1$2)xs`B1@qo~__mg#1p!Ylc(W`>eDEPpA%iNZ!9UZQJo1xnC|oLcnSe&W!sw9A*%2XyJsdoYw?&?!7R#EDFT1HjGDb_^$_Afn8{5~Xak zcR5Ga;s+Vttwp>4pf3m4P(p0<1?F{6EeOLIPuqL|4JOpD}!XLF$yw22tL z^&+gNtD|+9vE1v;#2N1XJc*OfQJA?DE8U!`rbSPUo(3<%n87RNEM4Gvc*mwgM-oN{ zwyqvX3-va859W+hX*;x%c@eKhoH2p_#)~);yf8Q7;>|B^#CP2EB!-fwVOGZ6i05Z+ z#K$u?;yale@evL;;`5^ag&Xmm+02bNyaU3Gcw^>9eEDEdNkNmG_*|l?@V!@14j=_}#y)ci zv&^$osNu|pUk~@fawc`x@8#jLumLSB2b01&9jG zfJxqhVt2y%VgZoM0y^WUuF|Lm(x|^9zoQ)FcT@%T{%^?dsIvU1M$%SBegi>%H=hXy-eV`ksnNPUj1XTZs>h_#7eZXT7PW-Wi-?Xelgi8) z_Uz@co)>qd96FpdtOL!*2yxl6<^~|dP@Fare_(5E;_AK=U%sM{5`hq(KvQadLx|TM z+NluY^9muZMLiJXqs(~j*PqjOGD19}N7sSFL5QR6gm~Vn^wY1`%Tu=>@;bTGPKeus5Km)-*ax5& z;Ai9!VqTpB!WYIABTu3YW#(X7OMDL~TPl=zMdtc#3MJm*bqtgkVJu47DRDNHykH3J zLY);#yqQtrYYs}>dVqrxr-Kp?V3c?cDDf^viFYwd9L6YdZAOW&fD$ial(?&d601RAMu}Y=l(;^l#F_i- zl(<(<2PHo2pv38*#QhzV7`@^QO3dLC<)U7Xy@*1IlNlv0LsjMA#+w>3W;ABb-7P^Pht$!_%!Nr9ec5| zk{BNx1|^)?w7@84`_qgTC@0b2PJi&5hDvl66<5KLkm(YSX;qB>wNGX}ta^T=;#O2q zo<~TL8srCw{M>@4(_!t-Q?U%sUN4l$vQiQqF=MYZBM%a`X?V+fD4@*EgT!OWH-JpH z!!ezK0VDbvw@8s2?qtwwF%>>bOT*#1IOZ*cD{Wru#WC=^E~ZZ8>8u$5bKdu0&e$r= zU_heY6o4t~8JIId_!$hy84D%Z$Y3PfzxHXIz&pB4j)G5Lc#h3r9Y-?qz$F>qb{t8y z158pG#6Y?V^>2m5XDR#CgT9nl@p9<-Ao0*TKFv9OW|_)9B~%qTGC|ev|iGr&*cEvM*t=>z)08Wx36TMxlIg84jCM& zqJ$GaIZ}fkT;fgF`A94Vl7&Q&WqH}dkbNJ^9>%ioL-uZ@ zphR3RN^)(&&E_{)eZL(n0*0(qSDEc{IdmQRU`ZsoC+9cOLeaVvi#RZu(G`~?(G@kx zUOkyF>zhj`hCqGdUSt@LSBy-UjU*l=RUO64MeM~ajAWoDvu=us^pV7ckzc_p-iiDx zD7#TWcrN;5BL!%n$vX(aau9IgRu?i3V&u1y>_JX6m#nuDUgs()!qFmnc^mD-zc3&aBBqBzRdsp1kLGbj zBAr4eE{{)$U6zorDsp_tq=*m;-gSUgAuIFn?Z!9G0b|_JD-2giPZa%P0cl23zr~c7 z3ovjm7Wha%(-h4Aztnjn0Cm1tfI4pk{B4~t7NE`;R_Br1jc(+1b01Wg;{EsCd>Oi$ zXwT{_l%3)|g8$M=vv@PB`WsVji*j3N5np-Jk&S^Qj{fR#&wcxQS%oTMBVnGLVTymV z{rQ1AhCB2)E&l$<9eqHfZY9T4l|gRC=CPx`eXRdtBfqJSs{XdV>yb)*J!dEZ6_n`} z{>}7qq1!=fKh8bIdoZojk8^MGCu!-H_^N!Ii&aItV?4PJ#-=sQ$^QDQXUjjkBApz8 zbZP_{tBmcSa%f3WltoU^a>(fTG18ZFiMO1=)N*UlO3-V%eS!2g5jR~t0kU0KV(mkq zUh$GPx()r^c)lA;-3GheBvLY#l(N~zFu(HiB2}9i6aVA`2m$8d*S|+#zn|(G#0x*s zame3|4j}oE%^TUuCz4XJSjAl+Ryk^wbfW>5Bjq3P!xPi@ZcEykVm?MpJpD*|pn*LU z&h35du$w{`uZb3Wk}jsq9osYa58BbQ$B;oidZrHEkA+2N@|K)cA0X$oSU$fs-PeV` zztwv8)zUj(?&x>5Mw^xIIA7h$Vl__ptN(IP>4CfJ-#Wt?8%h<@r4{m2?FtX#qazPl zFg)0oIv&b%J?I1Ws61Z5Y98Gbe;e+H&;b#SmTV&xHs!X&meX{Vbd$Bj=K((gE!mos zmI8+ZCcdFWuSbv$v~~zOxUCpKibR->q@+W>5`Qo-y;G;a{@oCVrF%;MBWB~MFKNM4 z?0^j>%b^m7k|N~%9iIN-WY4%FFXK>qMw;!2?(%DHHrf_`;q6(^+~LI~&8>qsODyC| z=dVJ(^aNmPY=zoj>D&fJk8QMMyd65FhN1ntbx-bp#6nJZu!{fkEE&&++MB?@z&Jda z0=LOU8{3ZY9mtgLF0FnuUI#v8j$L#2%Wf*HAx)U(+Je?23gV@BS`jC`Iu zBQIa1Q`+#xZtyOXPp(DkvKbjm>Mz8MgbOaRL!M{qF?2|;-pPUc4{S@>yKh)(cgrO@ zP>C-xVOAjGi}WibKJMPPLr=sPQQK$l>#M{k+DuEva$))=1BSHq$7J5KZAk z*)6s>h`(?b0gQ68iJJtj_pxd@*^a`iv9j5%qwH#|=sGC54l5WJe9jbBZUaZL4Opp7 zz7(1>A80QTM0+^EAK;@%2O_HX%d@omaRu9Y$Ag>*zq{ z*57r;{rrApUHK*JN_$r2fsz&K-$3s?YF2gb2PqYj8ilw)r9&ZcRpmmUXQi12ZspWd zu$dyIO*M4w5haio04*!$kA_#3w>fgkg<3+3*+Cq?Ml^xlLh440q7 z11mC}JYur=vQ4@DLCwb? z#aWw(8;?TR)ywaa8)SpQcz?4p%hYaZDAO~RvGN}#%%lyUy%ix`V=Rmw8Wu;MLCIp5Vj1|B; zV0qyJt_dkB?UBgjYxw;V?E%|#(IPZ`6iZ8HXW4Gr@WAd~?E?-xeUyIa zCK#2V&d;zFP2+p5Gy~YmGoknQhKpmiIFWTQPEQ@K?|JoeLK=D{#c3N zU9bTDcE7XG)3M7M5r}cC7h%e}8V(sG&;- zdkr2IHF>nf|7i0TNBz0UqoRfl@f@;bSllRc$Bq|T96QE^ZQ2%<>a~5_lGsg_<9-*; z`yJQjI6B0zJ7kA`gOG!Pn05ktFX5ILVCL&CRNf&#Wc)o z1XmI3yi9xp8Q4(p2h=UbiI49=RVelM)gf#1YA4~H?@rj>fg$%!;ozkCs{~w z-P#8nZLV7~cgYgZ)x=+)aG#_7bXQ`xr=IeO zo8Zfxo~VnO8wLB10Nwb?+*KVdnuNeCrMyV-yN?OC&SGrDOt)ZU3-=FqNh#Rq6SI^p z*N02_)d>7pO1CJ5OCjEHhX*}r4sQ*7R9CKs4mMJ-foW_l&jk_*Z$p_guC$r!*3C-t zGR{L36)4*quqc5;xqPIgHp4@n5BHR*cDjQ>G4C`|7<2DHbaeUN~>&I z$cq-KU6+=&)M!Etzt+F=$D@mG{9W#a&f1oCGtFGfEz`*bCzyU@7slAR zWJ38T2cNjZ|4w;vOb*9nVfE3^bOS9$HgLFxE^h|sU7l3Ytr^NqrY*`7XxgWO`vw)L zG2k+{dO};p>enQ5q}mgzh6s47O|>UdMOv%hkOtZ}q`iqWn8Oix{%a78Rn}MQzLj9; zx{^kr_oc+$ymEs`LJPFV@VGo5AxDSeb^^YjYw;n)e>v)N|2_ zFCe%VjnSb|1xQc*Iw>GF1T}Zj9{Xt%pL;F;EN@Dbehw#EwcL*A03`o2uiPHPoqQ0t z5_IW|VE7vEOQh^#Y1T2~C85%(AV;O;(j@w{BzE5-iKP+BCw#XT)NK8o7Vu*CNzk|@ z9?~pCwqhZC9692VqrM661MnWkbW$8*N)=Q?rfAX1jo%R`X*xbaHuX+9PP>z2vE@7| zOlES?_@Og7+|q%>#(BfGWB+-~X9Qa1&zoNVvitB+OXovp`@QiZh8yQG$qlv6Q$vYX z{W^EC9QJR!yQCL2)NBE{nc-#&Vz9&!XH&q?_&s})<9F>z9ub&q2^>0fL?17?oJXI) zq?DnSl;o78Jzl$#L;Ca?8WQjYA#;{7Y=qU5^jbd8?O-U_T|vP_pkPVsd2SHHyY33! zB|7k~Ek8#h!(p706G{rH0dp0y9?n;Dl5(1uKF^|sZhj6WRq$@T{r9HM7)9F?T@E4+ z!{5>hZ8|j6da!k4#QCebulZT_DrM;>k!zwx<4h$5s|mZ zAC&j&H*s>XC962Md}YFlB(JkO+R#FaEpz5@u^|K3B2H_8a<%9Wv;@&YJZo7FYm6?# z_Wklp+KzpDlE;i%WhwRJP=9|obJ>~67_qk!_#bI%FUeYfrkgtQ@?2|vxXNP@c`fj* z`&Ce0_z$rKKb<9nc1^+E430)NITtnu+y_%R}PA_%^pxO4)4E zD4|=ao9^#wDW>|a8kM6Sab1?I^{6LVwf7lhT93eK=_gMwwb#iiv>3->h3I-;y1yH) zL~!LmY^)Xeh&ysFV&7qiT^@*C{tIH4R}i~A5WBpB*tk*Ak2kX}G$J1Q%P%&=GoEM6mTv7_-CpmFXE@c1C`_)H!i_XHlZTL&KZ1Rh`bg2$7A z$B^xM!4HW8F@1oT*MZ8NfyzD(RF1Zza$BHkG*C4PE^@x0DrpN`g)GVg6WR+%2uHE6 zf61_8VP6FcFF=rLsC9v1VP88IW++(L99XEo+58I@uFcq!ycSqE99TGX=+NN~EZmZ; zVBr>qg%kSp9XbJ6NLutEWu!hZQIqfL$QrtYBhB>mIk`@s0|jU^J?w^-fGJwqrV&A^ zUDY;C6ZWgkB=ACpXk2o2x%wij4s7oHk@9Hk=w&oN%`bB^kjGuxpYsR&m3oktI&z($ zK=PcUxL!p!an^^_EI$O%DZLF+Jj6AVucB0-Eli&go=2{3t!C9tC#L~+`0jZRYSi}r?)(H77-2LR1Y*STNK$f2}hkVtn)n~{$2IVsA zXnAx5gWRfHjCNF0U_QoRKJ7tc$tF&Ih)|plb%b5_<3Sgcj`_Mf4g=_%9_R}z^2@qK z3{30j$O!9b2Kr)IC!;<%*eh7^lS!TV3BHPFRy5IQ3jGi=k3=&)5uEW09g%3*|0};1 z<6JOknd@K0L#}(8ybhKxKY9>%9Wp#eX7r=G4q2XaAf2ly`~hi6cSte2GqSFQJ1ZQh zwGOp>8mC_KX}lKJ*cQYVhHzmlWbqpb``yTX=~z77M3rAmheNNi%|x7tUe$QAkCxrX z)3UYsNAT-W1pYF|eQ-}E=rBf`Kml7X+@T8Ki`Si|H z0?b87Nlx6FopNOVZO>bs&r>6HZCSr^_t+r`L1r<{H?VEnQl8Z7ePvShmt(P;GtFY~ znAF{onO+I2=l#6aLJZKai)H6=kaq*j*(130$!jBnJ%h(i9%>dZ4;j8@_bi004(F;Z`PHAed6E3T zpSo@l&+M7Fb;Jg_heTm*+o_2QRfUlgAH$ysHA%NigOn73cu`mx1q=zEH8lFBxEY=tO;rL52$@ zP^=Z$;^`fAf+|t@;`s5gM4vT1KYcuVwWUY`7Z?>hc7Ru(z?AdnlT-Glts66Jq2 z?XS+`1VFdZ}7Aby9o$`oCkKyiz{Aqf0;rzXO&Cge?(4s|^D(71~w%l?WI4UV^ zXX2KfJ2wpiM&4xC1 z9+yMj2S1QjsC#Oy#hI!n0;S>s?Eupz+ToyNyd}}AWRtchQ})cgK?GRXGU3j8LSClD z33qmrawCfk3d=I95BVg<_gK#(OBE zO3Z=*fs@mDYeU%xqLE5#PvGU_@WW^IB2TndFJ_+3pwp;nb5c;-5uQzQ{hAac8t`K7 z^J?hG0B%1z6t?h}(F{aX)*|5UM&_XbkvFcn(;-h8MY>Ig%!i9Hq*w*4r$5Z#LF@9X zt&L?jt+g=;HbEIBzts&No=FUVMRI`Fx`<3NLD$8}8lW@wkRPk9OXQ!BxQ7WOJ+<}` zYjtZXXY87@P5s%NlVAJU9AkRXQclSkR^~isjJgFUHRwig5LwUBK1yfoM_&+oU(l+z zpsDalOSbKoSioHd>wY_^`{%=e+R?B3S+~kQ>v=G<*f?ck+~9Bq!)A51KS294F>JXN z%HGPr;r0NA>VSM`vNBRn!(fk_TkB7qeJYY16?1C z&wl&xkTVl_Xd-#2tyAPSTI&=t#sq%7hqVpX(YK_htSxu&CG}eldpz9>7MYiXe^6V0 zAP==Tg`3F350rh`Cu2aZg~%fZ8KcM~Kk%qee z2IxyFDKe1&n%yh`4UxAxg68aFF>^BR?2~eXUt2^uFG@~^5+uhS0vj)KqhQ0SHVcFe zbGhYm)N;~#xsLW&t~bZmu(>$TbrE3rjX1HSpo!CB?ZIg8F-&b6G|J9ly(=se7M zit}9OHO^a{Gn|h(pK{K2zUBPT`GxaaXPA{C>|HUwG+&Xg%Gcx@@x%Fvd^o>>Kf%8c zvP|XGdm_>{yqr$AJF-_Np$$f2yVr~WlL6jCB%e`8yhxx z+_;F?*x4596vee%oE322>*=vW*M$<2(H?JmS?n}(#OgVT+dRo8*dhD^)3r;jUR*qo zp19U5lwZx&i49z_&vSRimP^<6_HVM#Olrm)%Ap`^?EsrL0 zm&1}n`+0WiHmq*t4!d7Rm}&J%!auvsb~w!z6hq8B-+_u5p^zsiz92!!`4;lp=YK1% zecOSLz#^){J5m+w3Z|s#j#X7Btg750VtGsUV|`*F{25Z{U6WmX<1R?4u_rQqhl*yA zbF?7+p-4+=sCS}oDpSMiJE=)PF;7~E@U4kA(}%6-~5!4eNv8PrR}_QF>PSij(q}KTa0U$ZjL+Pd9F=Lt*ZV5TF!v}Z5X#UIwp35SHg;^ zlgCYt47LdWjem*1aV~*a-%KLUr17~D{r^gw?@+z@BEbJkgdjNt5kZ8X22LF@evDz{ zn8D-Qcu}G01F-(Rufns+0vjh!9tgK?xLIOY;vG)-o zB5F&*Up(*RI{jgubp%uS%8GMO0mIrI3=m(OyF*ani~R_Gsqza>G@e@yIbn6<1!hxi z{Ch$0SPTD!X(3u0|Anb1t%W2+f)bww+$t~VAZVc?T^Mn%wG>Wi*v^v_wj6dUTK&%Z zcen4p|8T2nv7$Aq6~Ut`Cr)N(cR10YfnSG)4Uf0Kf=7LartaRIoRX1|64!HWF_R~SPnk4n<&-#!@n7-(pN(sHo1)iB7A--21rsezQ?Qm!;b>DGnPqLo z(VsEBf7X-Paw|^gq)#2&E2%j~r#wviY3U~wiEw7$#vO^4+WMwLMs@ByeB)vGBdIWz z6PWj7>Z14p7EDjCt=aLbCEzMI+|Mt(t`}_q=8qc7c0ce<3q#V^8QdzYwTc9EA22pF zX6v%~%jd^g(g<{ZopsX#xNQ^rZ9}Doa#Tf&QQ>;iXBT!Sq0)YF+sB^9X5!9E=t&QR z4r~?dG3U@`D1RzlK>X2=5K9o*W$HO{+sSh~e?7fFahPB8K}~=*K9X_$vJD&4J4c~8 zZ6u*Ky#zK{4FVo&8C?zB%+}RmHx+b()95Ly64u4X#K*@^88?1P*l4Wb3($k6A#K82 zxAu=oiC?iY^=B;3;dVJ={WQG&-ou!6wLZ@mncxdw^Hj=pT`QPiUkT5qqJ}(hQ?m{B^X_llDOj9awS<|*pYwTHDUpYPS=p^$jz5k^Cft7LJ zc<{8Y)66jy(&wF7xP4Qh^o?s%uX-NSUt5v#M;xSrkj7=ziJO{o4bQGlNbSGTJa|*< zh5hFli~-?8$MpAXbf+KmG#bA@LimTx)2PNQ4CW6oXYNARi2l4ldVBQcg?r>FxGHz( zQ|2Osl#ru1f!KYL!~3@Y<1_NbosDoM@$jW(7Qv4nEnVaV+Da$jvsa9I5{m%!VuVwd zO`!sD(IFe0RYrtD5(#&eib2^q#h~orT!%r~!y&u?qwteQX&@TCF=f5+P_q743 zBP@avK!7=g5)_}%unrSqcxHKPHwOlmymnaaKCTBdw0_cr83ALvde%HY{Du$$#RWl8 zjLcQ@5}5RzR>lC8l*`f}9sS8F!8U@Nhs38SDfn7%tqRLZf$Y}76_y(w^+&Xue2DZj z(jq|qiY0eVQuq&i!nE~RR2TG6LHMl_U{C1BOwt#u#|2EMQ-dX=qPXUs3>B=mq@D1! zw7!O2S})M>Te+%x#s@I8$kp-`|{NjHDINgcqG80n5N30aHoHa42J$oY?oslW1yQ!D7&-WPR#0$4p92;$ro` zrltOJG-*`--a#V<1eyhyoo>+C1Gij2;FgB4bi5s>`zo@F(Io%K;?`8uTiGww>t(Sr zH%D*9nMOO|rPlhR&X|4R;Q2U9-M!qPxE5U(40)_6( ztC`T)@A6DwoG+C^Ko+?x!hcsqodE9R7_KU5g3q@%tP{M^FIY_UHihOX5QQ)WA`*Z# zhbIZN923Cj*$%a4p%#m9NM9&14+VHK!-8K7IDVNE<3T~8Z9snEsK1V`r6)OZk_FBK zk$bO)N*(rr=}$}nBi5#DieJ5Xxn=W;ol6cZGIZAa_aD~DjFIR<;4(75-pYQdhaN6} z&Gae)2pQWT`iXnjO4MjE4j3Z|EUc}O+=Zpe5+bgJLQi4xgRlovnfPA%os>ryE&596 z^$7h8Fl0;$qd1}hLZwv{!qcxr2CMe<1E5>-cQIJzP8_Dv!M88au+=7 z|1#`6y2=~jCE6k+XL$Pc3-{y1+1>1M&?93UTEc>!i@W*-~Af*NWeY!BqBV*mY|{XBhc<( zt-FFVaTbb1v8NHZ2+Hia_Z?63N~nchyl`3iJw*5_2nLHKYL9{;)MsYW2#aem++9gnM8Q4>}$!7}iqyPtm0`rs-Ecn5Ba})@fmUP7@>07lT;SXs! z_ICJiy3(^c<5rJa?5^k=%u1_UIK)W(mhZDX8j|oiA@ZbTvl4195 zOhZpV$cU2UDLyYH=R!Ya4dDceI6XqH{#qP2*{;7P(24PI8Yr;PXLetz0x23zt30jg zQ-c$1s)R_DzydL91uRvn3r~2P%FMLx)$v+0} z-@%XEBz%cMGyqk>mxVyCLDipVzzobnt8&h|Um`9_d(ya44hzjWdU^6sG~EZUX;zsq&7 z5Ew`*!(z)9b-fjs2G1%ita=EB9{P*j$B{5by;r`vK)CW*OM;$_t3Ab%D-k%84N2 z=LnrqjhP3YnM&n?L#4`4X}~>m0uN2CGO5bq?4xRha~oBAoc&b2aSl)g;XFbWj`LJi z6wWhL$8kQXI*0QG)eW3)VJfNdR{&=ZwFk~WsEgoSOkD-%YU)}z*HO>HdA2%QrBN?b zFU0jG^(K{C(^1nA=T4eVICs-@$9b$~EY52*J5*Zm@3L?{tU0FA0#+wHjaO+j37RCF zw`jH@-BG+_d_a|oSDn;EsWeTSx9zMlj_5yrl*){@;m>A6ZuY)_s;bJ+sAn^8Rl_EY zI(w_yHu1-~dz(f*y;XzSb!h9Y8sp!gowq8yGkZI$vws_J)e=X3wMsxA*~`+P|2!Pm zT2($(LC3X|%BcFmam}e*RfQbaI+dHs({Zg==8^uN7KXN-cRG7lddJW91o zIUi8Y$CdLr<(#dYZz|`9%K4>o{-~V)9N9m3xLT*2-ITMZaxSi%D=6oh%DJ&}ZmXQT zD(8Ta!$%HR2Px-ZT;g;U!O(x-}1dxI&`GE{w0+TovCiXj$f2_qN#F6;N=)q2=H>IDq6Kj zwL-O8wO(~VbrhJDYM2knSUEFe)DI$`pvD%_R{v$_B!{O z?YZrt?W6t9_RjHCQ~#+_YSX629XNX2mTfy>`y)4HZtj2jwSD-fw|VaX&m-GM+Z)@< zyl3BEp`TT@CwWgX8vpobduw}!93O0N|1sHjF9E~f!fd->TWi~%+dH{w(2GxzBgWR# zmi=8p|8Q#?^A9h-du5A38647X2~1C zbQiNG7iZrf4e;~Zbl=vJH#?O6chKl>)BGoQe;I#Gt- z?5S#tIzT-{JwhF?QQKt?Q`v0t*rgi$;pX#a&z)IZatUGWpIbNliVflDtD8+&;6+@t@G8p=u7G=>8tDO>Rao3>qGS6`kDF# z`jz_i`egk{{U!Z%{X_k0$eUFLox#Q6ZYXRhYA9`}0J(E*LqkJzLtBHtp}V24VUQun zFvbvK2sg|$L_-R_!m!$qXxIf=^d-Y>!&}Irjn0Lg%Q{!$TML7PC?Ot_M*YF<<}b%1&GIF#dZC$oCH;^Pl%x9t_o01#DF1g`+SI35OYn z1&23|qBx4-D2}59j#4;E<0ylp9FEF3d~sC8Q5{E39JO%N#!(kXJskCMG{DgqM-v=P zaWuox97hWrt#Gu#(H2KL9PM#*z~P6ZFOGgV`r{aYV<3(}I7Zmks7B!!jbjXsg?P3I z$6_1R6t_LmEX5j6r*XBt)Ks-S*Hpt%9Y+J)Z^f+FXk1km%~DW7HRhNMinUbb41S6$ zM#x=N5O?5^XarUQ(z&b58gKAOa_?&6uD+(Is;Z{Asut2VL4E;L2Bo5W)bSr**&%ed zB_ndPEhT$6q7?F?RLl_YWjRy_Q$4q(D$4Ctji3pJt z$xIQ+{K}A&(2&f?%*P1H%#4i8NDUPUNs)-h3>ia2L_|dMJiq(D_nA2}j%dEU@AY2q z^`3pL|Jr+f?X~Z9-}k!r+H0)?Pt@Q#;yU5F;JOmt4c8sl1J@H*i|dW+gR8?Gf;$w~ z57!?z5LZv$LAW8fp}4~c8-{DZjlhk>9f=!-8;v^(XEpga{#e{GxMOjjz>UKlhx;V% z-*G46K7~68_i5b8xKp^tc-*PD({TTZI|KI_+yva2xU+C)llF7CiJVWupNu;PHwE`C z+>N-KaEpll8O|sZhcb;&rV+|CLYYP=(+FkaP$mv#;!q|IW#UjK4rSs{CJtrdP$mv# z;!q|IW#UjK4rLmlOe2(Ogffj#CJtrdP$mv#;!q|IW#UjK4rSs{CJtrdP$mv#;!q|I zW#UjKPVM4QCJtrdP$mv#;!q|IW#UjK4rSs{rV+|CLYYP=(+Fi6p-dx`X@oM3P^J;e zG(wp;l!-%`Mko`9GI1yqhca;}6NfT!C=-V=jZmhMvvN4P3cKK3-Wlg&4}OiepeqZ% zch|$q|L?^fOgc^9yezE~;ww6TrIj2O?Pb#ed1U=1boWc>?w8QrFG0cA-Q~D>xGQk; zaaZ!5`E}e?xT|s3;uaHrGk(kZ1cUb38_(f$N8E)zKbrTT1BGq8&;O8jvmX|oEBqJl z{ZI4W_9$NGb{FTr@;C3-G_Bx|juM++wrEFwOpv4>Dhj~x4 zG?t6IQ*v{T@SV}#pqqciF{qM|x9z;}Ha(g7uTzUx86)DF(hg8BgmYrA5%z#8|pNhrt>X2%o4$d$-8c;-V#Aw21nU7w;{h$Sct8Ahm$T zr94$b3m(7%gq|T)xjLk+Dj>K2*Z;znZM&M*#`a^(G?cZs^vqBLirCXf9M!sv!u?nq zjJ1ThTVpsLh#uL(@fz=q(a)sGexX#tMVq4QP(x(Ht0+t|M^9qErV{LezQ+}AM zSYso~8d?4c{?5Wukdbvp^?qFV87=-a=YJ{OT3E`M_w#nQ!i$CN;H^C08vOT+DqH!4 zuND3w91BI)w)kn>^ac35So=L_r0B^?6QbqY_!agR1JTcaN9)?tye&N=3AC#)Md4*> z(3e`vt90t$s6|CvS_BEC#MZyk?+q4L_z~X#wopbT_kJa8<>rx2X!ZNTZ8lFgY7QmL z_{sWsjawI%6z=2LgAFj(QWf4QECH7y9d{!WkHcFh5dTDBW#O^H?@G%d)uXtVX;UQK zew^(!>1q9I&HEv*g|cI5d5$%O-$wOmi#O2{N~apPF8%$ln|bEFX^Jg_tVjyc1;(Fm zpw;$;{aTm@JEw$W(fTj6xJEBEf2o41Z$g1a1)Ki#eI`#oPFHsHDv4> zrDB&??)_ipjUj`nuV9H*L_&GvfXZ>H6neLsMf z#^7JzNv)P^3Qt%X&g?6X*>|s)+(!3%krr1e+%@d)|61$`noDjz)Az?+Jl9_+zeML3 zt&q^?9-+1_W^89CMeP;dIf|+*CLw-5lqr#{!k>87HH->7`+9?2vV*675_{yAg>S)W zxuSkx1SyU--v(7*cI~01$-|3q!-T1J}f-IAa9b{(y5-`LbIm6X!@H1C4mE3Dih!H`waOp*<7LKQUK$4J#{JfqEN z_)tGI!hOYr@EzZQ;MWbbz#DC80ZUnw9oncCOW3#?SNu_fq)Si-s9O4?)%10XQV)f{ z8Y#c2H|4&&80oDfbUQ7*r#Z$-fXiw1(jQ!oJRI!DSH9o1;#2hH!E$h)*N~Uhp+q&O zq)t1F5>O1Kj;}ZO`*7{!t$SnjW+hZ9<}CV@@Hkq1eepW2aG`C2xKZC3P9Og#)R&$orop#VxyQuRz?3kU!XKQVd6`rzE z^@|s!F1kL5SCkXU&L(*FL;bjyv1aX+B%cou5z=S}^2D7u3ddYc^kp;1W>^}+RNoq}E-JDA?4 z5k2@UCDN~Ozn3Y!k(PN2ezkY%H@LUGmqvWjx|FuBDFX`y4tP&4$~sV*$F8UcGa*{q z@}+4Gc8>ll(bUb~^}{^yPxw^U@BSSd=k=C)qPb*hpjyyJV$nALRKI=Ua};ZCSCIu~ zz0v>L?~o6by}s>KCG_n@&seQgUBTYe@BrVm>}PttkIsNn%P|ZiB+tljx|qUz`a&C7 zF}q=daT(Nkx>9@5>c&y;Nd|QQ>XYc{op(BtaAX z3g4!de=@5K3-(XcUREQzWS=ai{j~iHX4Rncm@yUEJ8)^sUrFuETGm@I_QgJWls}Vy zDUz)DG2F%GbG@i{$JZ#&oasCZWn8BC>@7=gzCuEb^M8ihN3GV;zrVq;3k`YzJt4j- zsY_%RF(>6A*=?`E&1=ZHxu{EMoD~l8qs+_ef%cX{8cNxs6X2%;|0dCur)}9%?WOA-CGxLp_xN(pgXqG zHbxVy8{@C&zVGF)9Y~V3g3Y;MrXe8?!aELI`ghXo4*A$N@gjR)`ZcOH{k~B{~y)6!7J!zagC*F zS+ml7ZJ#&ibU}yp)-U$BZQy1`(9s#R-gavh=x3wZJ2_+CN#}N*8%UR7?s-S7=O=I* zaGP*jaocb^aJzB)aPKhhg89Ne!TlHF7UP!k{n_TJFT>r1TYArBI@N>ev@9zA&Z@D+YpL^!8 zzx%p{6b=#A2_I9+TEELm5M~VDU99u2!k)qg;W@%eVV&@5VU6$#L*LEH1i3Hkf2f=9 zrtnS*@1XOObbd-;^Lo>U%*MA|N7^~xB#r~05YF|7b8bK1aZSg~&^5z6<|^no6*mKS z0q$blT-=qo>u?Kki*ZKpW#qN{or;@4SrZAn3um;S>1Ml2+N9q92FkqmxoRHjm~G;y zAjABlOcqy->w>Gr^~KfWhT%ryj>a8J$A%Q7;r;YG&S&7V%;~r@ag%Y=a5HhUNqYkB zWPd@XTc&rWUsbk+KRCK>XccbhMwO%=(?)z-<&7iViMa7?_-7DyHtt~ll;-%VEa$T_ z)8+Te%xQfc&I}`sW{5@pf>zgyT3uhm^%9#=7KPv5M!c1GC*jL+_eTB$k-xfCIPt32 znpXZ=(yh-tli7m*0{%-S*A~7jy58F=+|nP2@{z96wGnUOv8rrk2G=g~JK^^T>(J!a z5jFt#Vf~?`9f3QTKbrWlxRWZ6Z{eRBT~8sUs}1W@-EVr`YWRA`%1!Bm85&9B)l|V>vA56+USW^{)Sf9 zn<&qoduuCyTgml~lK9;v;g)Y-RNg!9?>FfI<9CyXBELp{Q~O5GVjIwx0N5_#^R)*XAD`T_4*j+|pb83GWkravR~NXP(KP zN%&;kw8)={Kbvwc!MEp`7x`C3{`IZGE&j&rE!o>z`FBLucb9~(EJ=5NNqAfNi{(8? zx`(rmW!JUgZzRmp9n9a{93OH(_W9O+c6)Ybb`R-F{r#=3-)(hG`doQQK6}p6{84$i zRCu>sKJsfKzgw&DVtl_`Z;N4nrqCap>z!-JjmnK7tSx_B6n8<=(q@NRowe}l`J27`@?gRYHdSq%#Zhq!c(wlrmer^HRi<+;C;Vt|nq`5t} zJa;d9QkD7-MAxfJ!q=3fTU!!dny+;^>q+-aZcFZk+?}Gk(eWkRu7mh{i93Khh@W@O z@%dQ3UA|L3^MQVkd|iG(RW@Jh4~?!zl!T8iNjJ76yfk0ya*hw%Fn>}j|I}936DV&Y zZfYxkM#(jLwJ9Dw)*}7fsJtuR-_Ku{UzlG^zEXc_bZ!1J;)~aJm4sXR718y5CBCIE zUayM6i{(F5a&75~;g6Jrm)4^g-`am7dY%oDzbW){Yg>gA-=q&CebA=d7Uj7_9<8Jt z@>k^ZB7H2}^jwiI?AqF~NO#4fZ%Y0A*6=#NtyTDr=Ii`!?sZ0f--q>8KJ{qfZ*Fz{ zZg`!42cQ0fBk@80|EYJ5!iRVZ^b>hA^1-hR{ls7;IHhcmotIr;SYRf_ zOBVQsQeLL>c{;z`(zxaJuIa~Hi2Ie!d#HRHIrM&jQVv%615{=Yl|NAD16BSKrTnH+ zeoHC8sn}@>nWnp3YiW4*HoVrtgW-10`WUr#bWrYE{g;a8|`m#KtH^%Qe;K3C~Kq4b9-W#ql=2jnJYMJHRr24J<`sqP5`IDp<`Ig?zRrr5kE@>RREJ)w&-;y< z)T)NvbeC?be|MdC7fr6Qa>`=%yukw9_p7?&V=CE3u)RB=@B^x|jd^8=OL@Bl(@9ek+yizr zbU(84-Q}Wrjiq<@DrA-SoZHXGT#V5v#*?}rdCs-N*%(z1!q_dMjS;o$tcDevD|Rc_ zSiTTDcRa3nbjdNg6n=S_fqwz+Vw~~Ol{g!tTga-XiHu#%AogNnt|ZhK{-q;u1@UB| ztI?`3(&$sjiURBH+`T9o9%bluD!jeF*)Q=w_J8&-`d5P>C=V)Fl~@_n1RaA;K|^pj zD-$OK%SoRMP7gjCoEe-OTolX+E)Nz4iwW)3l%tBZjA5?M>~&ik^a}a}hXjWP{eyu) zeK05(91IN(W3A(Gl{!Le9zPzHUFUD|-)5cU&Hfhu9qMx{HTsFa$N$u?^-ubz{CdB^ zKkYa9=cwlvztz9s|3-bc`bKyt3qnOqFaW{rJ@W(L! z{S(Z6KaP3t|IVEEPtoq5X0H2L%weCzy!CUKvp$0n#q-@P_a$0)w!6rEnKu3kBaB~l zm(kXjyLs*kb}RWBt^Rd(NVwWv%PtAubPL=K@Wr>7>wc5_Hsh8zvv0x!?oszg#+6@Y zwD&buSG?mBKFL198K3nzMt!S%d$eW^dzy6iU3^!62pX-wAL#3msUd!-Kgi;^V=XU~F(q z@JVrTz%xF;=)Ggli{C<--?`uO9r023IK20ydm6s`6E;gHM)bEZ(`GA2Pre(x2$dS$ z-=W>h?iJ`~EAslO)%!Dw{tu{B@PQl7NPmT`lk`bBjk9 zzK=TzZs_k$F>Y|D!wH;wu?^iC32KCXs%h5qv+mgZ0;Uu>$)S!K&alq)ea(PiK|d zXM@l3L}vzPlK$M_T=1gcB0}Z_b2z^|xEx$89Z4R)$S-o`=(uk~m7D#|eCt`_m$(Y_ z9Gc2BBK3fy$g^D9HgFw`Pg(nx2ohjr!1_ZtwaTTC+D@Ez4mz_!xM$Fly3_`>v`4R? z7p3$G`cTRt!6Aen8XQVU|DZo11B1cbX(+aGc)wUMA{fEbj0{GCcJCy7Jb{v}1~Hzr z7h3ry>S%QjRQHtX9z#ce$0hXy<>=~LU0lx*Ludbl@O%6{g#6V1lsefnRO=b4^$gW| z2FV-YR{Ml%p9$))3(~50LUqki*P$*K(Z=eU4~__qa8<#P!I7ZVxGXp>IL@_40zXN} z4Z#gAi=;1fmB{+7oEK?Xt0&3m8PfDKi(U96<@7hV@NCV`6Fy0K^d$BS8Tz2Lu9AM} zNszt>q&EUL`AtygIsY83`Dg!UT6v4#0zYr%Evb?|iuuy?Q-34&MgJnP+x>Q8clw=# zzv5Y|L*Ml(;k!Ln1%22ac!Rx)iT#KF2hZjM`ZD@t+qow|3!2`wZeAm%$^c!6#|0n+^_|e*_+HdxoU5(l)u6Amt7OM8!{5Ha^h2m1 z++O0`UO_&{vnthOun#>(JD0Kk6AQ?sFDw475a)Im=XMu|=FotrxLRq8-qIF5g3kpL zU03Oh9_pjKG)He~jvm2Rg0B#3nxm4Iak#ehgQq{akya@qg(ppTSn70igmH$YXO1?k z;IO%_W*ymFiDp;4Hb16bo~;_-r|_^H%Pe*CVfQjipoqmY`%+s)DDxWm8tj z@~M#JQz5yHNp9oVlwYIQH0e!9dK1_}H&7>&;eObbH&L=la)5>TZCc&rIWBolU^Cr9 z%4HlMlWYgFVTQ?u873QM7&gqKJhRDsjby$?GG8N^uaV5x$eyW^J<}k2rXG9dWoWmP z<8UmSS2#D@#&$!n{UP3T`ziA+jzR7Kc1{C3_7z-%r@L~4=(FRX>5&@gks9fd8tD=1 z*=tB?+Qe+&uB7aS{WFBVz8BcrvqIeW@qOsO4)KSASjVnT7EzrnqB<<126u?|0UUvS zJjxBlF8CNBqp_6w%2Mi!r8LeRCT&%Ny>yNnCY@E|&&77Cm*%R$YMM#O=lk>B2tNx8 zs;?}lDp^of(rf*s*AA6l>nOc;l=`3E(r!nn|7j;3*Hb#Khjd(C+U*Ewx1O@W4wH_{ zOUKnn#~msSHBuUCBr_?}uCw&iNG#eMR)XoNBTMwuNa?9gL2p*jS4vxDgT6suH#is& z48STj`=Em~R|oaEIoStY)aQ0ppW7A7cND$$=wLK`?oq)}Zj^Lfw_t2AmhfYOW884{ z#a*TKYNXxzsb5a3Urq*#f<>--@NHJ__fa36Rv(>%H_MgIW2fJYwPO9Z50+xFn`W~; z>6-h#G02(C|CoWSST9y4X(*R8R7e_Pl7_gXAuef1L_M1Eeua2HF5XXwThrp!wD>eF zK23{H)8dY#cp;^hPe;9#*~O_)dsCMlYKyemA|3E%!P8`d3_XO|ZE3YdUTxuJy`^RO zq-3!Lve?RG`J`mA1+v)6)FMe)Y)Q39S}js3i>*>El2waTs6{H&BC)8~854}bI<$7F zP`f15E?HT4Axb$F7JQWj9#l%y#56r9dRHpl4Zm)ZTKFD-md+EFO(s%8p@8Z&T zap}9b^j%ziUYaf;O_z|4OG?KjrQ@ol`x>yYfHI0C5oN6t53PkPbRi>6*QwK;Y#lGomqiQxfzRT83d5-L|<4aVtPlA<+x1p5qc0`?}Ig4XT9YHxeSGP=UK^(|>pJR^!{)VJ9C zWFPE%>su;C_pIoi72UI}-%ix8g!hD4bC(_6CMS@ut7**|&7 zdYxpQwLsWEdC7WSvYwZ$+q?K6M#)Up>m=)W$$DP0o|mlWCF^;~dKbxhUb3E-tmh@` zb&~Zu$$Fh+y-u>8m#o)G*4d$e!)E5q0!_XH$#)?64y5JFB;Vzd?+VFxOji+O%~hlxq=ca?nCi95TCJG;x;=`OzPBPmZy%F~kav^X*?j!cUq z+lwRnh$Fj6*1O5t=`W7#CW-GRiMRQX`xyr_JExC0vXA&LE&fZ3|I(86v}~I`lK7DG zYQ=fA;yn1Sg!9aX=_o!MC_c-H&pL|FI*HFZiO=fAXKC?Sckx+TeAZ3!ofdBm6mNAB zZ?%_XxAzPD0yjYN-C0~!FRn_fr|YSnuBUpszOp?IRZrJbwg;96wg)@<@QxJMJCcnD zvxkdpkA!TGqurCmD9qUa%8A}g!m z5ZMcd$f9Tm?{sX@yNx-h)nL|hk(0uA-)2i8ruL4D`U%N>LQPm4z?dtk8-L!QRDGZ`y`agHSaettP_zQCPntR(< zFe2WWmKo%ah)N0fyzY(O8bOQO&c|o+&1DuN@mDh1ehY6p%iaCVxL)fv(ylMLJ&do% z7*+4$?d@P>R7$v8b{}-#5$@m6WB-5YUuE?E2KOEJ1NRg63&wdLM=$(0ebVdh zAM`9$8jT;~nbAy}*1}P?&vu;~jGnYzl21kFO+&BQ9?1*c681-4fd+b*?~Kp5=b1si zms#Bj-;O?~FXQ;5qEf;gx(`7IAIX=9PcaVqImgH?`tWKr-L3A2?jH9`wAYjFS@%~o z(Ho2zC($R}{h@pd_*hg*xVLv-^!O-7RZog`Y@Uriy@rv5rS49*lDX(>=#MwK7tmz; z=ryfB>_Hzl%#V&r33mlQl%C*Yd=dFH`h1f6B40Z$M+@KNzRS0_pSoYszdz-kbALk< zzR7rOn*Ow>@6RagQU2&jlV;40&k@cQUL{;0Tr9jzc&BiM@P6Uyb1d&8!ga!DgjlP)|rQ6uao>@Dmk94u@QjuMU$juW1E&N=7JN{kntAv{|+ML1nJ zOE^b(sc^pVnkh5SKQFOBxJbA}c)RdU;d0@FzKAcTHy}EWJ)+dc!F@c z@H*k$!nML3GrsWoNvV`DFRT%E6ZRJN6Al(O2uBIW%$Rx6d8u*26NTf2X9&+0P7zKQ z&JxZMUOMCab7rLG3$GC_5H1of5#BDmQ@EU4U68t0_<(S=aE)-SaJ}#u;TGWw!k5m+ zOYIWw6&^55J7G+i5w;U{67~?*oqxfUndt$-p~4Zu(ZaF9Au%B?Sut7LVI0hV1IZk+@aJ=vg;n~6|!s)_U!a2fA!6Pc? z3$GC_5H1of5#BDmQ@C7sukZnIWaVn%8sS>udf_v|Ey5RsF9~-E_ku@O9x%*0VN942 zwi9*|_7K(y2MC8=c;R6~vm=C~g=2-s3r`ZBDx4skD4Z&s0UnmUKzOlmuJB6Xb;5>{ka z@S@2V=K2cjg~Nm+g+~jI6`mkGS$Mke%nL7?bzyF@aGG$YaJKLg;XL70!s~@M3U8T> z-pJi1yhC`maHa5m;e*15g^vl>2{&GH?gi)PHVdB@ZWrzp?h)=6zH68-7p8a(iG8iGuM{1lZ*pDvzTcfv z|9||!>Ep4CjrJc6?TyLnz3HDv`;KMvgbc%(a`p|3nIb}aC-aOT8QM%2PfLDu?5(^X z4Z}H^9}R1D-;aj`{!>H-XgqFc)jo{;XEO$Hc2^KI8(?xIyWGH zrI5L)oL?-oIjaNmHl{QnKUFwUXlp?S>k zuM%2|AC_AP4$EC9yizzj zA>WD7+37a7*y4iOk$*|#&x?HHLyNz(RlISgh0lrnVt(UQ3!fGFGj*qq{Nu-hU?ua}mT}B7m(C{IINA|!^KNWL4bNG*+odbFw{h%Nid5yA_Z;iUwayBN zO5p2w^2-Y;VqySx4-ero*1R%vEHTN5}o7zP}{( z?ZhpPj@y;CJTp(nb)>Yl0TJCYb6k05hK@N3E6be0F_~18OH!T84iDovPF9*A)4<*k z9%nzbU}mrjGIgL``%DkH=GZ*f_Etz-dOzp%Rpt{iGR&W*e@gFd5wgJr>6g+kv9sD#u3mrCc~bA%er()iRq+%r6%J>!uISwjfaNo|h8d}=%I z3)Oscm`*=-J3ZLLycsk4Prp&ld_ra;1{bo^dh4@r8`xyCDC-%ki$$Qyd%O{sZ zfgqK4NBHmh+x++Z?f(1p%s=pV_#gT^{m=Yr)^0uIe@id@JHN*N-aq0W4cZ6QK?ml( z^kwEtKjys*;EQ0mN@Ps%Z}i{CXtl|g`8TYu(0_k5xHPzo|HZmIn8(_(`8K0J_%3%g zPPI9*F=p#ti{Hq1@qq8GKKVSf3BOI*6MmiEeG+MlXUY+fgRhZ>gGe1DHzwiR&y#^E=myN~O;arjMPmY3cs8EXA7@5x-x$2I2-l4m4G6Ec%~ z>nzG2B*!Et5>9Uto;8K{OVURr*%>C;FPUk&Uy#fvph=P)WRm&h(57(be1flxiPVQV zlAV-q6f_}Ue1mJxKY)GUk$ApEuBEPBeCY=r38=+Aig%jks^ZfQekA6!$iduj{v8X&81ZAa*2vvrAO?Y7V+y`ykcGR z5!=!tcBP9|tSlZeq@twcMXsV^QFz3bwTQXIl~-J1N9>vw;geli#pH^~u~{ubPjo@W ziLnVS!bW0wj%yLpmyqTb_p#or-LpLmi#77GT0&5dQAiN$<@vy?oj*n7|vd^WAv!uL>&eCoP|Z{o%EU5oght`%O)#hAhz zjH&+fyvKaOPiH2Etu@}?AXu9c zJVNPc>56CgQqK#3&W_@&f;&FL8{aa%Pv60J;XC;rdlz5u@8-+-a=uuvAPp-!Djs95 z`KM#k6uRlFw_pO>fg z=LcVoo`y$f?YM)?!qzq9p})8Uf~Xs=7C{rndHExE$q$NTR?{t^1U?=WK{ zV0OWM;H}JW<3{kvL6B$``>~$d+avG6MhGN$FBjG_}_!K8eRDp z&quKl+6Udh>cBMTY@9Fe2iQ)!`TR$iu< zYi={7YqYASBlDr_Tqn&5>%sWTQLZ;DW~REn!L(qS8^-9(bY_;@`mP3MdfmbZnbl}3 z&SpsuVlERkiSA=}NcqQT;cEYSP{x-T>P_vjVi*m==CXsiHAX?3^DYYV9KYbXZtx2w zH69+nlNg?iQcaFL&-uIX$(Zj04G0;4&B;H}VYi&d445m>b2l(<^(^$=$;_AC%q-f= z46S;`t&T>zuJG5|+_@kY#F;&3t54HVz*bm~V9wh}X1skbxIK74_o`=>j@8R+UZkCs zF|&&KK$>Z3|BQ7L^EmlN!Q7nw=!kIbudPrqtG7VqY-XsnP>k7Wqix=eALGYzT@LNW zFcRzVqVn4Q0rMJ^*l3@UVvUr6rp}^yLXrg`7X1R640k7wWzaMbxqGQSYv&o zqMB3hka|4Ry)7u1hIgvqoLc75_huG-9qk#eG%uyy|^`2cX9&;ufKkO4q_KEk2iX{{u2G BoM`|6 literal 0 HcmV?d00001 diff --git a/apps/mobile/android/app/src/main/res/font/basel_book.otf b/apps/mobile/android/app/src/main/res/font/basel_book.otf new file mode 100644 index 0000000000000000000000000000000000000000..a29a6258ac08d30eaed8f4f9a4cf4e5b0079caef GIT binary patch literal 84524 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 bCVDp&?Yjx>QH8jLkV(nw>z5^-%b5QMMXG{j literal 0 HcmV?d00001 diff --git a/apps/mobile/android/app/src/main/res/font/basel_grotesk_book.otf b/apps/mobile/android/app/src/main/res/font/basel_grotesk_book.otf deleted file mode 100644 index 77dc33d7b2c733d7e8dbb7bf3aec7652a0253360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273636 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

T&+TF}4*b4_a!y(JT8BQ}l=OVp=`UTmU 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 diff --git a/apps/mobile/android/app/src/main/res/font/basel_grotesk_medium.otf b/apps/mobile/android/app/src/main/res/font/basel_grotesk_medium.otf deleted file mode 100644 index 344235fe1c3f55b8a14182aacc3b4e1b6215610e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275116 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 z 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ⅇFBYqjT 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≺f;Cv(}><>mCy@p?`XAepO(E92mibPw`aC|hyt7=-gaJz0_4 z3=+yPZ`jtl%OSB0H-;te=nY*ZzmOaNVLCScY?ZVI+)^)McmXSKJE`d&)pzm> z3Z7^=RzVlBdQ;?X)Ajh~wAeDsf(5#@K?An5GQlohZ7iyBYFU@KS(fA&I}AGZ+qJ|4 zr;_%M8nMpe9X9aC*5JD&{s946u-~xkd$?Vi`}vO4T7)JUTk-Nt@Oc!sR~A@n`Q-Tu zn?<|xEAt(ffgy*lBKCSj;{Lc*{hA}H)ePUkW<#z8#WyCZx9{WFg>gh4sl}aEfl7rnk0DHGK-s%2=)Bj1s6+TkF-#F2hbwkpI=BeVi>0- zNLz5@n1vfZ&cbwgv||>gvsqXLv#`p&RLnx6!!+!}rXj@jeuI%c=8oqq`HRg)j?Kno zHXGR;hH^K|RM#2VDpE#~jTdsWgM8!l@fac93;o6c*v-KS=>eoBYQ3qMY1T zZoAAX!ZwK}R32*`yOP3Xh%AO7ot8hAdrvEu^kkN;QV9wn89Ivltu$8mK}Y#q9VTmi z>~AHtoW@Ed<#OvA%cD$dTWf(ZY}d7NK*UOUEVCm$+bW{W?kzt-nj2yKpynt8iUFsT zPf``28SuGk2xHqzx2fuds#pau!BF3b!rRW4MF!|f>sWbg2!PjG#igt%3fN~E*a@C= zD~Z+R>InZq2bggW*eQ^~5Tc;LrmBx(RodL1Z%`<*i%S`#*0G_X*0F$Ivs4!4c2*QB zSF7}wQJwskr&bQHWTfF>V*BF6AslL_zPRF-`r_>(F#qvuF|1lh#G-*9up(B3hvW#T zBFy*1myq;9GZEk`PEY#)3~@VIK}W--6%K(B7&SD|(G&rdwxO24CaBl{HBl?Cf(SO< zO2?CNWEuWL{E*D!wHr@DmQQrVpnEnAy^9`dHb8+qO<@F`7` za7F`bRLhA0Q$JAtSGIBVlwVd&vmC#%<0a8~QG>qD%=VLg%{W!9uM>CQ+jsWFBd`12 zuTqHnw{BFm`?{eUhnvOym4~%$SK5mfdR>WBy>w>n&ZA~AaO~cLGmn_otqcEUgC&QX zKQnYbL_K%YczK>NX8rgP{YOpc9cT&MI(5r#uRR;L#iA5i&05HKYTLdeTg;>~9is~# zJ2GsTse13^t7r))V=JL1tBLj|(Q3)+=2#QR@=dGEe$t7TwSm55liH+Y{91XA9w1>mJQ)bCL=s$~XD3p6|L5JI2AfQm+aAgW7mCKQi?BU~}pS zUBZ;jA!ED(0)hsa#hZgitUof(Liu1_%@vos5y3?Go9FLZ#LI^#?-{+tEIy{S?;E>p z42az8wPnrPO)JgI=B4`UPEFi8eYn@SX;UYJnrHuv;piLk$MrwRC|uMBUR}>3FYtjb z3i3Y?tG0@;(^sqkM7?zX2epPKgUAXe_;f2;Ue`w#TmgPQJQt@Lq4l-Av15e&rrax9+cR}Cffo{X{sHoju zT|KAI4x4Tch})`Pvm`8(@o!1SWisxJn$){SJg<-iSG1RMdE*-zca6m5oT1zG@~@ut z=&pKXmkuywTp?ZbyXJ3Su*bYe|A5BnQuU8W9Olr15%b54^rBs^kPPfSyUFSlQu(%e z|07c7k(T(%YGc~9D}Ov~aiwzQmaVH*{k3(PCB?;W)b7NDoqG-@>>Sa*-zfk7V8%q! z0v9A&z?k`$8lLs+k8@2XPtA*-Z$jzB#BJM3dTBGuB)|< zCXk zn$YSKCu!*;CT47ZL3=|IgL*)`*(u!oQL@=UO-i0*WFexG1;?+u9iBpxnWK=z7yEgq zBU}rTIDFy4X}IDU#O@9k5l)Y|h+s}}&4!Q&c~%5z6QQTQA~cIVebOSh zy19`e>)rCoX~qMh>OJ$z<)f;p>Z%HXGq4xxy6Rx{X7x3V3NGa~!wnmO!?K^XM_qI- z#a(K+41yP~h48#}RbNQoK;Kl~LqA0S2dCm(xx8Ent|7ORJHg%KUUBbT`?!v99S@IN zPh72ew0XEZZg~pi8Ifmlo*8+T=UJ6!U!Hhg#cO#3Uy!fIw}6;VCw?YBkH5_S!M_&r z2^OK4P+h1m_zEk94Z>DozwktO=caSZ>sHjQv|A;&>TWIFdb{;^8{!t?Hrs8k+d{Wr z+@joexSeu4?{?Kq&a2ML=Pj7GSl-fk%jK<@w|3tCdHwS)$-6c0(Yz1xzR3ID;Atpf zsA_0rXk+MX2rx`D%rwk5tTaR!4jQf)p67GP$LA}RuWY`W`Re9tl&?*`&iQ)f>zgky z-%t4#=3AXFHs8^FXYyUh_b}h9eAHd-u5;(zJ>1KlJ?rYs+ z-4op}x?gd>CV2#V%=TE| zvBYDA$6AkQkKG=L9;ZF7d8B$g^T_d#JwAvUF|Sxi^cKsBHO0naJF$o8D-QT}AbwB4 zUa(uQa~OgZKDVUsxnTfHj!Si3up6oSPi(shbUXJyE7}TW*XwFW4T(JIb?kV|-6zNT z)mv;PC8BhsU~tiUw5EyHEn0(ZYajO@rZJX`Al==mv6Fgvwe2{#x=;HfL<2rnu_=O) zoq@9RPv;TpKRG|WXYgMCAS(DRAL4yLRT7r$*lq8{>CwShpwAvSU@ka@bV+ zk?YWJXa}?K>2UP|j|0dY9B^iQ_k1&_6My@_rPIHAUH3gwKHOY4yiNbcULlaUnr(hF zM>lWff~65&nRLx77kAT2g)e^ZjC`L7cL8P&2=xUetqVnv>$N$sm_= zX+I$L#L)w>7cLwe(z}P>koL^i>`9kqJ>oB&PDr?WH=%#$wmkuUSG z^=fn-+$zlcdYW!?_}Zv#rY&ox2aO8~84FL*G{1E=sN-xMmGra_?hCN{qTuT=`^MgS zQbdj*W^06w;9VDH>lltnXeOklz!H>5J8SUtQM#d1Cr|8Uni3kmXo^MnTOkX(goOa} zX^k*V4Vp))r4%5xVy~-c7P{TgM{FwmjqMMN?w(KjsbK{P62TW)8 z4DYbiLh`TEy`Nh5I`uHo3RrImG^EPvR@=K<;u_!V^J;xzh+1t8GmEo-$SOlizHGCwLytXqH zG9RYowVf$>b!19j!<|ZA9hnN5PY>Q$sRk5i;FkIeC+TFNwXu#yfO{0dkp*&NxY7Qu zp~Fdj9}OLjj{bLs4g>xEJ41(o(U5Tb*3jWWzrQhbXw0}99siqU;0@jI_8o)knQ+in z8msw%q$}(US#YAp5`Dq{!G6KS%x?WjR2mK9pwp>h=Zp+t&;}u6(G9 z76%6?6uRI|GOj1?j@<#iO{m}6n6Xz(#PBE+w&#by=zTS;hG(IUmXKCkLOPK8Z*HC22}^P{9w2?vvt`XB7l+0UI6~7cc_V4zE=<%XeTYk2S9uMiu$YP5q>dQBS&Fv{-x6g-}WREr*EvcFhXj zVy00vS2sC!)}a$#qz|2M95!;oxhOF@I=|zh*EkQlZAZd0N*JKze?7YX6 z`a*65BE(LS63)O_j86U{V=h{Rtg3&IYs{(pH%b{0+x$`w<4YZlPvV?SfR|bO?Bblz z(D*`}^8pj*9LB^sp|Jsgt==EX>KyWJaM`XUZ$o|r6>w@i_8kR{$DRI%FpN4c%#wq^ zO+G**xjszydJMiS42cFx6InIbIxv) zaQj5;zRebamTM-Jk^JDf-Ne);;m9PHV&AFc zJ+UW}b`R;=Wz?{)79nJyB&2pdazQtBPyDO|lYJd_E$Hm91PeU_1Ko^HuUj)WED~s< z{d9BJ&R-V|T>)CzIC<(X%cfg!g3@32%albyfnJQ1n+;ufgHto^g(P4VP>|+@b9H?A zKl)U%j_1DXcFE8)#9_%&XjDfM{O5(j*sbu@(XHd$mW*ogZN$+f3nT+ny3C? z9TK_g7j5`?Z{*J8tlp?puV}xRkrtt2h~1vDkWIq5(vUc(8xJisU-D~(0vCbX}fMp$9$r4S5=7Xvf1*gMYJnz%xH5F*ppbo3gt z*@Gs-XpcbD4Fk!hi@b1%i(4NV8@YVJf>mY#w*O#-k6GmuU=%Y*7|WZ5N|K>3Z|{k< zyZ}KSyA+R^;^2BJq<98Gif8AMV_!(|C?+bQcG!g%zWt(-f-cTasq@onVNop{ z^(x!Cpd@%^9+{V4E9SdEWId@mP);I+76xH@=YyZ6e0tgq{xjvpIXIvp?AGzx@X^6p zaX2^=6vA%bHR+O->nT^koI-fST%P6%QMrgM4P%S74f3u0g*Qg`)(@|GWX20;uM4#da^(iT;Gu&cE zQ-#~BPi~DVyldmG^#@HC_6}{2CA{Z)Sg4;`>!z?@0{%+fNMYK#lWB^eKFMnZ`NR!g z0Efv$pxCVy1_cwnYzY#Mjf@_&+$`LB$QHaC=|!@UIm*NG%Hea6IaDG=Iyu81|ZlFbw72iZw z#krBtc9Zl98-mYO83ZOcoFU-2ZUE5=%s!sbxoNAu2XAAUDoup*yY*=`Ng0!1H->8X zX8T~^QY0p|t%e4Mmi&dKsgx=h2cZ+X4w^7{A^-r(Q7v3y7mpBLi1BPJ39b7j{`UL9 zqrX}V9;_ds6E4gTp1EL(NuYyCVPU#mcXbc2IhP6I9TJ$+FT3qi!KPXlsuH{)gsE>z zeAuS9j!WDAm|9z2Q=i;?#3z$N7%moiJNM%Ub!;=BUxWI-hlG%mCzF$tk6t>Gd@4C9 zSuMQ5k%M|4$uB=)QhLF{Z*oy%mP7cYZ!|W9~-2` zS`c52x9|yv!*-M4yZ%_<4U?c|o~pFMv7Wq8bzwG1$P(1(ruSh%>z8^&$>T+pa3Rb> zJ%e;q8}&edPTWwO;JLzyvS7S%s7J$=J-fGV(N|#SnX8F92a8D|jd>5$B%gk`+9K#^ z@#UEfNkx-k5woBmL_@ql0J+lQ%R#*0p#(mr1m+3JzQ`7`51z&%{W}wYvNQ|O_C-F*JRBZl@_qN;BB-@quHq0iR&)S9;7>sIL0GZsd&|S z%`BCsS&MdERfbUmCXP{=(Kh_qY{<>x3#h8ATpRap?yYLnv~gE&RlBC0aqZc*ac^(c z;PxHbd8-0CcWCde3hv5c=XLGe)?2mQkzcJ6fFpZZ8sN{+rW4l38<%Jr;ry{cSqDc1+e zHBGr@D%bbQ^ZM#uDA$V0^#|qJM7g$8uHBWZ-{_H}N2>jm>v-il zRk_Ymt_zgwQsuf@xo%XhJC$o3aH~OJeei$km-V(*>AnBw?ldZ$O0U5Df8v)zAA75+ zs_LkksM@GH1AbSO-$q?P?XPXcwNjq-+>ZqsS+cxa70)cES6Zho=VkvbztsL)!B?dR zBGnC2RC*v&-B6EkO^Fj#m2nPI59PO0bywzPfGQC4a*irowN$lAwNABJbzF5CGi$Hy zHD*R$+Y`sVM*YNgOPyg$$K3n7JGG{PEdn_|T{Y^}ws)UBe;)Vwy2``{`cLSCcyI+usFtpE#vF>|MuDT_P@&s+&r_rvOT~^#oWT2XLBe6Z!*yT z8MZ$^&8Gjnd}Ty`oQ3~+zOPc+R~=uy1bnY;hcRDY*`}}(`QFHFaBx1Z`0e}pv9mh|Lo6}^(EcGD9Hv)PcUknb2b}kFh9Rc_hl{4@sCuX z%m4j+`ldHDwKuc*-(-A~K&&vZjzb&YtJJlZv$v{UYCrW*^(ggt^JKeN>&SzO25bex!b(eyjeM##Q5?DWa*W`9ae_(@fJw(^1n~#P1g?Djx@pP%|(#B=5%M6!QE^#jBU2=3qbS-oNy4AYPy1lwYU9#@H?uIT! z_dxfD?q7NzeO1nlE5%jjYI60sHk>aP$OUtAxW(LRZZo%+JI~$VQn@rPi~Gw}<*Ije zbMtI)Z*8tZ**I?Ha)2D$~f1-b>h&2pRP zw$g2_+eWuPux_Ysdx4ceW!tm=t*b_rjdk!FtcpL~sqyUk+4HBE|1)A=MecdF%f(DcMXa3aB4o zbpG9)owj_M@n6q?ynoX(|2ft^!BA6Gz(!RjgdzwMf*HYr;EhlWp*TVbgpvrQ5quEJ zAe2L>f>0HqIzml^9}sFI)Iq3+P#>WILPLZm2u%^1Av8y5fzT46H9}j2b_neeenjYi z&=H{@LVtt-2m=uYAq++sWm~TrgD@5$0AUH{^pwPDESl2j+*RwFy`5}lGXYtg%&+{S~UYJ$uR7@{_`hB z;WI%Kih~|lFprub?^WAPJh|h^@DEB-s~VtBTOhcpj2IK12n7)eA$TE}@V*FwgkVOn zAb2AbLnw|=0-+>AX#^jHG6>}m$|G+Dgh~jN5vt%_RfOsYH4%P5sEtqup&mkg1O`b% z{5C;oiqH(9IYJABmI$p8+9I?=XpitCLI;G72%S(zXN0Z@-4J>p^hD@|&>O)Qp)W!| zr0tL3hx-Be9f&XpVKBlHgrx|}5SAl89)V$o17^~JnRH+#9hgZ6X3~Kf4w&J984j4? zfEf;$;eZ(qnBjmK4w&J984j4?fEf;$;eeTRU?v@yNe5=qff){%;eZ(qnBjmK4w&J9 z84j4?fEf;$;eZ(qnBjmK4w&J984l2Kzzhe>aKH=)%y7UA2h4E53z^aE#^u|Hb~@>}2%jr9yS=*H_B@tFPvvbG^)HfIDXX zGtlm5pxw_vyPpArZ&V=&p$Ib(W+8;xQdK`8%t4roFdtzh-bdi~OL#ODtZc_qBdq3L z(DMe^2mJ*eNVaVk_GUY5cWei+@Ba<^wsY78rhy0a4txD~h{rAtJEl~`JjUA#2$|rF zy#W{NHQrxADYsD0KjJ(&cYZ7vYDdY=H+WX|jBE$}>Cef7`s@v5_cn?z8T)+$C|-j{ zglClY7vNIfv$*g5;k%*KV^u5U0-7{BFk-N{h)92BB&S_|xhX@U{2-rLXL?q}i=%{fVW7IGXAqEkV zFo*<@C?X(njISV95e*V!h+`aw5H!RnF~lf7;)57MkPyN!i0B|962xch`(3}iPxtAj zLF3K6f8Db``&WC{Yu96~RcqH?Rj1(<)#gJ>Uufe3B{JV>60~t{ypWk>>MN9@tTidp z`W$KT_Xf+S;YSS*BK5bsEG_Y7BsZF7{%NbH8h)jCu|!diGUH6G_ZPQE69w26eR7yt z;HJ1yO?Waq7jbM;SR@0Z7;!wy`7pd&h}-Z{;p%Ve#uAWu^OpHG^<~SD=sqen^%S32 zYJvaz(!aK1sGZixK3+Hc&`^4F5~BU)>s z1nRN2;a72aTGY|ycJU4~JIlz8oJwvw+nF74{iFr$pdbXmlC6e{A}CzkB;(!NU8d<9+c6`e`%Ta(~93D!p6cExKJtuiKca zap|DEnmqC@bYErp_D}YIJhmiR4<%I5rU#g*dYd{XnxY^63W>0)5Cb~mI}r4`o*sCo zH7Q^*3%o-g)iVAYRTuR-B}lm>WoR)*&}-Cd@BlO)$B(4m?`Y3I(Z1I2`jN{f-UeUA zHMtShJBL12O>JysQaX!@46`?g_LN7x6Qx(kyA97Z{G#DuaR>5}m^MoMs^NK3?P}_g zLd~J-KSrtHzBOE>^rT(%)gH>c4n1afL8oY`kv06ra@DWAz;*HcVVpuwiFY=&Y|BF> zo@jPmHg$k^AAgD;aK;|kAvgWO+(Hr|I` z?Vb7^o^9`?pF+-_KW8{ZVo|)lHA%?k(g*LNddc%67GFk^pDUQ+lb^N{%%ZdWe zHh;$`v?4i7;B0y>cZ5On{F=2&t7RU<7rRt(%!b=3vuLr#dUipmn}Ma;Q9F1_t-sCg|ZHy>&q3+_IE zJU9LFLAcrG?M%;olXExEL)+zw_o6tr_-(FP5f8etG^E&ogg~})^#@UiaaJT9M#f1( z>_UZy`4wU{M&X^rW*oPZ^J7Rx^kxgvn1Gg6)EbQ`@IAN(5Aq>a)XwiQ#&1%|-?H2b z^0SpZwlj}~q!6vF1$P$4tfEKj(ljCZ&2rwToY8LRea%s{TDo0ulJ$a(j#wI^L$(-2 z3s2zf>-|O^v{8H?W&boh*sT7Acgd#lo1Co7Mx|S$F`1mr0_YHP9>m>+zG7wOU5P$_ zpVnY5rL`Y#lkY+e=yA*^BS#s@Ux}#3VjtYjt>w|=*ObzQb{lP6>~ilh+n7N|X3%>( ztygHj9Z)njse>}?%>?TxtH?*=SSFGU@z>GJaZxE zV$P*}e>OYyWt{hOuHan7xtbG=-17|$d-a5S%snAn_6?q`GTdgjP3}%Z?svO=a^G_w z8g-8bAU94Bn+yEy+b`xSsc_1Lg~{E_)I)C>CxpH|FTzX$&tgn7e{@6mO4 zVV&><;do&i;W5JNh3$pc82XNuC&+XC2UrMjE&opPS4{tpx;`tIU2nOeA0nS2cI~ce zI1OAQyviTPwf%hi=h|lEbo=T?iV79jA5~;It2sMy)^hgbtmhoaIh6Ax z&QloJ;DQWNGV_u16;N5lD9$mQ<2WaBPT`zE+%q`O_R}glS9GuFRaM>0?HAtwX`F|0ub?cm2|tWmIj1Q6TCNvX-dOob z?&8X&mCJ}*?A{;WuPE|gRTOV^k$-Wzmias$_tDcW+!qeMuUt=_n>dTztwr}cio$ml z`CI(GaefC5?KaAR0{;}~wcy76TxbW&sgiOR%AH}|TTl2v+@ZLIdvi~U?@wvrZ}Bbsj6?XJ-HQLHiY?hO_>be97`sz&XOPdVxZLwv z)aSYu{)A_5&fc26vxR$ie1C6|{{uzwRu=iUmcEeR!^C?m`$YEHR@`;?ZQwkdySXVm zqJZqSmTq=uc6W9k@rvE|THITCi^DDc$4%*SrLBY$KbMZ4mdnR(P3(4V;a>>vmFsRH zxq{m-*F85lH!L>-zt-GSWB)T-2|uSO-T86&1+B!he8x$mhND}X0xl= zC%N;9w;*@D^;2#U?G(GYCEVZBbYJjq=H5q~<+(?4YjO`YbJxcA&lUN2w3~NT)%gVH;oOR%@HY7_`MP`u_INwI+b2IDKZJC} z?(q12WRd^rMe)um@-I%;GN1FJKFp79;f`%_KY{!vb53jFUQu*Erzrf|B7aMFW1Qc@ zL%WrI@{99Jkt4KYR#qQSF-O<9I@J4wU%Zpa|b_Dcgd{@MemQxP?E6{nNT;`wO#Toan?&-%u zKiR#>uV(Ih@%_r?{wAji@$!3l7X15ZT}x->XyzVhasN?tUlni}139vv^U=VkCS*kVaUajkSx}Ilo+zNZw z^yit6TczvK3az!6;Rwa=C!axjNBCcY?QXJE?z$+Zl>7Rd*%PAa(hHMe^oxcg)@Xx6#8|=pQF0W zk2>wi(G%I140pB@T5SD}wmGVjlo&-u#vT*W_E zIiIKNQObFn;%t}CNTnSqpOKM|;-9SRe^C4r75Xj3yiwN+mH&;3^H1{cZ~m;%wKChB zC)ef^?zZca5eogaT5_$Wa!(1LQU1(gk!rW%Y*Sj5(EXRi3742pi2Ca$i{o$7b8S}E z`yIlz(VRix&D>WjPDZt8r|X*VGjdQHhUa342(_6_@2^$Nc2P{_ zoKv1PirK;P^gR`Nj6#nxfA?MG&{c7|s*YD#ZmeE5yvpLcc^2QzQv6w#r<<+#UsvcH z%h}CV&Z2Wt!3*vx#hn_yq;C9 z=T_;utx9`~;@l#ig~IPCZCd_m`P{8k8C_Q@Rj|+y%?b5V%)WX`FU9OzlH$1oO6tH~ zO0_{geMEJ=<#UYk(d?A(t+aLW*X)$LPi1H$pSHqw7T+y5fAwylO%#^X4LTmGC3#^1?o6Ghp)ks+toKA|SIVQ&(Q}q2|GVV0aD>&zHUdwqS z=R(##jb#RFGND%xaxK2T;cq$**D&8|-OycllC@7mwOZf>yLMaECSNpkyX4>2-{F_| z|MY+Kullz_2&JKnwTYFXCbSP7!r*Wm>k~(Z<-|{gQQ^yBOt?5)9%hEQVPRN|Z@0!2 zRjg=?QgsYnLv835dW56G(V=%ZCe(+%pHOY zu-!LoWu|xk36}EhE`fD;lG)t~dMwK~5L8)uyBZ7nTE1xYz!Ksptmb=RF@Fr!@dL4p zAA(i<30TAr#~S`5tY=1G34bzH@c)1X{ApOf|09;~|3trk0gLyqV99uyiq1*)>1lAyw(xUd2tqtv44c}D4MYY^@r!70un!Sm03}4-9U4L4%2W>hS-ys~m zXxm|g52sb@Y1h+e^Ure}Pph6o*m>?tg#0rzwj|hrsXbW=ZR%*7B#)a%?+1^OKElQ%EB#B>m8JTDR;-jEszT7PywY| zI}|9l>!+aF6T+}CJe&w${9PCkMuwBa=S9VVIzGZ2zGLk86)p3mdy21#&o~>wUUa{M z?taf#gAUB=Z^7PXD@Rwp9=u8`z2^RhwtK_9N&DHlyk6?{-tJxZ7h0*o2RDfM{xVxF z$yj}YQGy!|EmXOapoAJX5=!XmPW9b<4|f*S(A#~{sKJeb9tOJe{a}BR`-&goN4Sap zWPh6bn!m_j;->ho`LDU@(8j;I8PLa6cR8z;uXR_jGtN!!O6`m@+pq8|+|_=iU+Ly( zf1J766K5WDP^KMl96R9rm{mp(vPVu{d*rmy9yzv;Ps0C@H0Ro0I^pZ2C}~Wwf)ut} zPL5cf9e4uNV|)KN?fsLd)}P1r+xGrB1uh%oPDgG|qVH|*pRsV$e7MZ^{+X%oC68+F zpU1WL&pPe>^Oo)X<4bJsA6kyRe`qcC{_$OH?;l^s^St)#u~C7mW@WSee5`C4!jj?p z?CgGDxSw^{KMSkFFNv8%4vu22+LyzZsnM7)hWHnUi^0po<@n4DGr67{=7NhQBT3^I zc~*%d<8G%_?(lc;#b=3M;>wV7NGg+vlmm()&2mZG;My6TvH~s{l3-c<bPL_cr3cz@fTNGX|LAZuKD|S4e2xkIc+!9{D1Kfd3<*Q1 z&CoCuv}dQFj0OF+s4Y8566e&T~#B1RyCO-$d*Dfj6TP#-%^f%Uk>w=y|K(O6Ycv)imSO zD}=u4UnO*>-%03hzZ?HIJu7w?yWYZouSct34BH27eCR(U^e_G|)XfLRGR9=vzb7CC zP43#4$~Is-BuPi)ZYQuFS=$j=I{+NPk#=81ns$^l?I>y55gz&qK4UpLN}6Vnrc=r5 zY7YB~Hs6)NQQzVjCQVBjlNR!nMI0R&l@=3v2S=&<2}eh`?s??ai*6nG60)sUvaMFK zt=2{>S1T!1D=Afrl&Z$3y>Abmh6JkhZ z)`|TT?srw9xVGx2cA~gWl2WyzyY_yA-{3m<-}~P~kJeAsezV`~YSd5V>Zdm9p=!T_ zcaj?QP`P@jje4T9D7Tv^x0@)pTgZnzYg3H}doW_OaTPXxq5&EAWktVbqTC}zxkrjZ zb4b81x>`w#?vfT=!dJsscZ6g{7mZO~lB2sMN0)GAxROwl9F_Ep<7`bnc*c`k>6H>< zc;ZBd#m>Y>6lPd_<>#W2?pPrQ9Pf3gV)`8p~Q*(sURv9R^K-!}g);OCH8uK^mf$ zKI5g&cGq1#&)ke8-L@*AZ`re#vpDC=#F0{bSy_eiy6=L#ppaG z(s@{M$5ARSEtO7LCe5cznopVdHX*((N2mNIJLVbpCdIu;bfH@)lkspbbj#bw**H0% zVct%!8$XwepOffJcM@|M$LGY`K|0Jp=`aJO!wf`+d4@V0&)10OYsB+4;`ti!e2w&( zD(N$WrO(u(&%8m~?dCWR&E`$6O}DW<5p0(T{wkV0-{A*)2vorcnf5!T5V0X_tao@xDVEj7D9}S`%yEazswEsQ_-M$N`tDB22~}w)=P5jXvwwql4~bw{OK;~cD%-)Hj;5&CF8nC z#^oj5j+b=nDjn=t$+)~^T#aPh(UMR@C836fOvt#7l2b#`Xme-@CZ|p)l2bz^r#gi0 ztfQ}#w91B_p{MH?`h-4c#ik#$ljLfrF*hgupp(YjBQ)k7f#y4mQG0k8&X{{*IMEH0 zjO!dmhLQN698PwFG!`ErsaGTE)=T4ZM&oiSEDDRPgM@b}OdozWPbgEmVQ&!eZ` zfwp4fw+~Cv*iEw8&U8&<-w623tUxBiD>jOih#N}94Q1kngt(zx+)yrVNX8?Y(SDg| zzg)DR6t!kVtr^j2Ms%7Hon}NGDbYe&J)en3E7Ob9k@Ti4UDOvD^+hJ|W1`SHMP7a3rM+dO`J|<>1!-(0(tOg=*n%{+67@(*8e2*|l2MOTN@J^3k7U&&W$KYK z^++Nfbw-2{XouD>W$Krt`Xwt3FKY7)<-WLCyPCwUl4g;XOiW8AR!JsSNhVfFCRV|} zeHjZ(CZ;75t0WVvBonJ76RRW>t0WVHWMY+MVwGfKm1JUCGBGWgn3haTOD0xHCZ;75 zt0WWKNhY>y*5~$~osmq;NG3+QOogbRQdE#_rqP&8>=09d$;2wj#I$5$Ml!K7)^SWG zc91koOB$9Hz0s9P4wg#}mP-znOAeMx4wg#}=0sBo(Nsb-WxK(=#YkncFX8sPcNl|A z_O+F~Yb$xzR`RY~@~&L+u3Yl2T#~L_lCG^JT~d-RDH)fNj7v$zRZGTIOU6}8#^ojB zI*N*GB;)duah)XNI*G2^OU9K;#+6CNm5b67l5ypdan+J>9VO#BNygI3w!9Tod)qmd z*%hvBY{{s_E7al@8e8mrvIqLTjV+aG_pI7It9H+--E(U9yxP4=?VeM+w^6&dQMviJwI`Mj)cs(y(uM@AcPXUM7=S>BTzk~QYh`)oR ze2MtGRQz2g{!U2BCnV*M5Px@+&XX5^*NMN)E^smRw|AI?bTEk)qBcrR^Lk zy6hn?&xp%2;_{3rG9!x2h$7pHB72A;JB!ylOWWx!itH?o?<|h*EN!QUD6)qrvWMs| zBl^pT{xahAjC7kG;`oU2YDIaqqCDuXi1JK_X)iiEMs$`FowXO8br79(5S`VF&N8C2 zBSmK!(OGBlcSf{zjA*NaXsfL_yRBc~7q~v+?~bCXdQnwIBVAXGbX_&l^_1>$v_`tF z(ml{T&^_4Khj*lMy(8ItFgv+O_ee_jNNIFSOW#OqbZev0ty=mR_LC9={Qj*`A`lr)Mq&`$eiquYqXY7M467bq!u_ifS?66)`AwSH23 zpA?s;)cR?)drIw?RtuJ^1<{NmHl<7Q}Yk9&^^f(j_6*7t!H3j0Z4q5Y)S*nZN! z)b^A1XV`wyexdCr?Kj$f(xJ2MCmqJc&yDtz?#jE%Am+SJbN|A8_NDOLHSQ+3=X>ry z;FVv%7r%9XL+&fNr)Y96v4|Of?A%mGUKb`lU(Y(=2VGevgoVnQD z;~v1~c@2EEp83z6Zm;_Qd7MSYc4yvtNSsTwgLO9~&vCp_eICj2Wyb%@m`DF6bLDrq z?=!FeQ};{vYsQE_!Fg}H4}BSP;vMOmzW(?)muTQ<;mumihKO zdDmI)9(Iqr=iCN*_I0<98TJJ8>Ycp39}JCiiFVEIf%H4x{XLTGTxL)%K`LFv{QWKN zJMIVWNA73L^gfSd_%BAKKRf<*nz?zKkMHkKh;xbd+pcr{kd(Gt@_9(TiAXlvD|w+? z!am6>kU>xIHG8Amh9&uath7hMJ{RW_?eX0cNj{8u)wANAn`a5qXo_jx0OCxM?F|7e={(et4Wqv^)6Gj0Kc)sug;dtRB;Z)&F;q1wmT{Jm8UwFN6fpC#z2Voas-DT6pPs#KV4iF9z4i}CT zo-RB~c%E>yaO_lj$^_wL;WXhD!a2fgg*OTp3Kt8PPKPEl%Y^p}R|r=LR|_8(J}rDf zxL&wv`q!pR$ZQqv5bhH06&?_NWLOb|Nnuu4J$?FsV=FodYlS_9^}>O|p~91drwGpw zo(&GH7$qDd94DM8oFbedoF$wmyiRyCIH=-Q;hn;}h4%^{5UvzHEPPD(gz#B#aK$>| z2H|GmHsMa;Zs9)Rd%}+mD@(!SD$~NeutwNf*j?C5*iSfEI7~PK98!6z@J!)3!t;d} z2*(R238xBY3TK1ISI!q+FI*s8BwQlAM|hubx$q(3BjC`=HNv&R=Y%f_Hww21w+mkv z?h)<>PpJIBFzbW~VTG`bu!FFRuuj-VIAHqpV+Ul12!{(t3QrfFB|J|!S~ylXK{y#a zHakstg>a7WTH%etg~G+crNU*x`@w(K6QF-oN%IWig1Q- zmT;c%I^oU2TZMPdKyKvj7Tzm-K)6!)u<$YA6T)YO>x3I-T|Diw+-Bi6;ZEUh;XdJe z!jBE}rNXq(X50g(>7ai*_b9&6T7G{U*JCMQCH!m{)#|gM?8o$F!vB?+jqOS7dxd?c zXdi!-JAyC#M^c;rA0FA;9IAaha|+hypAGGe$?Lu8uSffmWtKvQk(Hc%1;bWEXzyg6 zIV3}~b@BA%XUFbJ``NII(tb9qRoc&ny_EK|VTIEE)tJARcJ7_OTX?7NR^iRU>xA=! zvxGB*Q-oO3xjy-8g>!^g2+el2Pu^yg`s61F#|q6Fu223vp;>DllRrmzrtnnZ2;nf{ zU|~ODFJX6~m83pzC8^I_N$T?xh2w-{grkJ^C9pn!hVT^O>0sadNa1kd5a9q}A7P!) z>=OItI|%LTf8RV-imqQiFH8$d4Raq0-xKZ=?iONsKgL3ET z`YfUK!l0b>!l0b>!l0b>!l2v$;b3rZuAi`%u)DCc(0XBTE-$oR7@V_S7@V~h9-Ir{ zaoLZA2ZVctyM#N0TZNm1>xC~Eii2b^&3vuH=dZ;|rTT2xO=&+H9<8*0J${avqIvN= z#J$YVtYW5XEwdsUm@V4DT*Q9nXa-=>Bl(e=uD((->!6$hFQ6P%<;ur9xF>}1b{o#q|YuVNjcYa0)%d5J5l zSRNk_6Z_$!*!K{&I6m%C+|r79I&LJUtqv&UJJXd`Ox7_|ekB#>bBrU_xT08Rv(v+= z9A_&|s2I#15uVe2>cNVBE>zTkcJC{?=xhqjb8l~jgk|32nz71Ue1=BpGmKA}{mp#V zyO4Q3v%Q($8ds9pz(Ma9rM=&k^1nWIJkrd6p)1SW7a#XD3z_K>nVTDr>zaj)=0B9D z79Ej9E|hb)OJ>e#cAVKPb!V5#3~X^kTp#C_6j1DHes;BZld&#IEqo@~+s0x95J?4gFcZ z8~uK{FZ%;>H~IJE{=wUhGW)PzF^Ia%IiJ)bceOQ{_vHfUTjfsdI{cPDlEGT<6qF_(X3a=Ht`V>}TZD9oQes zrygQ|EuUIW3xssu9q+&E@AlvG_xSHKGXKEe>;K)~=YQhY_+R?RS51)2FDzgB@J%pUCo&@ZJ>&PuT5s|V{uS#=#_y}b>~J;zk2N>U3)e83 zW78kL%ae^#%}O?bz3vUTukmF(@Ws`qw$V1xw<)XPzcIRBNZi7eQUp@)J<_l*u|sM@ z3c5}0C|nhKJq69CUf_&qSCo*tnfo=IxQ+2vasL1(Zlj;2WpqkKQa?(2Huv*6o6?5V z`KjUfOySwOiqnVGh}2m88BLCp4t10>GBlMvvD{TAmbZSCuWlA|zN<*g zZ|x{w*eu>?mr0C1_$Wu$D0=Q-mre|Bd6bWA7ANmgiG1^;oROg^m$E%BS+=M6NPN^R ze4Q&VTi0|XwloV}=@Mlt3r7O3D9U+}D=S+R9f@VlLT0(rvRQT{u5ac)&XtsnD;t-X z+RXP%7s}2|jBe&P6wUM0W{oWBgYXJ(TS~Yz#h|mTlpCC`vwM-NHBV!V0fNd{5UJ zFRU@fV}&unU&4FL*Zd@GF>Hm_RQ^BkQh$@#OtAW{W9Sr);9mld3|+!0;UB`OtadmZ zI|x>%gr~_JDP6XaFZH|t=;}nS%6Q^NY_6B_efnO$3*X20*!%f{{{Uakm-EGX1#wv0 zQT8k=G``M%6;Agv{N;Y8{|5fpN|!x>{}uj9Kg(a`XZx%D&G;i%%T{AyG{?{7ed`)O z-+vR|6uzs_N`K5(;|H-!U?|}6EBG3W;-D+W3Xeo88^~AcPS_5p*B&g`c~{w8zVmLC>8gcFI&dAKMpH^Xdkk9SOPTt zYw`oM=EGP?Y{nMg1HQg@!nR|WKLh%^K((9%olK*@W>Nb2&HiI@gL zf6EG)S6Q?1b1abV<$gVDWp=W9<1wtE|DF5a`M3RR{!jiF*e2cQSVO|Oi1T(%##+`{ zd4DJ8cQ}`DVpHswqT}3#CIY8pmCcGStg;^m7yDmDy34S^KrV8;W~pg~rILRhYb|`OJm6OUT9hYc`4b#$ z>yqrLHe1e<2!91%ThWxj54&ybSIqsQ$qCZ`(63Z_52gGb*u7j+?x-kE8qU+9@nF+3Em>4Fyfy~}a!nWL2cn!wZ>rQ6KtVCNm z%}%;6woH^HevUmM?VqKGtNout314O?H>F35VKxYz%MNU7tOd>LT`fpGen!1+@e9Q@ z9vZ)o5NbxQ#z&rdJ{i>vdmq{WpFZfE{39KD%a^c#xdu6R3-eYl)4sd0eA$a-(S9tn z>Y2AX3GTYa-(c2rA;Ip4Nwb~9a<0N`->`f;9;@yXY<*;SM9-?nO2^9OWf^H#C0JHr z4p#=76!_Dr-kMJY8FQx59Fca_t z%iZ^2cEM^QzR@Z$v$U_{SwomV7|PQMtDyfLYpgF(nrO8%)YMpGE6WeCKU$65&o8j? z`lWjuyQn8nc_&T$zYphE@&Gik7OHR3? z)}u}jHEY2Pv{MD;)M82B9Xt9u`ZHQv~qwKKd?TEC{=cn##`0&ZYk~i2<&7$&iFVCaeLHumwa#1d$!t z)jm~`_OZ6s$rMr1D%RFgwUxG7Tg4ie`dDqBDx$TNOup~WIrmOxNNDTt_50&N-*fK0 zbLQT&eD?D>H;gmJg4lMZvd*b<=U2o;OgqK+w>uc~cg~)hGj`Fh{?W`B??J8BwlzyS z_e@RSiyt&F7Q3}=(*`R)W6EJH=co8SWm)I)HAlw3b&avC*YTSr%a^S0WG4K_zuk)O z1D1DeS=Qg-IKo(Q65~Y|R`Ufvn1L(owf2I$seI?I zRW$>Vu8Hcme0p$dWC~ryKm1O;?m{1xXYu`K>bJz5&kS5Q44KRnKl86ITH|1kFTKlR&JS4^|Aa>fP* z)Hwr2wpP8)Gp&q0@a~)VRfCE{W@UlOvurGm#6KLPr7Z0mz>d0gHvxV3O)=cPzUe*6 z@LYoayAwF}M776vdL1fO?ot8uwo{uu zf%^=+sI~3i-LoC_2s-cFSfBcN}JoqK|wc{Aw0qju_bF5-AUKqa-4Xh|<=jDwVC zImvXQyI%m$0r>#cdlbO$27V<=agV7ursvQY>FxTP_Pt)xeO(&5QPRDrKDA2&&%<*8 zF>h3#uG4*qKIxe5^`utPb+k*gL+_(!skh1F{^B0=Oue2y9z;iUte3?9p3kQ~>HXL5 zr{AB-#QV{B;4m=I0y7|D)nQkum4^zzv=hlneGLMW+~c=yzW)Z-cnj`-Lw$v49M^{XZpd|_b;7H_8GwH438LF14Tn(r07TdHOyU{h zA)@6}0R0x{XE%=T0;(`>UjgR<{Eonu05|k&=(%t} z@PWEV*)!|}J1qV?fg}1)UODP@&Cb60fAfd@rj8B$Z~l;LJvzTHN~21&9|0X%d8WvmDWz{7VGWSJ=QbU|F-@h-X}gJJ|aFL zJ|#Xoz9s%x{PFll5|jjELQulUgs_BB32_Ny5;78M5|$*iCt4EY6CY20DEa%z&gApS z&nEvg`IY3?l0Qm`N-0mNNNG)JOIen(D&?WnkksXUetl7WiG7)UMSYX{ruEI~YwbJT z_oJ_#`|8E72V4UK12hikrIqEfQuZKvc}{hF#XZXE~o1;*L{rj2Z$Q%`gg7)=Fz{fzd@ce_CeGKuxuE6 z??v%>>Al|f{_vjjy&u2#+I#2Uf8qV--YaQ}|BqJ6Z2U zT>jJL=Py5Z`Ju}XT>kdu`!8>P`-`_9OdQ9UHxjxM?B)jos?26XqNHfnht^%^J3;2< zYAv;t{;4&x)Q{CUYL6;7LUqwK!w5sBA=`laLcGtbi4Je0@qSRTg{`52zX$MF(Akx$~4 z{2e~P|EP>(D*sx^R&tbFB~M|Bs!UdDcn$xnGK#;UOjF90>54_oQFE0NC0Q{jCZ$r% z=F|B9@?Y{_@z?l25r;A&PUnkwlbLN|!7Pf6V$p0g%V3!-i)BM1PGnP9C97i9u)jvK zEv$((vlh0Pt!20HTK0SP2lf_wn_Xt_@ad3fe_?-R|I7ZyTx@_d&iPDk;bATVV|*B z_Bo4VS0F*YVDaoKWa-~oGW(jPuz#>rc8!f;*V(On4$I*R%jGJ|;|4aC`>=dI7jktT zE954`*ZlZ=R>J*RDGy-dc_6!;FJRmGLNrtxT2%SW>v z+{R{cE1S*ZSshPcb9fS)%ahqWp2FtyRMx=LStHM2ck)H7m5*ghcs^T-NM;)^WOiP} z+IcZs!AsdXUcoxqdS1mg@M^Y^PvuQ)1bdHd<}=tPo zTA9jrDSm7(I{;nzZFYvQVmsMgY&W}`?Lj1SKRd_{u_Ms2$JlY`pp)!gL>}*F-(vs8 z9%K)()9hh(4|{+w=61fEujX5M3vcC1_)^}++xarSg0JLj_*%Y>ck(XY%{TCkd=uZy zd-xW9D<_S#opTv;lzpH5fIY^3$ew5La@ga{!FrjK z{fIrm&atQ2d1(0`v*-8@ekb3_ck$i)ZoZH2=Lh&fewgp!d-)^$F8)3KDE~hH0e_7D zkU!2H{2qRY-_Lv5@3@n#;SPcB)-!x4K^4pl(z*LGSKR?}T33rQW6PR_|8#FeB!R{yn5g zLveD$2V~2C@bBNrnHTv_`Oo-E{O9~4{{?@UzrtVrKO}qpgAV?iDk^v%|H9;WGX67< z`eZu=YM{}yY9PxhUV{G}Wr76%0A->Ce-~wvgo3C5B!vL)LzyC>&^=Qn`1>f+fHBbC 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�X%#U070je6x;UB4Mr{t0*%8aE&*a9^2_u7A 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 BoM`|6 literal 0 HcmV?d00001 diff --git a/apps/mobile/ios/Fonts/Basel-Book.otf b/apps/mobile/ios/Fonts/Basel-Book.otf new file mode 100644 index 0000000000000000000000000000000000000000..a29a6258ac08d30eaed8f4f9a4cf4e5b0079caef GIT binary patch literal 84524 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 bCVDp&?Yjx>QH8jLkV(nw>z5^-%b5QMMXG{j literal 0 HcmV?d00001 diff --git a/apps/mobile/ios/Fonts/Basel-Medium.otf b/apps/mobile/ios/Fonts/Basel-Medium.otf new file mode 100644 index 0000000000000000000000000000000000000000..b21566f1d20a9c8af54ff4d769f45dabe7764268 GIT binary patch literal 83828 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 Udeq?B66mDV74|EW?`6#Y0^fwXod5s; literal 0 HcmV?d00001 diff --git a/apps/mobile/ios/Fonts/Basel-Semibold.otf b/apps/mobile/ios/Fonts/Basel-Semibold.otf new file mode 100644 index 0000000000000000000000000000000000000000..17b9952c58c9a5b9922a99bb6006294bd9ea256e GIT binary patch literal 85868 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ⅇFBYqjT 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≺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: View { } Text(text) .foregroundColor(textColor) - .font(Font(UIFont(name: "Basel Grotesk Book", size: 16)!)) + .font(Font(UIFont(name: "Basel-Book", size: 16)!)) } } .padding(EdgeInsets(top: 8, leading: icon != nil ? 12 : 16, bottom: 8, trailing: 16)) diff --git a/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj b/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj index 7dfdb3e9820..d7da677bcd9 100644 --- a/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj +++ b/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ 074086FA2A703B76006E3053 /* FormatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074086F92A703B76006E3053 /* FormatTests.swift */; }; 0741433E2A588CCC00A157D3 /* TokenPriceWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 072F6C292A44A32E00DA720A /* TokenPriceWidget.intentdefinition */; }; 074143402A588F5800A157D3 /* Structs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0741433F2A588F5800A157D3 /* Structs.swift */; }; + 0743218C2A82C6C000F8518D /* Basel-Book.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0743218B2A82C6C000F8518D /* Basel-Book.otf */; }; + 0743218D2A82C6C000F8518D /* Basel-Book.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0743218B2A82C6C000F8518D /* Basel-Book.otf */; }; 074321EB2A83E3CA00F8518D /* TokenDetailsScreenQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074321902A83E3C900F8518D /* TokenDetailsScreenQuery.graphql.swift */; }; 074321ED2A83E3CA00F8518D /* ExploreTokensTabQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074321922A83E3C900F8518D /* ExploreTokensTabQuery.graphql.swift */; }; 074321EE2A83E3CA00F8518D /* NftsTabQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074321932A83E3C900F8518D /* NftsTabQuery.graphql.swift */; }; @@ -109,6 +111,14 @@ 0743223D2A83E3CA00F8518D /* IAmount.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074321E92A83E3C900F8518D /* IAmount.graphql.swift */; }; 0743223E2A83E3CA00F8518D /* IContract.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074321EA2A83E3C900F8518D /* IContract.graphql.swift */; }; 074322402A841BBD00F8518D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0743223F2A841BBD00F8518D /* Constants.swift */; }; + 0767E02F2A61BBDC0042ADA2 /* Basel-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02B2A61BBDB0042ADA2 /* Basel-Regular.otf */; }; + 0767E0302A61BBDC0042ADA2 /* Basel-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02B2A61BBDB0042ADA2 /* Basel-Regular.otf */; }; + 0767E0312A61BBDC0042ADA2 /* Basel-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02C2A61BBDB0042ADA2 /* Basel-Semibold.otf */; }; + 0767E0322A61BBDC0042ADA2 /* Basel-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02C2A61BBDB0042ADA2 /* Basel-Semibold.otf */; }; + 0767E0332A61BBDC0042ADA2 /* Basel-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02D2A61BBDB0042ADA2 /* Basel-Medium.otf */; }; + 0767E0342A61BBDC0042ADA2 /* Basel-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02D2A61BBDB0042ADA2 /* Basel-Medium.otf */; }; + 0767E0352A61BBDC0042ADA2 /* Basel-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02E2A61BBDC0042ADA2 /* Basel-Bold.otf */; }; + 0767E0362A61BBDC0042ADA2 /* Basel-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 0767E02E2A61BBDC0042ADA2 /* Basel-Bold.otf */; }; 0767E0382A65C8330042ADA2 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0767E0372A65C8330042ADA2 /* Colors.swift */; }; 0767E03B2A65D2550042ADA2 /* Styling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0767E03A2A65D2550042ADA2 /* Styling.swift */; }; 077E60392A85587800ABC4B9 /* TokensQuery.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077E60382A85587800ABC4B9 /* TokensQuery.graphql.swift */; }; @@ -179,18 +189,14 @@ 9FCEBF042A95A99C0079EDDB /* RCTThemeModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FCEBF032A95A99B0079EDDB /* RCTThemeModule.m */; }; 9FEC9B8B2A858CF1003CD019 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FEC9B8A2A858CF1003CD019 /* AppDelegate.m */; }; A32F9FBD272343C9002CFCDB /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A32F9FBC272343C8002CFCDB /* GoogleService-Info.plist */; }; - A3551F2CAC134AD49D40927F /* Basel-Grotesk-Book.otf in Resources */ = {isa = PBXBuildFile; fileRef = 6F33E8069B7B40AFB313B8B0 /* Basel-Grotesk-Book.otf */; }; A3F0A5B1272B1DFA00895B25 /* KeychainSwiftDistrib.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F0A5B0272B1DFA00895B25 /* KeychainSwiftDistrib.swift */; }; A70E4DD42C25DA0A002D6D86 /* NetworkFee.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70E4DD32C25DA0A002D6D86 /* NetworkFee.graphql.swift */; }; A70E4DD72C260416002D6D86 /* SwapOrderType.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70E4DD52C260416002D6D86 /* SwapOrderType.graphql.swift */; }; A70E4DD82C260416002D6D86 /* SwapOrderStatus.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A70E4DD62C260416002D6D86 /* SwapOrderStatus.graphql.swift */; }; A7B8EFCB2BF68F0D00CA4A1C /* FeeData.graphql.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B8EFCA2BF68F0D00CA4A1C /* FeeData.graphql.swift */; }; AC0EE0982BD826E700BCCF07 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = AC0EE0972BD826E700BCCF07 /* PrivacyInfo.xcprivacy */; }; - AE1757582C49B0A7000120A5 /* Basel-Grotesk-Book.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE1757572C49B0A1000120A5 /* Basel-Grotesk-Book.otf */; }; - AE1757592C49B0AA000120A5 /* Basel-Grotesk-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE1757562C49B0A1000120A5 /* Basel-Grotesk-Medium.otf */; }; - AEB2767B2C49CB060056FE52 /* Basel-Grotesk-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE1757562C49B0A1000120A5 /* Basel-Grotesk-Medium.otf */; }; - AEB2767C2C49CB080056FE52 /* Basel-Grotesk-Book.otf in Resources */ = {isa = PBXBuildFile; fileRef = AE1757572C49B0A1000120A5 /* Basel-Grotesk-Book.otf */; }; - B193AD315CF844A3BDC3D11D /* Basel-Grotesk-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3C606D2C81014A0A8898F38E /* Basel-Grotesk-Medium.otf */; }; + AEE498F72A85AD86000DDF8E /* Basel-Book.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AEE498F52A85AD86000DDF8E /* Basel-Book.ttf */; }; + AEE498F82A85AD86000DDF8E /* Basel-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AEE498F62A85AD86000DDF8E /* Basel-Medium.ttf */; }; D3B63ACA9B0C42F68080B080 /* InputMono-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1834199AFFB04D91B05FFB64 /* InputMono-Regular.ttf */; }; F35AFD3E27EE49990011A725 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = F35AFD3D27EE49990011A725 /* NotificationService.swift */; }; F35AFD4227EE49990011A725 /* OneSignalNotificationServiceExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = F35AFD3B27EE49990011A725 /* OneSignalNotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -320,6 +326,7 @@ 072F6C372A44BECC00DA720A /* Logging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logging.swift; sourceTree = ""; }; 074086F92A703B76006E3053 /* FormatTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormatTests.swift; sourceTree = ""; }; 0741433F2A588F5800A157D3 /* Structs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Structs.swift; sourceTree = ""; }; + 0743218B2A82C6C000F8518D /* Basel-Book.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Basel-Book.otf"; sourceTree = ""; }; 074321902A83E3C900F8518D /* TokenDetailsScreenQuery.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenDetailsScreenQuery.graphql.swift; sourceTree = ""; }; 074321922A83E3C900F8518D /* ExploreTokensTabQuery.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExploreTokensTabQuery.graphql.swift; sourceTree = ""; }; 074321932A83E3C900F8518D /* NftsTabQuery.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftsTabQuery.graphql.swift; sourceTree = ""; }; @@ -401,6 +408,10 @@ 074321E92A83E3C900F8518D /* IAmount.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IAmount.graphql.swift; sourceTree = ""; }; 074321EA2A83E3C900F8518D /* IContract.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IContract.graphql.swift; sourceTree = ""; }; 0743223F2A841BBD00F8518D /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 0767E02B2A61BBDB0042ADA2 /* Basel-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Basel-Regular.otf"; sourceTree = ""; }; + 0767E02C2A61BBDB0042ADA2 /* Basel-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Basel-Semibold.otf"; sourceTree = ""; }; + 0767E02D2A61BBDB0042ADA2 /* Basel-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Basel-Medium.otf"; sourceTree = ""; }; + 0767E02E2A61BBDC0042ADA2 /* Basel-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Basel-Bold.otf"; sourceTree = ""; }; 0767E0372A65C8330042ADA2 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; 0767E03A2A65D2550042ADA2 /* Styling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Styling.swift; sourceTree = ""; }; 077E60382A85587800ABC4B9 /* TokensQuery.graphql.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokensQuery.graphql.swift; sourceTree = ""; }; @@ -437,7 +448,6 @@ 1CC6ADAADCA38FDAEB181E86 /* Pods-WidgetIntentExtension.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetIntentExtension.dev.xcconfig"; path = "Target Support Files/Pods-WidgetIntentExtension/Pods-WidgetIntentExtension.dev.xcconfig"; sourceTree = ""; }; 3A2186B1FF7FB85663D96EA9 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; 3BAE0E417A0F99C84523EF04 /* libPods-Uniswap.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Uniswap.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3C606D2C81014A0A8898F38E /* Basel-Grotesk-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Basel-Grotesk-Medium.otf"; path = "../src/assets/fonts/Basel-Grotesk-Medium.otf"; sourceTree = ""; }; 3D8FCE4CD401350CA74DCC89 /* Pods-WidgetsCoreTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCoreTests.debug.xcconfig"; path = "Target Support Files/Pods-WidgetsCoreTests/Pods-WidgetsCoreTests.debug.xcconfig"; sourceTree = ""; }; 3E279F675B02CBC50D3B57D5 /* Pods-WidgetsCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.release.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.release.xcconfig"; sourceTree = ""; }; 4781CD4CDD95B5792B793F75 /* Pods-Uniswap-UniswapTests.beta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.beta.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.beta.xcconfig"; sourceTree = ""; }; @@ -456,7 +466,6 @@ 6CA91BDE2A95226200C4063E /* RNCloudStorageBackupsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNCloudStorageBackupsManager.m; sourceTree = ""; }; 6CA91BDF2A95226200C4063E /* EncryptionHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncryptionHelper.swift; sourceTree = ""; }; 6CA91BE02A95226200C4063E /* RNCloudStorageBackupsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RNCloudStorageBackupsManager.swift; sourceTree = ""; }; - 6F33E8069B7B40AFB313B8B0 /* Basel-Grotesk-Book.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Basel-Grotesk-Book.otf"; path = "../src/assets/fonts/Basel-Grotesk-Book.otf"; sourceTree = ""; }; 6F3DC921A65D749C0852B10C /* Pods-Uniswap-UniswapTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap-UniswapTests.debug.xcconfig"; path = "Target Support Files/Pods-Uniswap-UniswapTests/Pods-Uniswap-UniswapTests.debug.xcconfig"; sourceTree = ""; }; 6F7814C6D40D9C348EA1F1C7 /* Pods-OneSignalNotificationServiceExtension.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.dev.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.dev.xcconfig"; sourceTree = ""; }; 71A42CE7FF1299C666E6FC79 /* libPods-WidgetIntentExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-WidgetIntentExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -503,8 +512,8 @@ A7C9F415D0E128A43003E071 /* Pods-Uniswap.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Uniswap.debug.xcconfig"; path = "Target Support Files/Pods-Uniswap/Pods-Uniswap.debug.xcconfig"; sourceTree = ""; }; AC0EE0972BD826E700BCCF07 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Uniswap/PrivacyInfo.xcprivacy; sourceTree = ""; }; AC2794442C51541E00F9AF68 /* sourcemaps-datadog.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "sourcemaps-datadog.sh"; sourceTree = ""; }; - AE1757562C49B0A1000120A5 /* Basel-Grotesk-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Basel-Grotesk-Medium.otf"; path = "../../src/assets/fonts/Basel-Grotesk-Medium.otf"; sourceTree = ""; }; - AE1757572C49B0A1000120A5 /* Basel-Grotesk-Book.otf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Basel-Grotesk-Book.otf"; path = "../../src/assets/fonts/Basel-Grotesk-Book.otf"; sourceTree = ""; }; + AEE498F52A85AD86000DDF8E /* Basel-Book.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Basel-Book.ttf"; path = "../src/assets/fonts/Basel-Book.ttf"; sourceTree = ""; }; + AEE498F62A85AD86000DDF8E /* Basel-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Basel-Medium.ttf"; path = "../src/assets/fonts/Basel-Medium.ttf"; sourceTree = ""; }; B0DA4D39B1A6D74A1D05B99F /* Pods-WidgetsCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.debug.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.debug.xcconfig"; sourceTree = ""; }; B2176D5449C2B3B68A17466B /* libPods-WidgetsCoreTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-WidgetsCoreTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; BCB2A43E5FB0D7B69CA02312 /* Pods-WidgetsCore.dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WidgetsCore.dev.xcconfig"; path = "Target Support Files/Pods-WidgetsCore/Pods-WidgetsCore.dev.xcconfig"; sourceTree = ""; }; @@ -697,8 +706,11 @@ 074321872A82BA2700F8518D /* Fonts */ = { isa = PBXGroup; children = ( - AE1757572C49B0A1000120A5 /* Basel-Grotesk-Book.otf */, - AE1757562C49B0A1000120A5 /* Basel-Grotesk-Medium.otf */, + 0743218B2A82C6C000F8518D /* Basel-Book.otf */, + 0767E02C2A61BBDB0042ADA2 /* Basel-Semibold.otf */, + 0767E02B2A61BBDB0042ADA2 /* Basel-Regular.otf */, + 0767E02D2A61BBDB0042ADA2 /* Basel-Medium.otf */, + 0767E02E2A61BBDC0042ADA2 /* Basel-Bold.otf */, ); path = Fonts; sourceTree = ""; @@ -1118,9 +1130,9 @@ C2C18ECBEF5A4489BF3A314C /* Resources */ = { isa = PBXGroup; children = ( + AEE498F52A85AD86000DDF8E /* Basel-Book.ttf */, + AEE498F62A85AD86000DDF8E /* Basel-Medium.ttf */, 1834199AFFB04D91B05FFB64 /* InputMono-Regular.ttf */, - 6F33E8069B7B40AFB313B8B0 /* Basel-Grotesk-Book.otf */, - 3C606D2C81014A0A8898F38E /* Basel-Grotesk-Medium.otf */, ); name = Resources; sourceTree = ""; @@ -1419,8 +1431,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - AEB2767B2C49CB060056FE52 /* Basel-Grotesk-Medium.otf in Resources */, - AEB2767C2C49CB080056FE52 /* Basel-Grotesk-Book.otf in Resources */, + 0743218D2A82C6C000F8518D /* Basel-Book.otf in Resources */, + 0767E0342A61BBDC0042ADA2 /* Basel-Medium.otf in Resources */, + 0767E0302A61BBDC0042ADA2 /* Basel-Regular.otf in Resources */, + 0767E0362A61BBDC0042ADA2 /* Basel-Bold.otf in Resources */, + 0767E0322A61BBDC0042ADA2 /* Basel-Semibold.otf in Resources */, 072F6C2B2A44A32F00DA720A /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1436,15 +1451,19 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - AE1757592C49B0AA000120A5 /* Basel-Grotesk-Medium.otf in Resources */, FD7304CE28A364FC0085BDEA /* Colors.xcassets in Resources */, + AEE498F82A85AD86000DDF8E /* Basel-Medium.ttf in Resources */, A32F9FBD272343C9002CFCDB /* GoogleService-Info.plist in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 77CF6065C8A24FE48204A2C1 /* SplashScreen.storyboard in Resources */, AC0EE0982BD826E700BCCF07 /* PrivacyInfo.xcprivacy in Resources */, + AEE498F72A85AD86000DDF8E /* Basel-Book.ttf in Resources */, + 0767E02F2A61BBDC0042ADA2 /* Basel-Regular.otf in Resources */, + 0767E0352A61BBDC0042ADA2 /* Basel-Bold.otf in Resources */, + 0743218C2A82C6C000F8518D /* Basel-Book.otf in Resources */, + 0767E0312A61BBDC0042ADA2 /* Basel-Semibold.otf in Resources */, + 0767E0332A61BBDC0042ADA2 /* Basel-Medium.otf in Resources */, D3B63ACA9B0C42F68080B080 /* InputMono-Regular.ttf in Resources */, - A3551F2CAC134AD49D40927F /* Basel-Grotesk-Book.otf in Resources */, - B193AD315CF844A3BDC3D11D /* Basel-Grotesk-Medium.otf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2170,7 +2189,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2223,7 +2242,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -2276,7 +2295,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -2329,7 +2348,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -2367,7 +2386,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2403,7 +2422,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -2438,7 +2457,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -2473,7 +2492,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -2520,7 +2539,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2566,7 +2585,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.widgets; @@ -2612,7 +2631,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.widgets; @@ -2658,7 +2677,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.widgets; @@ -2700,7 +2719,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2743,7 +2762,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.WidgetIntentExtension; @@ -2786,7 +2805,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.WidgetIntentExtension; @@ -2829,7 +2848,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.WidgetIntentExtension; @@ -2865,7 +2884,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -2903,7 +2922,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3081,7 +3100,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3125,7 +3144,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.OneSignalNotificationServiceExtension; @@ -3225,7 +3244,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3296,7 +3315,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.OneSignalNotificationServiceExtension; @@ -3396,7 +3415,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3467,7 +3486,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.35; + MARKETING_VERSION = 1.34.1; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.OneSignalNotificationServiceExtension; diff --git a/apps/mobile/ios/Uniswap/Info.plist b/apps/mobile/ios/Uniswap/Info.plist index c7f369896c9..768475b66c6 100644 --- a/apps/mobile/ios/Uniswap/Info.plist +++ b/apps/mobile/ios/Uniswap/Info.plist @@ -62,7 +62,7 @@ ITSAppUsesNonExemptEncryption LSApplicationCategoryType - + LSApplicationQueriesSchemes itms-apps @@ -86,8 +86,8 @@ NSCameraUsageDescription $(PRODUCT_NAME) Wallet needs access to your Camera to scan QR codes NSPhotoLibraryUsageDescription - $(PRODUCT_NAME) Wallet needs access to your Camera Roll to choose an avatar for your username - NSFaceIDUsageDescription + $(PRODUCT_NAME) Wallet needs access to your Camera Roll to choose an avatar for your username + NSFaceIDUsageDescription Enabling Face ID helps $(PRODUCT_NAME) Wallet keep your assets secure. NSLocationAlwaysAndWhenInUseUsageDescription $(PRODUCT_NAME) Wallet does not require access to your location. @@ -116,8 +116,10 @@ UIAppFonts InputMono-Regular.ttf - Basel-Grotesk-Book.otf - Basel-Grotesk-Medium.otf + Basel-Book.otf + Basel-Medium.otf + Basel-Semibold.otf + Basel-Bold.otf UIBackgroundModes diff --git a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationView.swift b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationView.swift index 39c09d7326f..c30c1ef6be7 100644 --- a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationView.swift +++ b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationView.swift @@ -122,7 +122,7 @@ struct MnemonicConfirmation: View { VStack(alignment: .leading, spacing: 0) { HStack(alignment: .center, spacing: 24) { - VStack(alignment: .leading, spacing: 8) { + VStack(alignment: .leading, spacing: 12) { ForEach((0...middle), id: \.self) {index in MnemonicTextField(index: index + 1, word: getFieldText(index: index), @@ -132,7 +132,7 @@ struct MnemonicConfirmation: View { .frame(maxWidth: .infinity, alignment: .leading) } }.frame(maxWidth: .infinity) - VStack(alignment: .leading, spacing: 8) { + VStack(alignment: .leading, spacing: 12) { ForEach((middle + 1...end), id: \.self) {index in MnemonicTextField(index: index + 1, word: getFieldText(index: index), @@ -151,16 +151,12 @@ struct MnemonicConfirmation: View { .stroke(Colors.surface3, lineWidth: 1) ) - MnemonicConfirmationWordBankView( - words: props.scrambledWords, - usedWordIndexes: props.typedWordIndexes, - labelCallback: onSuggestionTapped, - shouldShowSmallText: props.shouldShowSmallText - ) + MnemonicConfirmationWordBankView(words: props.scrambledWords, + usedWordIndexes: props.typedWordIndexes, + labelCallback: onSuggestionTapped, + shouldShowSmallText: props.shouldShowSmallText) .frame(maxWidth: .infinity) - .padding(.top, 24) - - } - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .padding([.top, .leading, .trailing], 24) + }.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) } } diff --git a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationWordBankView.swift b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationWordBankView.swift index 4bae64c2516..4928e043b00 100644 --- a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationWordBankView.swift +++ b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationWordBankView.swift @@ -14,8 +14,8 @@ struct BankWord: Hashable { } struct MnemonicConfirmationWordBankView: View { - let smallFont = UIFont(name: "Basel Grotesk Book", size: 14) - let mediumFont = UIFont(name: "Basel Grotesk Book", size: 16) + let smallFont = UIFont(name: "Basel-Book", size: 14) + let mediumFont = UIFont(name: "Basel-Book", size: 16) var groupedWords: [[BankWord]] = [[BankWord]]() let screenWidth = UIScreen.main.bounds.width // Used to calculate max number of tags per row diff --git a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicDisplayView.swift b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicDisplayView.swift index 70b95dc4144..52fd67a2626 100644 --- a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicDisplayView.swift +++ b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicDisplayView.swift @@ -54,7 +54,7 @@ struct MnemonicDisplay: View { @State private var buttonPadding: CGFloat = 20 let rnEthersRS = RNEthersRS() - let interFont = UIFont(name: "Basel-Grotesk-Medium", size: 20) + let interFont = UIFont(name: "Basel-Semibold", size: 20) func setMnemonicId(mnemonicId: String) { props.mnemonicId = mnemonicId @@ -81,7 +81,7 @@ struct MnemonicDisplay: View { VStack(alignment: .leading, spacing: 0) { ZStack { HStack(alignment: .center, spacing: 24) { - VStack(alignment: .leading, spacing: 8) { + VStack(alignment: .leading, spacing: 12) { ForEach((0...middle), id: \.self) { index in MnemonicTextField(index: index + 1, word: props.mnemonicWords[index] @@ -89,7 +89,7 @@ struct MnemonicDisplay: View { .frame(maxWidth: .infinity, alignment: .leading) } }.frame(maxWidth: .infinity) - VStack(alignment: .leading, spacing: 8) { + VStack(alignment: .leading, spacing: 12) { ForEach((middle + 1...end), id: \.self) { index in MnemonicTextField(index: index + 1, word: props.mnemonicWords[index] diff --git a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicTextField.swift b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicTextField.swift index c5249737292..77ab21ef2ab 100644 --- a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicTextField.swift +++ b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicTextField.swift @@ -14,8 +14,8 @@ enum MnemonicInputStatus { } struct MnemonicTextField: View { - let smallFont = UIFont(name: "Basel Grotesk Book", size: 14) - let mediumFont = UIFont(name: "Basel Grotesk Book", size: 16) + let smallFont = UIFont(name: "Basel-Book", size: 14) + let mediumFont = UIFont(name: "Basel-Book", size: 16) var index: Int var word = "" diff --git a/apps/mobile/ios/Uniswap/Onboarding/Import/SeedPhraseInputView.swift b/apps/mobile/ios/Uniswap/Onboarding/Import/SeedPhraseInputView.swift index 521ffef4368..55781b4ef48 100644 --- a/apps/mobile/ios/Uniswap/Onboarding/Import/SeedPhraseInputView.swift +++ b/apps/mobile/ios/Uniswap/Onboarding/Import/SeedPhraseInputView.swift @@ -109,10 +109,10 @@ struct SeedPhraseInput: View { @ObservedObject var viewModel = SeedPhraseInputViewModel() @FocusState private var focused: Bool - private var font = Font(UIFont(name: "Basel Grotesk Book", size: 17)!) - private var subtitleFont = Font(UIFont(name: "Basel Grotesk Book", size: 17)!) - private var labelFont = Font(UIFont(name: "Basel Grotesk Book", size: 15)!) - private var buttonFont = Font(UIFont(name: "Basel Grotesk Medium", size: 15)!) + private var font = Font(UIFont(name: "Basel-Book", size: 17)!) + private var subtitleFont = Font(UIFont(name: "Basel-Book", size: 17)!) + private var labelFont = Font(UIFont(name: "Basel-Book", size: 15)!) + private var buttonFont = Font(UIFont(name: "Basel-Medium", size: 15)!) var body: some View { VStack(spacing: 12) { diff --git a/apps/mobile/ios/Widgets/Info.plist b/apps/mobile/ios/Widgets/Info.plist index b18cf4bc5e9..f0a00dc2bac 100644 --- a/apps/mobile/ios/Widgets/Info.plist +++ b/apps/mobile/ios/Widgets/Info.plist @@ -9,8 +9,11 @@ UIAppFonts - Basel-Grotesk-Book.otf - Basel-Grotesk-Medium.otf + Basel-Book.otf + Basel-Bold.otf + Basel-Medium.otf + Basel-Book.otf + Basel-Semibold.otf diff --git a/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift b/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift index 10a0145b064..7f9a46f318c 100644 --- a/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift +++ b/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift @@ -10,17 +10,18 @@ import SwiftUI public extension Text { func withHeading1Style() -> some View { - self.font(.custom("Basel Grotesk Book", size: 28)) + self.font(.custom("Basel-Book", size: 28)) .foregroundColor(.white) } func withHeading2Style() -> some View { - self.font(.custom("Basel Grotesk Book", size: 20)) + self.font(.custom("Basel-Book", size: 20)) .foregroundColor(.widgetLightGrey) } func withHeading3Style() -> some View { - self.font(.custom("Basel Grotesk Medium", size: 12)) + self.font(.custom("Basel", size: 12)) + .fontWeight(.medium) .foregroundColor(.widgetGrey) } } diff --git a/apps/mobile/ios/link-assets-manifest.json b/apps/mobile/ios/link-assets-manifest.json index 32ddfd86340..7f747d8df52 100644 --- a/apps/mobile/ios/link-assets-manifest.json +++ b/apps/mobile/ios/link-assets-manifest.json @@ -2,12 +2,12 @@ "migIndex": 1, "data": [ { - "path": "src/assets/fonts/Basel-Grotesk-Book.otf", - "sha1": "3d74b09feab9de003c5ef7861bcda7fe9c8f744f" + "path": "src/assets/fonts/Basel-Book.ttf", + "sha1": "7ff6b3f7e5c2857ca3b39fad3ba09c35bb75e302" }, { - "path": "src/assets/fonts/Basel-Grotesk-Medium.otf", - "sha1": "b860c729d64ac027624cc52a059132211a1665a6" + "path": "src/assets/fonts/Basel-Medium.ttf", + "sha1": "182bf31d0794296a034a2d13b50fffd804709aaa" }, { "path": "src/assets/fonts/InputMono-Regular.ttf", diff --git a/apps/mobile/jest-setup.js b/apps/mobile/jest-setup.js index f90703d2fe6..3a5fff1b2af 100644 --- a/apps/mobile/jest-setup.js +++ b/apps/mobile/jest-setup.js @@ -84,7 +84,7 @@ jest.mock('@react-navigation/elements', () => ({ require('react-native-reanimated').setUpTests() -jest.mock('uniswap/src/features/language/LocalizationContext', () => mockLocalizationContext) +jest.mock('wallet/src/features/language/LocalizationContext', () => mockLocalizationContext) jest.mock('react-native/Libraries/Share/Share', () => ({ share: jest.fn(), diff --git a/apps/mobile/src/app/App.tsx b/apps/mobile/src/app/App.tsx index 48a2950d90a..6966d851d36 100644 --- a/apps/mobile/src/app/App.tsx +++ b/apps/mobile/src/app/App.tsx @@ -50,7 +50,6 @@ import { flexStyles, useHapticFeedback, useIsDarkMode } from 'ui/src' import { config } from 'uniswap/src/config' import { uniswapUrls } from 'uniswap/src/constants/urls' import { selectFavoriteTokens } from 'uniswap/src/features/favorites/selectors' -import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' import { DUMMY_STATSIG_SDK_KEY, StatsigCustomAppValue } from 'uniswap/src/features/gating/constants' import { Experiments } from 'uniswap/src/features/gating/experiments' import { FeatureFlags, WALLET_FEATURE_FLAG_NAMES, getFeatureFlagName } from 'uniswap/src/features/gating/flags' @@ -61,9 +60,6 @@ import { } from 'uniswap/src/features/gating/hooks' import { loadStatsigOverrides } from 'uniswap/src/features/gating/overrides/customPersistedOverrides' import { Statsig, StatsigOptions, StatsigProvider, StatsigUser } from 'uniswap/src/features/gating/sdk/statsig' -import { LocalizationContextProvider } from 'uniswap/src/features/language/LocalizationContext' -import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' -import { syncAppWithDeviceLanguage } from 'uniswap/src/features/settings/slice' import Trace from 'uniswap/src/features/telemetry/Trace' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' @@ -83,13 +79,17 @@ import { usePersistedApolloClient } from 'wallet/src/data/apollo/usePersistedApo import { initFirebaseAppCheck } from 'wallet/src/features/appCheck' import { useCurrentAppearanceSetting } from 'wallet/src/features/appearance/hooks' import { selectHapticsEnabled } from 'wallet/src/features/appearance/slice' +import { useAppFiatCurrencyInfo } from 'wallet/src/features/fiatCurrency/hooks' +import { LocalizationContextProvider } from 'wallet/src/features/language/LocalizationContext' +import { useCurrentLanguageInfo } from 'wallet/src/features/language/hooks' +import { syncAppWithDeviceLanguage } from 'wallet/src/features/language/slice' import { clearNotificationQueue } from 'wallet/src/features/notifications/slice' import { TransactionHistoryUpdater } from 'wallet/src/features/transactions/TransactionHistoryUpdater' import { WalletUniswapProvider } from 'wallet/src/features/transactions/contexts/WalletUniswapContext' import { Account } from 'wallet/src/features/wallet/accounts/types' import { WalletContextProvider } from 'wallet/src/features/wallet/context' import { useAccounts } from 'wallet/src/features/wallet/hooks' -import { SharedWalletProvider } from 'wallet/src/provider' +import { SharedProvider } from 'wallet/src/provider' import { beforeSend } from 'wallet/src/utils/sentry' enableFreeze(true) @@ -224,14 +224,14 @@ function App(): JSX.Element | null { - + - + diff --git a/apps/mobile/src/app/migrations.test.ts b/apps/mobile/src/app/migrations.test.ts index bcd47460247..df0b5125b9f 100644 --- a/apps/mobile/src/app/migrations.test.ts +++ b/apps/mobile/src/app/migrations.test.ts @@ -76,10 +76,6 @@ import { v72Schema, v73Schema, v74Schema, - v75Schema, - v76Schema, - v77Schema, - v78Schema, v7Schema, v8Schema, v9Schema, @@ -93,7 +89,6 @@ import { initialTweaksState } from 'src/features/tweaks/slice' import { initialWalletConnectState } from 'src/features/walletConnect/walletConnectSlice' import { AccountType } from 'uniswap/src/features/accounts/types' import { initialFavoritesState } from 'uniswap/src/features/favorites/slice' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' import { initialSearchHistoryState } from 'uniswap/src/features/search/searchHistorySlice' import { initialUserSettingsState } from 'uniswap/src/features/settings/slice' import { ModalName } from 'uniswap/src/features/telemetry/constants' @@ -106,6 +101,8 @@ import { getAllKeysOfNestedObject } from 'utilities/src/primitives/objects' import { ScannerModalState } from 'wallet/src/components/QRCodeScanner/constants' import { initialAppearanceSettingsState } from 'wallet/src/features/appearance/slice' import { initialBehaviorHistoryState } from 'wallet/src/features/behaviorHistory/slice' +import { initialFiatCurrencyState } from 'wallet/src/features/fiatCurrency/slice' +import { initialLanguageState } from 'wallet/src/features/language/slice' import { initialNotificationsState } from 'wallet/src/features/notifications/slice' import { initialTelemetryState } from 'wallet/src/features/telemetry/slice' import { Account, SignerMnemonicAccount } from 'wallet/src/features/wallet/accounts/types' @@ -114,11 +111,7 @@ import { createMigrate } from 'wallet/src/state/createMigrate' import { HAYDEN_ETH_ADDRESS } from 'wallet/src/state/walletMigrations' import { testActivatePendingAccounts, - testAddCreatedOnboardingRedesignAccount, testAddedHapticSetting, - testMovedCurrencySetting, - testMovedLanguageSetting, - testMovedTokenWarnings, testMovedUserSettings, testRemoveHoldToSwap, } from 'wallet/src/state/walletMigrationsTests' @@ -181,7 +174,8 @@ describe('Redux state migrations', () => { cloudBackup: initialCloudBackupState, ens: { ensForAddress: {} }, favorites: initialFavoritesState, - fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, + fiatCurrencySettings: initialFiatCurrencyState, + languageSettings: initialLanguageState, modals: initialModalsState, notifications: initialNotificationsState, passwordLockout: initialPasswordLockoutState, @@ -1548,20 +1542,4 @@ describe('Redux state migrations', () => { it('migrates from v74 to v75', () => { testRemoveHoldToSwap(migrations[75], v74Schema) }) - - it('migrates from v75 to v76', () => { - testAddCreatedOnboardingRedesignAccount(migrations[76], v75Schema) - }) - - it('migrates from v76 to v77', async () => { - testMovedTokenWarnings(migrations[77], v76Schema) - }) - - it('migrates from v77 to v78', async () => { - testMovedLanguageSetting(migrations[78], v77Schema) - }) - - it('migrates from v78 to v79', async () => { - testMovedCurrencySetting(migrations[79], v78Schema) - }) }) diff --git a/apps/mobile/src/app/migrations.ts b/apps/mobile/src/app/migrations.ts index 96f656654ee..b82be69e39c 100644 --- a/apps/mobile/src/app/migrations.ts +++ b/apps/mobile/src/app/migrations.ts @@ -6,8 +6,6 @@ import dayjs from 'dayjs' import { AccountType } from 'uniswap/src/features/accounts/types' import { toSupportedChainId } from 'uniswap/src/features/chains/utils' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' -import { Language } from 'uniswap/src/features/language/constants' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { TransactionsState } from 'uniswap/src/features/transactions/slice' import { @@ -16,12 +14,13 @@ import { TransactionType, } from 'uniswap/src/features/transactions/types/transactionDetails' import { UniverseChainId, WalletChainId } from 'uniswap/src/types/chains' +import { initialFiatCurrencyState } from 'wallet/src/features/fiatCurrency/slice' +import { initialLanguageState } from 'wallet/src/features/language/slice' import { getNFTAssetKey } from 'wallet/src/features/nfts/utils' import { Account } from 'wallet/src/features/wallet/accounts/types' import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' import { activatePendingAccounts, - addCreatedOnboardingRedesignAccountBehaviorHistory, addExploreAndWelcomeBehaviorHistory, addHapticSetting, addRoutingFieldToTransactions, @@ -29,9 +28,6 @@ import { deleteDefaultFavoritesFromFavoritesState, deleteExtensionOnboardingState, deleteHoldToSwapBehaviorHistory, - moveCurrencySetting, - moveDismissedTokenWarnings, - moveLanguageSetting, moveUserSettings, removeUniconV2BehaviorState, removeWalletIsUnlockedState, @@ -720,21 +716,21 @@ export const migrations = { 51: function addLanguageSettings(state: any) { return { ...state, - languageSettings: { currentLanguage: Language.English }, + languageSettings: initialLanguageState, } }, 52: function addFiatCurrencySettings(state: any) { return { ...state, - fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, + fiatCurrencySettings: initialFiatCurrencyState, } }, 53: function updateLanguageSettings(state: any) { return { ...state, - languageSettings: { currentLanguage: Language.English }, + languageSettings: initialLanguageState, } }, @@ -940,14 +936,6 @@ export const migrations = { }, 75: deleteHoldToSwapBehaviorHistory, - - 76: addCreatedOnboardingRedesignAccountBehaviorHistory, - - 77: moveDismissedTokenWarnings, - - 78: moveLanguageSetting, - - 79: moveCurrencySetting, } -export const MOBILE_STATE_VERSION = 79 +export const MOBILE_STATE_VERSION = 75 diff --git a/apps/mobile/src/app/modals/AccountSwitcherModal.tsx b/apps/mobile/src/app/modals/AccountSwitcherModal.tsx index 844744c5fa7..6e86a69a08e 100644 --- a/apps/mobile/src/app/modals/AccountSwitcherModal.tsx +++ b/apps/mobile/src/app/modals/AccountSwitcherModal.tsx @@ -276,7 +276,7 @@ export function AccountSwitcher({ onClose }: { onClose: () => void }): JSX.Eleme - + {t('account.wallet.button.add')} diff --git a/apps/mobile/src/app/modals/AppModals.tsx b/apps/mobile/src/app/modals/AppModals.tsx index b7b36041b10..87e035a4f7c 100644 --- a/apps/mobile/src/app/modals/AppModals.tsx +++ b/apps/mobile/src/app/modals/AppModals.tsx @@ -2,7 +2,6 @@ import React, { useCallback } from 'react' import { useDispatch } from 'react-redux' import { AccountSwitcherModal } from 'src/app/modals/AccountSwitcherModal' import { BackupReminderModal } from 'src/app/modals/BackupReminderModal' -import { BackupWarningModal } from 'src/app/modals/BackupWarningModal' import { ExperimentsModal } from 'src/app/modals/ExperimentsModal' import { ExploreModal } from 'src/app/modals/ExploreModal' import { KoreaCexTransferInfoModal } from 'src/app/modals/KoreaCexTransferInfoModal' @@ -110,10 +109,6 @@ export function AppModals(): JSX.Element { - - - - ) } diff --git a/apps/mobile/src/app/modals/BackupReminderModal.tsx b/apps/mobile/src/app/modals/BackupReminderModal.tsx index 1975596f342..4e2b5e19bcb 100644 --- a/apps/mobile/src/app/modals/BackupReminderModal.tsx +++ b/apps/mobile/src/app/modals/BackupReminderModal.tsx @@ -1,45 +1,37 @@ -import { useRef } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { navigate } from 'src/app/navigation/rootNavigation' -import { closeModal, openModal } from 'src/features/modals/modalSlice' +import { closeModal } from 'src/features/modals/modalSlice' import { LockPreviewImage } from 'src/features/onboarding/LockPreviewImage' import { Button, Flex, Text } from 'ui/src' import { Modal } from 'uniswap/src/components/modals/Modal' import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { WarningSeverity } from 'uniswap/src/features/transactions/WarningModal/types' import { ImportType, OnboardingEntryPoint } from 'uniswap/src/types/onboarding' import { MobileScreens, OnboardingScreens } from 'uniswap/src/types/screens/mobile' +import { WarningModal } from 'wallet/src/components/modals/WarningModal/WarningModal' import { setBackupReminderLastSeenTs } from 'wallet/src/features/behaviorHistory/slice' export function BackupReminderModal(): JSX.Element { const { t } = useTranslation() const dispatch = useDispatch() - const closedByButtonRef = useRef(false) + const [isShowingWarningModal, setIsShowingWarningModal] = useState(false) - const onClose = (): void => { - dispatch(closeModal({ name: ModalName.BackupReminder })) + const showWarningModal = (): void => { + setIsShowingWarningModal(true) } - const checkForSwipeToDismiss = (): void => { - if (!closedByButtonRef.current) { - // Modal was swiped to dismiss, should open the BackupReminderWarning modal - dispatch(openModal({ name: ModalName.BackupReminderWarning })) - } - - // Reset the ref and close the modal - closedByButtonRef.current = false - onClose() + const hideWarningModal = (): void => { + setIsShowingWarningModal(false) } - const onPressMaybeLater = (): void => { - closedByButtonRef.current = true - dispatch(openModal({ name: ModalName.BackupReminderWarning })) - onClose() + const onClose = (): void => { + dispatch(setBackupReminderLastSeenTs(Date.now())) + dispatch(closeModal({ name: ModalName.BackupReminder })) } const onPressBackup = (): void => { - closedByButtonRef.current = true - dispatch(setBackupReminderLastSeenTs(Date.now())) navigate(MobileScreens.OnboardingStack, { screen: OnboardingScreens.Backup, params: { importType: ImportType.BackupOnly, entryPoint: OnboardingEntryPoint.BackupCard }, @@ -47,8 +39,8 @@ export function BackupReminderModal(): JSX.Element { onClose() } - return ( - + return !isShowingWarningModal ? ( + @@ -64,7 +56,7 @@ export function BackupReminderModal(): JSX.Element { flex={1} size="medium" theme="secondary" - onPress={onPressMaybeLater} + onPress={showWarningModal} > {t('common.button.later')} @@ -74,5 +66,18 @@ export function BackupReminderModal(): JSX.Element { + ) : ( + ) } diff --git a/apps/mobile/src/app/modals/BackupWarningModal.tsx b/apps/mobile/src/app/modals/BackupWarningModal.tsx deleted file mode 100644 index 6180abdbd8a..00000000000 --- a/apps/mobile/src/app/modals/BackupWarningModal.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { useRef } from 'react' -import { useTranslation } from 'react-i18next' -import { useDispatch } from 'react-redux' -import { closeModal, openModal } from 'src/features/modals/modalSlice' -import { ModalName } from 'uniswap/src/features/telemetry/constants' -import { WarningSeverity } from 'uniswap/src/features/transactions/WarningModal/types' -import { WarningModal } from 'wallet/src/components/modals/WarningModal/WarningModal' -import { setBackupReminderLastSeenTs } from 'wallet/src/features/behaviorHistory/slice' - -export function BackupWarningModal(): JSX.Element { - const { t } = useTranslation() - const dispatch = useDispatch() - const closedByButtonRef = useRef(false) - - const onClose = (): void => { - dispatch(closeModal({ name: ModalName.BackupReminderWarning })) - } - - const checkForSwipeToDismiss = (): void => { - if (!closedByButtonRef.current) { - // Modal was swiped to dismiss, should set backup reminder timestamp - dispatch(setBackupReminderLastSeenTs(Date.now())) - } - - // Reset the ref and close the modal - closedByButtonRef.current = false - onClose() - } - - const openBackupReminderModal = (): void => { - closedByButtonRef.current = true - dispatch(openModal({ name: ModalName.BackupReminder })) - onClose() - } - - const onConfirm = (): void => { - closedByButtonRef.current = true - dispatch(setBackupReminderLastSeenTs(Date.now())) - onClose() - } - - return ( - - ) -} diff --git a/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap b/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap index 0065567168b..f668cc06697 100644 --- a/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap +++ b/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap @@ -157,9 +157,8 @@ exports[`AccountSwitcher renders correctly 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "overflow": "hidden", } @@ -223,9 +222,8 @@ exports[`AccountSwitcher renders correctly 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } @@ -350,10 +348,10 @@ exports[`AccountSwitcher renders correctly 1`] = ` style={ { "color": "#000000", - "fontFamily": "Basel Grotesk", - "fontSize": 17, + "fontFamily": "Basel-Medium", + "fontSize": 15, "fontWeight": "500", - "lineHeight": 19.549999999999997, + "lineHeight": 20, } } suppressHighlighting={true} @@ -588,10 +586,10 @@ exports[`AccountSwitcher renders correctly 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", - "fontSize": 17, + "fontFamily": "Basel-Medium", + "fontSize": 15, "fontWeight": "500", - "lineHeight": 19.549999999999997, + "lineHeight": 20, } } suppressHighlighting={true} diff --git a/apps/mobile/src/app/navigation/NavBar.tsx b/apps/mobile/src/app/navigation/NavBar.tsx index 855fd04353d..a0877b46161 100644 --- a/apps/mobile/src/app/navigation/NavBar.tsx +++ b/apps/mobile/src/app/navigation/NavBar.tsx @@ -35,6 +35,7 @@ import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { isAndroid, isIOS } from 'utilities/src/platform' import { setHasUsedExplore } from 'wallet/src/features/behaviorHistory/slice' +import { usePortfolioValueModifiers } from 'wallet/src/features/dataApi/balances' import { prepareSwapFormState } from 'wallet/src/features/transactions/swap/utils' import { useActiveAccountAddressWithThrow } from 'wallet/src/features/wallet/hooks' @@ -111,7 +112,8 @@ const SwapFAB = memo(function _SwapFAB({ activeScale = 0.96 }: SwapTabBarButtonP const isDarkMode = useIsDarkMode() const activeAccountAddress = useActiveAccountAddressWithThrow() - const inputCurrencyId = useHighestBalanceNativeCurrencyId(activeAccountAddress) + const valueModifiers = usePortfolioValueModifiers(activeAccountAddress) ?? [] + const inputCurrencyId = useHighestBalanceNativeCurrencyId(activeAccountAddress, valueModifiers) const onPress = useCallback(async () => { dispatch( @@ -164,7 +166,7 @@ const SwapFAB = memo(function _SwapFAB({ activeScale = 0.96 }: SwapTabBarButtonP > - + {t('common.button.swap')} diff --git a/apps/mobile/src/app/navigation/components.tsx b/apps/mobile/src/app/navigation/components.tsx index ff59beda7e7..ea31bfb4a44 100644 --- a/apps/mobile/src/app/navigation/components.tsx +++ b/apps/mobile/src/app/navigation/components.tsx @@ -1,28 +1,9 @@ -import { useTranslation } from 'react-i18next' import { BackButton } from 'src/components/buttons/BackButton' -import { Text, TouchableArea } from 'ui/src' import { RotatableChevron } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' -import Trace from 'uniswap/src/features/telemetry/Trace' -import { ElementName } from 'uniswap/src/features/telemetry/constants' -import { TestID } from 'uniswap/src/test/fixtures/testIDs' export const renderHeaderBackButton = (): JSX.Element => export const renderHeaderBackImage = (): JSX.Element => ( ) - -export const HeaderSkipButton = ({ onPress }: { onPress: () => void }): JSX.Element => { - const { t } = useTranslation() - - return ( - - onPress()}> - - {t('common.button.skip')} - - - - ) -} diff --git a/apps/mobile/src/app/navigation/types.ts b/apps/mobile/src/app/navigation/types.ts index 22c408cf7cc..4ef29b403ec 100644 --- a/apps/mobile/src/app/navigation/types.ts +++ b/apps/mobile/src/app/navigation/types.ts @@ -87,7 +87,7 @@ export type SharedUnitagScreenParams = { export type OnboardingStackParamList = { [OnboardingScreens.AppLoading]: undefined - [OnboardingScreens.BackupManual]: BackupFormParams & OnboardingStackBaseParams & { fromCloudBackup?: boolean } + [OnboardingScreens.BackupManual]: BackupFormParams & OnboardingStackBaseParams [OnboardingScreens.BackupCloudPasswordCreate]: BackupFormParams & OnboardingStackBaseParams [OnboardingScreens.BackupCloudPasswordConfirm]: CloudBackupFormParams & OnboardingStackBaseParams [OnboardingScreens.BackupCloudProcessing]: CloudBackupFormParams & OnboardingStackBaseParams diff --git a/apps/mobile/src/app/saga.ts b/apps/mobile/src/app/saga.ts index 57e872ca458..13ed4c2c795 100644 --- a/apps/mobile/src/app/saga.ts +++ b/apps/mobile/src/app/saga.ts @@ -9,8 +9,8 @@ import { restoreMnemonicCompleteWatcher } from 'src/features/wallet/saga' import { walletConnectSaga } from 'src/features/walletConnect/saga' import { signWcRequestSaga } from 'src/features/walletConnect/signWcRequestSaga' import { call, delay, select, spawn } from 'typed-redux-saga' -import { appLanguageWatcherSaga } from 'uniswap/src/features/language/saga' import { apolloClientRef } from 'wallet/src/data/apollo/usePersistedApolloClient' +import { appLanguageWatcherSaga } from 'wallet/src/features/language/saga' import { swapActions, swapReducer, swapSaga, swapSagaName } from 'wallet/src/features/transactions/swap/swapSaga' import { tokenWrapActions, diff --git a/apps/mobile/src/app/schema.ts b/apps/mobile/src/app/schema.ts index 454a54db0ba..90c159f3253 100644 --- a/apps/mobile/src/app/schema.ts +++ b/apps/mobile/src/app/schema.ts @@ -1,7 +1,7 @@ /* eslint-disable max-lines */ -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' -import { Language } from 'uniswap/src/features/language/constants' import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { initialFiatCurrencyState } from 'wallet/src/features/fiatCurrency/slice' +import { initialLanguageState } from 'wallet/src/features/language/slice' import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' // only add fields that are persisted @@ -367,7 +367,7 @@ export const v51Schema = { initialState: undefined, }, }, - languageSettings: { currentLanguage: Language.English }, + languageSettings: initialLanguageState, } export const v52Schema = { @@ -379,12 +379,12 @@ export const v52Schema = { initialState: undefined, }, }, - fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, + fiatCurrencySettings: initialFiatCurrencyState, } const v53SchemaIntermediate = { ...v52Schema, - languageSettings: { currentLanguage: Language.English }, + languageSettings: initialLanguageState, modals: { ...v52Schema.modals, ['language-selector']: undefined }, } delete v53SchemaIntermediate.modals['language-selector'] @@ -578,43 +578,6 @@ delete v75SchemaIntermediate.behaviorHistory.hasSubmittedHoldToSwap export const v75Schema = v75SchemaIntermediate -export const v76Schema = { - ...v75Schema, - behaviorHistory: { - ...v75Schema.behaviorHistory, - createdOnboardingRedesignAccount: false, - }, -} - -export const v77Schema = { - ...v76Schema, - tokens: { - dismissedTokenWarnings: {}, - }, -} - -const v78SchemaIntermediate = { - ...v77Schema, - languageSettings: undefined, - userSettings: { - ...v77Schema.userSettings, - currentLanguage: v77Schema.languageSettings.currentLanguage, - }, -} -delete v78SchemaIntermediate.languageSettings -export const v78Schema = v78SchemaIntermediate - -const v79SchemaIntermediate = { - ...v78Schema, - fiatCurrencySettings: undefined, - userSettings: { - ...v78Schema.userSettings, - currentLanguage: v78Schema.fiatCurrencySettings.currentCurrency, - }, -} -delete v79SchemaIntermediate.fiatCurrencySettings -export const v79Schema = v79SchemaIntermediate - // TODO: [MOB-201] use function with typed output when API reducers are removed from rootReducer // export const getSchema = (): RootState => v0Schema -export const getSchema = (): typeof v79Schema => v79Schema +export const getSchema = (): typeof v75Schema => v75Schema diff --git a/apps/mobile/src/assets/fonts/Basel-Book.ttf b/apps/mobile/src/assets/fonts/Basel-Book.ttf new file mode 100644 index 0000000000000000000000000000000000000000..136d64dd476835469eccf8dcf46c396fb40f16ef GIT binary patch literal 44472 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

T&+TF}4*b4_a!y(JT8BQ}l=OVp=`UTmU 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 diff --git a/apps/mobile/src/assets/fonts/Basel-Grotesk-Medium.otf b/apps/mobile/src/assets/fonts/Basel-Grotesk-Medium.otf deleted file mode 100644 index 344235fe1c3f55b8a14182aacc3b4e1b6215610e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275116 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 z 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 {label} diff --git a/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap b/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap index 5140ce6eb90..6c6beeda549 100644 --- a/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap +++ b/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap @@ -16,9 +16,8 @@ exports[`DatetimeText renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "padding": 0, } @@ -53,9 +52,8 @@ exports[`PriceText renders loading state 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 106, - "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -92,9 +90,8 @@ exports[`PriceText renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 106, - "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -120,9 +117,8 @@ exports[`PriceText renders without error 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 106, - "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -159,9 +155,8 @@ exports[`PriceText renders without error less than a dollar 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 106, - "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -187,9 +182,8 @@ exports[`PriceText renders without error less than a dollar 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 106, - "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -262,9 +256,8 @@ exports[`RelativeChangeText renders loading state 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "marginHorizontal": 0, "opacity": 0, @@ -284,9 +277,8 @@ exports[`RelativeChangeText renders loading state 1`] = ` } style={ { - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "opacity": 0, "padding": 0, @@ -433,9 +425,8 @@ exports[`RelativeChangeText renders without error 1`] = ` style={ { "color": "#FF5F52", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "padding": 0, } diff --git a/apps/mobile/src/components/PriceExplorer/usePrice.tsx b/apps/mobile/src/components/PriceExplorer/usePrice.tsx index 5fa74295fb2..438b15b9625 100644 --- a/apps/mobile/src/components/PriceExplorer/usePrice.tsx +++ b/apps/mobile/src/components/PriceExplorer/usePrice.tsx @@ -2,8 +2,8 @@ import { useMemo } from 'react' import { SharedValue, useAnimatedReaction, useDerivedValue, useSharedValue } from 'react-native-reanimated' import { useLineChart, useLineChartPrice as useRNWagmiChartLineChartPrice } from 'react-native-wagmi-charts' import { numberToLocaleStringWorklet, numberToPercentWorklet } from 'src/utils/reanimated' -import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { useCurrentLocale } from 'uniswap/src/features/language/hooks' +import { useAppFiatCurrencyInfo } from 'wallet/src/features/fiatCurrency/hooks' +import { useCurrentLocale } from 'wallet/src/features/language/hooks' export type ValueAndFormatted = { value: Readonly> diff --git a/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts b/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts index 531ad78790f..3d9347d4c95 100644 --- a/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts +++ b/apps/mobile/src/components/PriceExplorer/usePriceHistory.test.ts @@ -17,8 +17,8 @@ import { tokenProject, tokenProjectMarket, usdcTokenProject, -} from 'uniswap/src/test/fixtures' -import { queryResolvers } from 'uniswap/src/test/utils' +} from 'wallet/src/test/fixtures' +import { queryResolvers } from 'wallet/src/test/utils' const mockTokenProjectsQuery = (historyPrices: number[]) => (): TokenProjectType[] => { const history = historyPrices.map((value) => timestampedAmount({ value })) diff --git a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts index ec27fd25173..601a89000de 100644 --- a/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts +++ b/apps/mobile/src/components/PriceExplorer/usePriceHistory.ts @@ -10,8 +10,8 @@ import { } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { GqlResult } from 'uniswap/src/data/types' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { isError, isNonPollingRequestInFlight } from 'wallet/src/data/utils' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' export type TokenSpotData = { value: SharedValue diff --git a/apps/mobile/src/components/QRCodeScanner/QRCodeScanner.tsx b/apps/mobile/src/components/QRCodeScanner/QRCodeScanner.tsx index daaefe57a99..32e709b5847 100644 --- a/apps/mobile/src/components/QRCodeScanner/QRCodeScanner.tsx +++ b/apps/mobile/src/components/QRCodeScanner/QRCodeScanner.tsx @@ -9,7 +9,7 @@ import { FadeIn, FadeOut } from 'react-native-reanimated' import { Defs, LinearGradient, Path, Rect, Stop, Svg } from 'react-native-svg' import { Button, Flex, SpinningLoader, Text, useSporeColors } from 'ui/src' import CameraScan from 'ui/src/assets/icons/camera-scan.svg' -import { Global, PhotoStacked } from 'ui/src/components/icons' +import { Global, Photo } from 'ui/src/components/icons' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { iconSizes, spacing } from 'ui/src/theme' @@ -235,7 +235,7 @@ export function QRCodeScanner(props: QRCodeScannerProps | WCScannerProps): JSX.E {isReadingImageFile ? ( ) : ( - + )} diff --git a/apps/mobile/src/components/RecipientSelect/hooks.test.ts b/apps/mobile/src/components/RecipientSelect/hooks.test.ts index ccf0e8893aa..9de94f44f01 100644 --- a/apps/mobile/src/components/RecipientSelect/hooks.test.ts +++ b/apps/mobile/src/components/RecipientSelect/hooks.test.ts @@ -3,19 +3,14 @@ import { waitFor } from '@testing-library/react-native' import { toIncludeSameMembers } from 'jest-extended' import { MobileState } from 'src/app/mobileReducer' import { renderHookWithProviders } from 'src/test/render' -import { SearchableRecipient } from 'uniswap/src/features/address/types' import { TransactionsState } from 'uniswap/src/features/transactions/slice' import { TransactionStatus } from 'uniswap/src/features/transactions/types/transactionDetails' -import { - SAMPLE_SEED_ADDRESS_1, - SAMPLE_SEED_ADDRESS_2, - sendTokenTransactionInfo, - transactionDetails, -} from 'uniswap/src/test/fixtures' +import { sendTokenTransactionInfo, transactionDetails } from 'uniswap/src/test/fixtures' import { UniverseChainId, WalletChainId } from 'uniswap/src/types/chains' import { useRecipients } from 'wallet/src/components/RecipientSearch/hooks' +import { SearchableRecipient } from 'wallet/src/features/address/types' import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' -import { signerMnemonicAccount } from 'wallet/src/test/fixtures' +import { SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, signerMnemonicAccount } from 'wallet/src/test/fixtures' expect.extend({ toIncludeSameMembers }) diff --git a/apps/mobile/src/components/RemoveWallet/AssociatedAccountsList.tsx b/apps/mobile/src/components/RemoveWallet/AssociatedAccountsList.tsx index e26db0402a8..5b594520f0e 100644 --- a/apps/mobile/src/components/RemoveWallet/AssociatedAccountsList.tsx +++ b/apps/mobile/src/components/RemoveWallet/AssociatedAccountsList.tsx @@ -4,10 +4,10 @@ import { Flex, Text } from 'ui/src' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { spacing } from 'ui/src/theme' import { AccountListQuery } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay' import { useAccountList } from 'wallet/src/features/accounts/hooks' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { Account } from 'wallet/src/features/wallet/accounts/types' const ADDRESS_ROW_HEIGHT = 40 diff --git a/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectedNetworksModal.tsx b/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectedNetworksModal.tsx index a694a60c1ab..1994bada371 100644 --- a/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectedNetworksModal.tsx +++ b/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectedNetworksModal.tsx @@ -69,7 +69,7 @@ export function DappConnectedNetworkModal({ session, onClose }: DappConnectedNet values={{ dappNameOrUrl: dapp.name || dapp.url }} /> - + {dapp.url} diff --git a/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx b/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx index 8335d4db240..70fac046a8a 100644 --- a/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx +++ b/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectionItem.tsx @@ -116,7 +116,7 @@ export function DappConnectionItem({ {dapp.name || dapp.url} - + {dapp.url} diff --git a/apps/mobile/src/components/Requests/ModalWithOverlay/ScrollDownOverlay.tsx b/apps/mobile/src/components/Requests/ModalWithOverlay/ScrollDownOverlay.tsx index 15ba2efdd31..11d0bb05e52 100644 --- a/apps/mobile/src/components/Requests/ModalWithOverlay/ScrollDownOverlay.tsx +++ b/apps/mobile/src/components/Requests/ModalWithOverlay/ScrollDownOverlay.tsx @@ -44,7 +44,7 @@ export function ScrollDownOverlay({ onScrollDownPress, scrollDownButonText }: Sc - + {scrollDownButonText ?? t('common.button.scrollDown')} diff --git a/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx b/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx index 74ec91ee19c..4451c8371ee 100644 --- a/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/ClientDetails.tsx @@ -38,7 +38,7 @@ export function ClientDetails({ py="$spacing4" showIcon={false} size={iconSizes.icon12} - textVariant="buttonLabel2" + textVariant="buttonLabel4" url={dapp.url} /> diff --git a/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx b/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx index 2b442440c54..b6c694a72b5 100644 --- a/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx @@ -10,7 +10,6 @@ import { TokenLogo } from 'uniswap/src/components/CurrencyLogo/TokenLogo' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { GasFeeResult } from 'uniswap/src/features/gas/types' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { useOnChainCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency' @@ -19,6 +18,7 @@ import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { NumberType } from 'utilities/src/format/types' import { NetworkFee } from 'wallet/src/components/network/NetworkFee' import { RemoteImage } from 'wallet/src/features/images/RemoteImage' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { useActiveAccountAddressWithThrow } from 'wallet/src/features/wallet/hooks' type Props = { diff --git a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx index 98f45f32f24..5c527840fc4 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx @@ -21,12 +21,11 @@ import { WalletConnectRequest, isTransactionRequest } from 'src/features/walletC import { GasSpeed } from 'uniswap/src/features/gas/types' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { useIsBlocked } from 'uniswap/src/features/trm/hooks' import { EthMethod, UwULinkMethod, WCEventType, WCRequestOutcome } from 'uniswap/src/types/walletConnect' import { areAddressesEqual } from 'uniswap/src/utils/addresses' import { formatExternalTxnWithGasEstimates } from 'wallet/src/features/gas/formatExternalTxnWithGasEstimates' import { useTransactionGasFee } from 'wallet/src/features/gas/hooks' -import { useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' import { useSignerAccounts } from 'wallet/src/features/wallet/hooks' interface Props { diff --git a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx index 6bfaeacfda8..6ec08a0d6b9 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx @@ -13,7 +13,7 @@ import { isTransactionRequest, } from 'src/features/walletConnect/walletConnectSlice' import { Flex, Text, useSporeColors } from 'ui/src' -import AlertTriangleFilled from 'ui/src/assets/icons/alert-triangle-filled.svg' +import AlertTriangle from 'ui/src/assets/icons/alert-triangle.svg' import { iconSizes } from 'ui/src/theme' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { GasFeeResult } from 'uniswap/src/features/gas/types' @@ -119,11 +119,7 @@ export function WalletConnectRequestModalContent({ + } textColor="$DEP_accentWarning" title={t('walletConnect.request.error.network')} @@ -175,7 +171,7 @@ function WarningSection({ if (!isTransactionRequest(request)) { return ( - + {t('walletConnect.request.warning.general.message')} diff --git a/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx b/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx index ab8937a9a60..18d4e19d77e 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx +++ b/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionModal.tsx @@ -291,7 +291,7 @@ function PendingConnectionModalContent({ px="$spacing8" py="$spacing4" showIcon={false} - textVariant="buttonLabel2" + textVariant="buttonLabel4" url={pendingSession.dapp.url} /> diff --git a/apps/mobile/src/components/Requests/Uwulink/utils.ts b/apps/mobile/src/components/Requests/Uwulink/utils.ts index 3c9339a417f..0a09b881032 100644 --- a/apps/mobile/src/components/Requests/Uwulink/utils.ts +++ b/apps/mobile/src/components/Requests/Uwulink/utils.ts @@ -3,6 +3,7 @@ import { WalletConnectRequest } from 'src/features/walletConnect/walletConnectSl import { AssetType } from 'uniswap/src/entities/assets' import { DynamicConfigs, UwuLinkConfigKey } from 'uniswap/src/features/gating/configs' import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' +import { RPCType } from 'uniswap/src/types/chains' import { EthMethod, EthTransaction, @@ -212,7 +213,7 @@ async function toTokenTransferRequest( providerManager: ProviderManager, contractManager: ContractManager, ): Promise { - const provider = providerManager.getProvider(request.chainId) + const provider = providerManager.getProvider(request.chainId, RPCType.Public) const params: SendCurrencyParams = { type: AssetType.Currency, account, diff --git a/apps/mobile/src/components/Settings/OnboardingRow.tsx b/apps/mobile/src/components/Settings/OnboardingRow.tsx index 0d558b7593c..eb9084ebb1f 100644 --- a/apps/mobile/src/components/Settings/OnboardingRow.tsx +++ b/apps/mobile/src/components/Settings/OnboardingRow.tsx @@ -6,7 +6,6 @@ import UniswapIcon from 'ui/src/assets/icons/uniswap-logo.svg' import { RotatableChevron } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { logger } from 'utilities/src/logger/logger' -import { setCreatedOnboardingRedesignAccount } from 'wallet/src/features/behaviorHistory/slice' import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' import { useSignerAccounts } from 'wallet/src/features/wallet/hooks' import { resetWallet, setFinishedOnboarding } from 'wallet/src/features/wallet/slice' @@ -23,7 +22,6 @@ export function OnboardingRow({ iconProps }: { iconProps: SvgProps }): JSX.Eleme .then(() => { navigation.goBack() dispatch(resetWallet()) - dispatch(setCreatedOnboardingRedesignAccount(false)) dispatch(setFinishedOnboarding({ finishedOnboarding: false })) }) .catch((error) => { diff --git a/apps/mobile/src/components/Settings/ResetBehaviorHistoryRow.tsx b/apps/mobile/src/components/Settings/ResetBehaviorHistoryRow.tsx deleted file mode 100644 index e96b66db0fc..00000000000 --- a/apps/mobile/src/components/Settings/ResetBehaviorHistoryRow.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { SvgProps } from 'react-native-svg' -import { useDispatch } from 'react-redux' -import { Flex, Text, TouchableArea } from 'ui/src' -import UniswapIcon from 'ui/src/assets/icons/uniswap-logo.svg' -import { resetBehaviorHistory } from 'wallet/src/features/behaviorHistory/slice' - -export function ResetBehaviorHistoryRow({ iconProps }: { iconProps: SvgProps }): JSX.Element { - const dispatch = useDispatch() - - const onPressReset = (): void => { - dispatch(resetBehaviorHistory()) - } - - return ( - - - - - - - - Reset behavior history - - - - - ) -} diff --git a/apps/mobile/src/components/Settings/SettingsRow.tsx b/apps/mobile/src/components/Settings/SettingsRow.tsx index 87f75054a40..01d7dbf911b 100644 --- a/apps/mobile/src/components/Settings/SettingsRow.tsx +++ b/apps/mobile/src/components/Settings/SettingsRow.tsx @@ -9,12 +9,13 @@ import { SettingsStackParamList, } from 'src/app/navigation/types' import { openModal } from 'src/features/modals/modalSlice' -import { Flex, Switch, Text, TouchableArea, useSporeColors } from 'ui/src' +import { Flex, Text, TouchableArea, useSporeColors } from 'ui/src' import { RotatableChevron } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { openUri } from 'uniswap/src/utils/linking' +import { Switch } from 'wallet/src/components/buttons/Switch' import { Arrow } from 'wallet/src/components/icons/Arrow' export interface SettingsSection { @@ -96,14 +97,14 @@ export function SettingsRow({ {text} {subText && ( - + {subText} )} {onToggle && typeof isToggleEnabled === 'boolean' ? ( - + ) : screen || modal ? ( {currentSetting ? ( diff --git a/apps/mobile/src/components/Settings/WalletSettings.tsx b/apps/mobile/src/components/Settings/WalletSettings.tsx index 9a246af8850..32114959451 100644 --- a/apps/mobile/src/components/Settings/WalletSettings.tsx +++ b/apps/mobile/src/components/Settings/WalletSettings.tsx @@ -75,7 +75,7 @@ export function WalletSettings(): JSX.Element { })} {allAccounts.length > DEFAULT_ACCOUNTS_TO_DISPLAY && ( diff --git a/apps/mobile/src/components/TokenDetails/BuyNativeTokenModal.tsx b/apps/mobile/src/components/TokenDetails/BuyNativeTokenModal.tsx index 2caaa521845..4f89986c4fe 100644 --- a/apps/mobile/src/components/TokenDetails/BuyNativeTokenModal.tsx +++ b/apps/mobile/src/components/TokenDetails/BuyNativeTokenModal.tsx @@ -48,7 +48,7 @@ export function BuyNativeTokenModal({ diff --git a/apps/mobile/src/components/TokenDetails/LinkButton.tsx b/apps/mobile/src/components/TokenDetails/LinkButton.tsx index 321857a13d5..9a4c8165199 100644 --- a/apps/mobile/src/components/TokenDetails/LinkButton.tsx +++ b/apps/mobile/src/components/TokenDetails/LinkButton.tsx @@ -77,7 +77,7 @@ export function LinkButton({ > {Icon && } - + {label} {buttonType === LinkButtonType.Copy && ( diff --git a/apps/mobile/src/components/TokenDetails/TokenBalances.tsx b/apps/mobile/src/components/TokenDetails/TokenBalances.tsx index fbc3d904a6e..a1a416e6e4d 100644 --- a/apps/mobile/src/components/TokenDetails/TokenBalances.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenBalances.tsx @@ -8,12 +8,12 @@ import { TokenLogo } from 'uniswap/src/components/CurrencyLogo/TokenLogo' import { InlineNetworkPill } from 'uniswap/src/components/network/NetworkPill' import { AccountType } from 'uniswap/src/features/accounts/types' import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import Trace from 'uniswap/src/features/telemetry/Trace' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' import { CurrencyId } from 'uniswap/src/types/currency' import { getSymbolDisplayText } from 'uniswap/src/utils/currency' import { NumberType } from 'utilities/src/format/types' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { useActiveAccount, useDisplayName } from 'wallet/src/features/wallet/hooks' /** @@ -151,7 +151,7 @@ function OtherChainBalance({ diff --git a/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx b/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx index 7d83d2c69be..81d20e2cbde 100644 --- a/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx +++ b/apps/mobile/src/components/TokenDetails/TokenDetailsStats.tsx @@ -6,11 +6,11 @@ import { Flex, Text, TouchableArea, useSporeColors } from 'ui/src' import { ChartBar, ChartPie, Language as LanguageIcon, TrendDown, TrendUp } from 'ui/src/components/icons' import { DEP_accentColors, iconSizes, validColor } from 'ui/src/theme' import { TokenDetailsScreenQuery } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' -import { Language } from 'uniswap/src/features/language/constants' -import { useCurrentLanguage, useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { NumberType } from 'utilities/src/format/types' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' +import { Language } from 'wallet/src/features/language/constants' +import { useCurrentLanguage, useCurrentLanguageInfo } from 'wallet/src/features/language/hooks' function StatsRow({ label, @@ -166,7 +166,7 @@ export function TokenDetailsStats({ {currentLanguageInfo.displayName} - + {t('token.stats.translation.original')} diff --git a/apps/mobile/src/components/TokenDetails/hooks.test.ts b/apps/mobile/src/components/TokenDetails/hooks.test.ts index 076c9accd97..e585980d644 100644 --- a/apps/mobile/src/components/TokenDetails/hooks.test.ts +++ b/apps/mobile/src/components/TokenDetails/hooks.test.ts @@ -2,6 +2,7 @@ import { useCrossChainBalances, useTokenDetailsNavigation } from 'src/components import { preloadedMobileState } from 'src/test/fixtures' import { act, renderHook, waitFor } from 'src/test/test-utils' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils' +import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { SAMPLE_CURRENCY_ID_1, portfolio, @@ -9,9 +10,8 @@ import { tokenBalance, usdcArbitrumToken, usdcBaseToken, -} from 'uniswap/src/test/fixtures' -import { queryResolvers } from 'uniswap/src/test/utils' -import { MobileScreens } from 'uniswap/src/types/screens/mobile' +} from 'wallet/src/test/fixtures' +import { queryResolvers } from 'wallet/src/test/utils' const mockedNavigation = { navigate: jest.fn(), diff --git a/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx b/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx index 31cb857d789..e960f3146e7 100644 --- a/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx +++ b/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx @@ -1,19 +1,16 @@ -import { BottomSheetSectionList } from '@gorhom/bottom-sheet' -import React, { memo, useCallback, useMemo, useRef, useState } from 'react' +import { BottomSheetFlatList } from '@gorhom/bottom-sheet' +import React, { memo, useCallback, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { Keyboard, ListRenderItemInfo } from 'react-native' import { Flex, Inset, Loader } from 'ui/src' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { TokenOptionItem } from 'uniswap/src/components/TokenSelector/TokenOptionItem' import { useBottomSheetFocusHook } from 'uniswap/src/components/modals/hooks' -import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' -import { FORCurrencyOrBalance, FiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/types' -import { getUnsupportedFORTokensWithBalance, isSupportedFORCurrency } from 'uniswap/src/features/fiatOnRamp/utils' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' -import { useDismissedTokenWarnings } from 'uniswap/src/features/tokens/slice/hooks' +import { FiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/types' +import { useTokenWarningDismissed } from 'uniswap/src/features/tokens/slice/hooks' import { CurrencyId } from 'uniswap/src/types/currency' import { NumberType } from 'utilities/src/format/types' -import { ListSeparatorToggle } from 'wallet/src/features/transactions/TransactionDetails/TransactionDetails' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' interface Props { onSelectCurrency: (currency: FiatOnRampCurrency) => void @@ -21,49 +18,35 @@ interface Props { error: boolean loading: boolean list: FiatOnRampCurrency[] | undefined - balancesById: Record | undefined - selectedCurrency?: FiatOnRampCurrency - isOffRamp: boolean } function TokenOptionItemWrapper({ currency, onSelectCurrency, - currencyBalance, - isSelected, - showUnsupported, }: { - currency: FORCurrencyOrBalance + currency: FiatOnRampCurrency onSelectCurrency: (currency: FiatOnRampCurrency) => void - currencyBalance: Maybe - isSelected?: boolean - showUnsupported?: boolean }): JSX.Element | null { const { currencyInfo } = currency - const { quantity, balanceUSD } = currencyBalance || {} - const isUnsupported = !isSupportedFORCurrency(currency) const option = useMemo( - () => (currencyInfo ? { currencyInfo, quantity: quantity || null, balanceUSD, isUnsupported } : null), - [currencyInfo, balanceUSD, quantity, isUnsupported], + // we need to convert to TokenOption without quantity and balanceUSD + // to use in Token Selector + () => (currencyInfo ? { currencyInfo, quantity: 0, balanceUSD: 0 } : null), + [currencyInfo], ) const onPress = useCallback(() => onSelectCurrency?.(currency), [currency, onSelectCurrency]) - const { tokenWarningDismissed, onDismissTokenWarning } = useDismissedTokenWarnings(currencyInfo?.currency) + const { tokenWarningDismissed, dismissWarningCallback } = useTokenWarningDismissed(currencyInfo?.currencyId) const { convertFiatAmountFormatted, formatNumberOrString } = useLocalizationContext() if (!option) { return null } - if (!showUnsupported && isUnsupported) { - return null - } - return ( ) => { - const { currencyInfo } = currency - const currencyBalance = currencyInfo && balancesById?.[currencyInfo.currencyId] - return ( - - ) + const renderItem = useCallback( + ({ item: currency }: ListRenderItemInfo) => { + return }, - [onSelectCurrency, balancesById, selectedCurrency, showMore], + [onSelectCurrency], ) if (error) { @@ -136,36 +87,17 @@ function _TokenFiatOnRampList({ } return ( - } ListFooterComponent={} + data={list} focusHook={useBottomSheetFocusHook} keyExtractor={key} keyboardDismissMode="on-drag" keyboardShouldPersistTaps="always" renderItem={renderItem} - renderSectionHeader={({ section }) => { - if (section.title !== ListSection.UNSUPPORTED) { - return <> - } - - return ( - - { - setShowMore(!showMore) - }} - /> - - ) - }} - sections={tokenList} showsVerticalScrollIndicator={false} - stickySectionHeadersEnabled={false} windowSize={5} /> ) diff --git a/apps/mobile/src/components/Trace/TraceUserProperties.test.tsx b/apps/mobile/src/components/Trace/TraceUserProperties.test.tsx index c29997d8ee7..f7515049ed8 100644 --- a/apps/mobile/src/components/Trace/TraceUserProperties.test.tsx +++ b/apps/mobile/src/components/Trace/TraceUserProperties.test.tsx @@ -7,13 +7,13 @@ import { AuthMethod } from 'src/features/telemetry/utils' import * as versionUtils from 'src/utils/version' import * as useIsDarkModeFile from 'ui/src/hooks/useIsDarkMode' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' -import * as fiatCurrencyHooks from 'uniswap/src/features/fiatCurrency/hooks' -import * as languageHooks from 'uniswap/src/features/language/hooks' import * as userSettingsHooks from 'uniswap/src/features/settings/hooks' import { MobileUserPropertyName } from 'uniswap/src/features/telemetry/user' // eslint-disable-next-line no-restricted-imports import { analytics } from 'utilities/src/telemetry/analytics/analytics' +import { FiatCurrency } from 'wallet/src/features/fiatCurrency/constants' +import * as fiatCurrencyHooks from 'wallet/src/features/fiatCurrency/hooks' +import * as languageHooks from 'wallet/src/features/language/hooks' import { BackupType } from 'wallet/src/features/wallet/accounts/types' import * as walletHooks from 'wallet/src/features/wallet/hooks' import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' diff --git a/apps/mobile/src/components/Trace/TraceUserProperties.tsx b/apps/mobile/src/components/Trace/TraceUserProperties.tsx index ebe0dad10f2..a2bbc7eeb70 100644 --- a/apps/mobile/src/components/Trace/TraceUserProperties.tsx +++ b/apps/mobile/src/components/Trace/TraceUserProperties.tsx @@ -5,15 +5,15 @@ import { useBiometricAppSettings, useDeviceSupportsBiometricAuth } from 'src/fea import { getAuthMethod } from 'src/features/telemetry/utils' import { getFullAppVersion } from 'src/utils/version' import { useIsDarkMode } from 'ui/src' -import { useAppFiatCurrency } from 'uniswap/src/features/fiatCurrency/hooks' -import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { useHideSmallBalancesSetting, useHideSpamTokensSetting } from 'uniswap/src/features/settings/hooks' import { MobileUserPropertyName, setUserProperty } from 'uniswap/src/features/telemetry/user' import { isAndroid } from 'utilities/src/platform' import { selectAllowAnalytics } from 'wallet/src/features/telemetry/selectors' // eslint-disable-next-line no-restricted-imports import { analytics } from 'utilities/src/telemetry/analytics/analytics' +import { useAppFiatCurrency } from 'wallet/src/features/fiatCurrency/hooks' import { useGatingUserPropertyUsernames } from 'wallet/src/features/gating/userPropertyHooks' +import { useCurrentLanguageInfo } from 'wallet/src/features/language/hooks' import { Keyring } from 'wallet/src/features/wallet/Keyring/Keyring' import { BackupType } from 'wallet/src/features/wallet/accounts/types' import { diff --git a/apps/mobile/src/components/accounts/AccountCardItem.test.tsx b/apps/mobile/src/components/accounts/AccountCardItem.test.tsx index c29a85c791d..b31777f1576 100644 --- a/apps/mobile/src/components/accounts/AccountCardItem.test.tsx +++ b/apps/mobile/src/components/accounts/AccountCardItem.test.tsx @@ -1,8 +1,9 @@ import { AccountCardItem } from 'src/components/accounts/AccountCardItem' import { fireEvent, render, screen, waitFor } from 'src/test/test-utils' -import { ON_PRESS_EVENT_PAYLOAD, SAMPLE_SEED_ADDRESS_1, amount, portfolio } from 'uniswap/src/test/fixtures' -import { queryResolvers } from 'uniswap/src/test/utils' +import { ON_PRESS_EVENT_PAYLOAD } from 'uniswap/src/test/fixtures' import * as hooks from 'wallet/src/features/accounts/hooks' +import { SAMPLE_SEED_ADDRESS_1, amount, portfolio } from 'wallet/src/test/fixtures' +import { queryResolvers } from 'wallet/src/test/utils' describe(AccountCardItem, () => { beforeEach(() => { diff --git a/apps/mobile/src/components/accounts/AccountCardItem.tsx b/apps/mobile/src/components/accounts/AccountCardItem.tsx index 6d40595e4bd..20428614f01 100644 --- a/apps/mobile/src/components/accounts/AccountCardItem.tsx +++ b/apps/mobile/src/components/accounts/AccountCardItem.tsx @@ -9,7 +9,6 @@ import { closeModal, openModal } from 'src/features/modals/modalSlice' import { disableOnPress } from 'src/utils/disableOnPress' import { Flex, Text, TouchableArea, useHapticFeedback } from 'ui/src' import { iconSizes } from 'ui/src/theme' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { MobileScreens } from 'uniswap/src/types/screens/mobile' @@ -17,6 +16,7 @@ import { setClipboard } from 'uniswap/src/utils/clipboard' import { NumberType } from 'utilities/src/format/types' import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay' import { useAccountList } from 'wallet/src/features/accounts/hooks' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { pushNotification } from 'wallet/src/features/notifications/slice' import { AppNotificationType, CopyNotificationType } from 'wallet/src/features/notifications/types' @@ -46,7 +46,7 @@ function PortfolioValue({ const { data } = useAccountList({ fetchPolicy: 'cache-first', - addresses: [address], + addresses: address, }) const cachedPortfolioValue = data?.portfolios?.[0]?.tokensTotalDenominatedValue?.value diff --git a/apps/mobile/src/components/accounts/AccountHeader.tsx b/apps/mobile/src/components/accounts/AccountHeader.tsx index 3bb50671d35..7c5b3445e8e 100644 --- a/apps/mobile/src/components/accounts/AccountHeader.tsx +++ b/apps/mobile/src/components/accounts/AccountHeader.tsx @@ -8,7 +8,6 @@ import { openModal } from 'src/features/modals/modalSlice' import { Flex, ImpactFeedbackStyle, Text, TouchableArea, useHapticFeedback } from 'ui/src' import { CopyAlt, Settings } from 'ui/src/components/icons' import { AccountType } from 'uniswap/src/features/accounts/types' -import { useAvatar } from 'uniswap/src/features/address/avatar' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { MobileUserPropertyName, setUserProperty } from 'uniswap/src/features/telemetry/user' @@ -22,7 +21,7 @@ import { AnimatedUnitagDisplayName } from 'wallet/src/components/accounts/Animat import useIsFocused from 'wallet/src/features/focus/useIsFocused' import { pushNotification } from 'wallet/src/features/notifications/slice' import { AppNotificationType, CopyNotificationType } from 'wallet/src/features/notifications/types' -import { useDisplayName } from 'wallet/src/features/wallet/hooks' +import { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' import { selectActiveAccount, selectActiveAccountAddress } from 'wallet/src/features/wallet/selectors' import { DisplayNameType } from 'wallet/src/features/wallet/types' diff --git a/apps/mobile/src/components/accounts/AccountList.test.tsx b/apps/mobile/src/components/accounts/AccountList.test.tsx index 65e7b415761..944bceb0b71 100644 --- a/apps/mobile/src/components/accounts/AccountList.test.tsx +++ b/apps/mobile/src/components/accounts/AccountList.test.tsx @@ -1,11 +1,11 @@ import { AccountList } from 'src/components/accounts/AccountList' import { cleanup, fireEvent, render, screen } from 'src/test/test-utils' -import { ON_PRESS_EVENT_PAYLOAD, amounts, portfolio } from 'uniswap/src/test/fixtures' -import { createArray, queryResolvers } from 'uniswap/src/test/utils' +import { ON_PRESS_EVENT_PAYLOAD } from 'uniswap/src/test/fixtures' import { sanitizeAddressText, shortenAddress } from 'uniswap/src/utils/addresses' import { NumberType } from 'utilities/src/format/types' -import { ACCOUNT, readOnlyAccount, signerMnemonicAccount } from 'wallet/src/test/fixtures' +import { ACCOUNT, amounts, portfolio, readOnlyAccount, signerMnemonicAccount } from 'wallet/src/test/fixtures' import { mockLocalizedFormatter } from 'wallet/src/test/mocks' +import { createArray, queryResolvers } from 'wallet/src/test/utils' const tokensTotalDenominatedValue = amounts.md() const { resolvers } = queryResolvers({ diff --git a/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap b/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap index e3e9b80dd00..3dd216939a9 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap @@ -215,9 +215,8 @@ exports[`AccountCardItem renders correctly 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "overflow": "hidden", } @@ -238,9 +237,8 @@ exports[`AccountCardItem renders correctly 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/accounts/__snapshots__/AccountHeader.test.tsx.snap b/apps/mobile/src/components/accounts/__snapshots__/AccountHeader.test.tsx.snap index 71250b1b9f3..500a5d21827 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountHeader.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountHeader.test.tsx.snap @@ -298,9 +298,8 @@ exports[`AccountHeader renders correctly 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -352,7 +351,6 @@ exports[`AccountHeader renders correctly 1`] = ` "value": { "color": "#CECECE", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "opacity": 0, }, @@ -362,9 +360,8 @@ exports[`AccountHeader renders correctly 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "opacity": 0, } @@ -417,9 +414,8 @@ exports[`AccountHeader renders correctly 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap b/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap index be2a850f275..ce6e67a5b25 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap @@ -92,9 +92,8 @@ exports[`AccountList renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } @@ -323,9 +322,8 @@ exports[`AccountList renders without error 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "overflow": "hidden", } @@ -346,9 +344,8 @@ exports[`AccountList renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/buttons/__snapshots__/BackButton.test.tsx.snap b/apps/mobile/src/components/buttons/__snapshots__/BackButton.test.tsx.snap index 119692c6c0a..7dd2e22ca65 100644 --- a/apps/mobile/src/components/buttons/__snapshots__/BackButton.test.tsx.snap +++ b/apps/mobile/src/components/buttons/__snapshots__/BackButton.test.tsx.snap @@ -122,9 +122,8 @@ exports[`BackButton renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/buttons/__snapshots__/CopyTextButton.test.tsx.snap b/apps/mobile/src/components/buttons/__snapshots__/CopyTextButton.test.tsx.snap index c897400030c..c562750dab0 100644 --- a/apps/mobile/src/components/buttons/__snapshots__/CopyTextButton.test.tsx.snap +++ b/apps/mobile/src/components/buttons/__snapshots__/CopyTextButton.test.tsx.snap @@ -54,10 +54,10 @@ exports[`CopyTextButton renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", - "fontSize": 19, + "fontFamily": "Basel-Medium", + "fontSize": 17, "fontWeight": "500", - "lineHeight": 21.849999999999998, + "lineHeight": 24, } } suppressHighlighting={true} diff --git a/apps/mobile/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap b/apps/mobile/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap index 8990c0b4f4f..6d066d10d16 100644 --- a/apps/mobile/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap +++ b/apps/mobile/src/components/buttons/__snapshots__/LinkButton.test.tsx.snap @@ -42,7 +42,7 @@ exports[`LinkButton renders without error 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", } } suppressHighlighting={true} diff --git a/apps/mobile/src/components/explore/FavoriteHeaderRow.tsx b/apps/mobile/src/components/explore/FavoriteHeaderRow.tsx index ecf7f85bdb8..4825ff0a9a1 100644 --- a/apps/mobile/src/components/explore/FavoriteHeaderRow.tsx +++ b/apps/mobile/src/components/explore/FavoriteHeaderRow.tsx @@ -28,7 +28,7 @@ export function FavoriteHeaderRow({ ) : ( - + {t('common.button.done')} diff --git a/apps/mobile/src/components/explore/FavoriteTokenCard.test.tsx b/apps/mobile/src/components/explore/FavoriteTokenCard.test.tsx index cab12bedc20..2fa25c8f4d5 100644 --- a/apps/mobile/src/components/explore/FavoriteTokenCard.test.tsx +++ b/apps/mobile/src/components/explore/FavoriteTokenCard.test.tsx @@ -2,18 +2,12 @@ import { makeMutable } from 'react-native-reanimated' import configureMockStore from 'redux-mock-store' import FavoriteTokenCard, { FavoriteTokenCardProps } from 'src/components/explore/FavoriteTokenCard' import { act, cleanup, fireEvent, render, waitFor } from 'src/test/test-utils' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' -import { Language } from 'uniswap/src/features/language/constants' -import { - ON_PRESS_EVENT_PAYLOAD, - SAMPLE_CURRENCY_ID_1, - amount, - ethToken, - tokenProject, - tokenProjectMarket, -} from 'uniswap/src/test/fixtures' -import { queryResolvers } from 'uniswap/src/test/utils' +import { ON_PRESS_EVENT_PAYLOAD } from 'uniswap/src/test/fixtures' import { getSymbolDisplayText } from 'uniswap/src/utils/currency' +import { FiatCurrency } from 'wallet/src/features/fiatCurrency/constants' +import { Language } from 'wallet/src/features/language/constants' +import { SAMPLE_CURRENCY_ID_1, amount, ethToken, tokenProject, tokenProjectMarket } from 'wallet/src/test/fixtures' +import { queryResolvers } from 'wallet/src/test/utils' const mockedNavigation = { navigate: jest.fn(), @@ -135,7 +129,8 @@ describe('FavoriteTokenCard', () => { it('dispatches removeFavoriteToken action when remove button is pressed', async () => { const store = mockStore({ favorites: { tokens: [] }, - userSettings: { currentCurrency: FiatCurrency.UnitedStatesDollar, currentLanguage: Language.English }, + fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, + languageSettings: { currentLanguage: Language.English }, }) const { findByTestId } = render(, { resolvers, diff --git a/apps/mobile/src/components/explore/FavoriteTokenCard.tsx b/apps/mobile/src/components/explore/FavoriteTokenCard.tsx index efc97523d92..9a9a4a0e7d2 100644 --- a/apps/mobile/src/components/explore/FavoriteTokenCard.tsx +++ b/apps/mobile/src/components/explore/FavoriteTokenCard.tsx @@ -19,13 +19,13 @@ import { useFavoriteTokenCardQuery } from 'uniswap/src/data/graphql/uniswap-data import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' import { currencyIdToContractInput } from 'uniswap/src/features/dataApi/utils' import { removeFavoriteToken } from 'uniswap/src/features/favorites/slice' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { SectionName } from 'uniswap/src/features/telemetry/constants' import { UniverseChainId } from 'uniswap/src/types/chains' import { getSymbolDisplayText } from 'uniswap/src/utils/currency' import { NumberType } from 'utilities/src/format/types' import { RelativeChange } from 'wallet/src/components/text/RelativeChange' import { isNonPollingRequestInFlight } from 'wallet/src/data/utils' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' export const FAVORITE_TOKEN_CARD_LOADER_HEIGHT = 114 diff --git a/apps/mobile/src/components/explore/FavoriteWalletCard.test.tsx b/apps/mobile/src/components/explore/FavoriteWalletCard.test.tsx index a7ea8deb8c8..c38adcc7244 100644 --- a/apps/mobile/src/components/explore/FavoriteWalletCard.test.tsx +++ b/apps/mobile/src/components/explore/FavoriteWalletCard.test.tsx @@ -5,10 +5,10 @@ import { preloadedMobileState } from 'src/test/fixtures' import { fireEvent, render, waitFor } from 'src/test/test-utils' import * as ensHooks from 'uniswap/src/features/ens/api' import * as unitagHooks from 'uniswap/src/features/unitags/hooks' -import { ON_PRESS_EVENT_PAYLOAD, SAMPLE_SEED_ADDRESS_1 } from 'uniswap/src/test/fixtures' +import { ON_PRESS_EVENT_PAYLOAD } from 'uniswap/src/test/fixtures' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { sanitizeAddressText, shortenAddress } from 'uniswap/src/utils/addresses' -import { preloadedWalletReducerState, signerMnemonicAccount } from 'wallet/src/test/fixtures' +import { SAMPLE_SEED_ADDRESS_1, preloadedWalletReducerState, signerMnemonicAccount } from 'wallet/src/test/fixtures' const mockedNavigation = { navigate: jest.fn(), @@ -59,9 +59,9 @@ describe('FavoriteWalletCard', () => { it('renders ens name if available', () => { jest.spyOn(ensHooks, 'useENSName').mockReturnValue({ data: 'ensname.eth', - isLoading: false, - error: null, - } as ReturnType) + loading: false, + error: undefined, + }) const { queryByText } = render() diff --git a/apps/mobile/src/components/explore/FavoriteWalletCard.tsx b/apps/mobile/src/components/explore/FavoriteWalletCard.tsx index cc081cd4eb0..6720e24c8e3 100644 --- a/apps/mobile/src/components/explore/FavoriteWalletCard.tsx +++ b/apps/mobile/src/components/explore/FavoriteWalletCard.tsx @@ -12,11 +12,10 @@ import { Flex, ImpactFeedbackStyle, TouchableArea } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { borderRadii, iconSizes } from 'ui/src/theme' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' -import { useAvatar } from 'uniswap/src/features/address/avatar' import { removeWatchedAddress } from 'uniswap/src/features/favorites/slice' import { AccountIcon } from 'wallet/src/components/accounts/AccountIcon' import { DisplayNameText } from 'wallet/src/components/accounts/DisplayNameText' -import { useDisplayName } from 'wallet/src/features/wallet/hooks' +import { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' import { DisplayNameType } from 'wallet/src/features/wallet/types' export type FavoriteWalletCardProps = { diff --git a/apps/mobile/src/components/explore/SortButton.tsx b/apps/mobile/src/components/explore/SortButton.tsx index 96188f37e7e..1c6bfae4674 100644 --- a/apps/mobile/src/components/explore/SortButton.tsx +++ b/apps/mobile/src/components/explore/SortButton.tsx @@ -83,7 +83,7 @@ function _SortButton({ orderBy }: FilterGroupProps): JSX.Element { > {orderBy === TokenSortableField.Volume || orderBy === TokenSortableField.TotalValueLocked} - + {getTokensOrderBySelectedLabel(orderBy, t)} diff --git a/apps/mobile/src/components/explore/TokenItem.tsx b/apps/mobile/src/components/explore/TokenItem.tsx index 1012d8a8a47..268b0eeb8e9 100644 --- a/apps/mobile/src/components/explore/TokenItem.tsx +++ b/apps/mobile/src/components/explore/TokenItem.tsx @@ -11,7 +11,6 @@ import { disableOnPress } from 'src/utils/disableOnPress' import { Flex, ImpactFeedbackStyle, Text, TouchableArea, ViewProps } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { TokenLogo } from 'uniswap/src/components/CurrencyLogo/TokenLogo' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { MobileEventName, SectionName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { @@ -22,6 +21,7 @@ import { } from 'uniswap/src/utils/currencyId' import { NumberType } from 'utilities/src/format/types' import { RelativeChange } from 'wallet/src/components/text/RelativeChange' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { TokenMetadataDisplayType } from 'wallet/src/features/wallet/types' interface TokenItemProps { @@ -116,7 +116,7 @@ export const TokenItem = memo(function _TokenItem({ {!hideNumberedList && ( - + {index + 1} diff --git a/apps/mobile/src/components/explore/TokenItemChart.tsx b/apps/mobile/src/components/explore/TokenItemChart.tsx index 5065a7928f6..7422d35c018 100644 --- a/apps/mobile/src/components/explore/TokenItemChart.tsx +++ b/apps/mobile/src/components/explore/TokenItemChart.tsx @@ -4,8 +4,8 @@ import { LineChart, LineChartProvider } from 'react-native-wagmi-charts' import { useTokenPriceHistory } from 'src/components/PriceExplorer/usePriceHistory' import { TokenItemData } from 'src/components/explore/TokenItemData' import { useExtractedTokenColor, useSporeColors } from 'ui/src' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { buildCurrencyId, buildNativeCurrencyId } from 'uniswap/src/utils/currencyId' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' // Used to divide the number of data points for a smoother charts // Necessary because graphql query does not support a time resolution parameter diff --git a/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap b/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap index 36e4b69c304..f8c75cb7949 100644 --- a/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap @@ -20,9 +20,8 @@ exports[`FavoriteHeaderRow when editing renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } @@ -61,10 +60,10 @@ exports[`FavoriteHeaderRow when editing renders without error 1`] = ` style={ { "color": "#FC72FF", - "fontFamily": "Basel Grotesk", - "fontSize": 17, + "fontFamily": "Basel-Medium", + "fontSize": 15, "fontWeight": "500", - "lineHeight": 19.549999999999997, + "lineHeight": 20, } } suppressHighlighting={true} @@ -96,9 +95,8 @@ exports[`FavoriteHeaderRow when not editing renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/explore/__snapshots__/FavoriteWalletCard.test.tsx.snap b/apps/mobile/src/components/explore/__snapshots__/FavoriteWalletCard.test.tsx.snap index eb7dafec05c..b5752fd76e0 100644 --- a/apps/mobile/src/components/explore/__snapshots__/FavoriteWalletCard.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/FavoriteWalletCard.test.tsx.snap @@ -221,9 +221,8 @@ exports[`FavoriteWalletCard renders without error 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, "overflow": "hidden", } diff --git a/apps/mobile/src/components/explore/__snapshots__/SortButton.test.tsx.snap b/apps/mobile/src/components/explore/__snapshots__/SortButton.test.tsx.snap index 56604946bf4..cb7e240d9a4 100644 --- a/apps/mobile/src/components/explore/__snapshots__/SortButton.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/SortButton.test.tsx.snap @@ -87,10 +87,10 @@ exports[`SortButton renders without error 1`] = ` { "color": "#7D7D7D", "flexShrink": 1, - "fontFamily": "Basel Grotesk", - "fontSize": 17, + "fontFamily": "Basel-Medium", + "fontSize": 15, "fontWeight": "500", - "lineHeight": 19.549999999999997, + "lineHeight": 20, } } suppressHighlighting={true} diff --git a/apps/mobile/src/components/explore/__snapshots__/TokenItem.test.tsx.snap b/apps/mobile/src/components/explore/__snapshots__/TokenItem.test.tsx.snap index 0e52ffe31f1..eaa47a67b70 100644 --- a/apps/mobile/src/components/explore/__snapshots__/TokenItem.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/TokenItem.test.tsx.snap @@ -77,10 +77,10 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", - "fontSize": 17, + "fontFamily": "Basel-Medium", + "fontSize": 13, "fontWeight": "500", - "lineHeight": 19.549999999999997, + "lineHeight": 16, } } suppressHighlighting={true} @@ -138,9 +138,8 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -155,9 +154,8 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } @@ -198,9 +196,8 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -233,9 +230,8 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/explore/hooks.test.ts b/apps/mobile/src/components/explore/hooks.test.ts index 9d6085808f7..cff933aad46 100644 --- a/apps/mobile/src/components/explore/hooks.test.ts +++ b/apps/mobile/src/components/explore/hooks.test.ts @@ -6,8 +6,8 @@ import { renderHookWithProviders } from 'src/test/render' import { Resolvers } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { FavoritesState } from 'uniswap/src/features/favorites/slice' import { SectionName } from 'uniswap/src/features/telemetry/constants' -import { SAMPLE_SEED_ADDRESS_1 } from 'uniswap/src/test/fixtures' import { CurrencyField } from 'uniswap/src/types/currency' +import { SAMPLE_SEED_ADDRESS_1 } from 'wallet/src/test/fixtures' import { cleanup } from 'wallet/src/test/test-utils' const tokenId = SAMPLE_SEED_ADDRESS_1 diff --git a/apps/mobile/src/components/explore/search/SearchEmptySection.tsx b/apps/mobile/src/components/explore/search/SearchEmptySection.tsx index 9fce7bd4a14..84b6ed8ae77 100644 --- a/apps/mobile/src/components/explore/search/SearchEmptySection.tsx +++ b/apps/mobile/src/components/explore/search/SearchEmptySection.tsx @@ -57,7 +57,7 @@ export function SearchEmptySection(): JSX.Element { > } title={t('explore.search.section.recent')} /> - + {t('explore.search.action.clear')} diff --git a/apps/mobile/src/components/explore/search/SearchPopularTokens.test.tsx b/apps/mobile/src/components/explore/search/SearchPopularTokens.test.tsx index 62868d18307..84903b3e278 100644 --- a/apps/mobile/src/components/explore/search/SearchPopularTokens.test.tsx +++ b/apps/mobile/src/components/explore/search/SearchPopularTokens.test.tsx @@ -1,9 +1,9 @@ import React from 'react' import { SearchPopularTokens } from 'src/components/explore/search/SearchPopularTokens' import { render, screen } from 'src/test/test-utils' -import { ethToken, usdcToken, wethToken } from 'uniswap/src/test/fixtures' -import { queryResolvers } from 'uniswap/src/test/utils' import { ONE_SECOND_MS } from 'utilities/src/time/time' +import { ethToken, usdcToken, wethToken } from 'wallet/src/test/fixtures' +import { queryResolvers } from 'wallet/src/test/utils' const { resolvers } = queryResolvers({ topTokens: () => [wethToken(), usdcToken()], diff --git a/apps/mobile/src/components/explore/search/SearchPopularTokens.tsx b/apps/mobile/src/components/explore/search/SearchPopularTokens.tsx index 9003fd757e9..6374abcb437 100644 --- a/apps/mobile/src/components/explore/search/SearchPopularTokens.tsx +++ b/apps/mobile/src/components/explore/search/SearchPopularTokens.tsx @@ -5,7 +5,7 @@ import { getSearchResultId } from 'src/components/explore/search/utils' import { Flex, Loader } from 'ui/src' import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' import { SearchResultType, TokenSearchResult } from 'uniswap/src/features/search/SearchResult' -import { TopToken, usePopularTokens } from 'uniswap/src/features/tokens/hooks' +import { TopToken, usePopularTokens } from 'wallet/src/features/tokens/hooks' function gqlTokenToTokenSearchResult(token: Maybe): TokenSearchResult | null { if (!token || !token.project) { diff --git a/apps/mobile/src/components/explore/search/items/SearchENSAddressItem.tsx b/apps/mobile/src/components/explore/search/items/SearchENSAddressItem.tsx index dfa5349e225..79b90a2592e 100644 --- a/apps/mobile/src/components/explore/search/items/SearchENSAddressItem.tsx +++ b/apps/mobile/src/components/explore/search/items/SearchENSAddressItem.tsx @@ -32,7 +32,7 @@ export function SearchENSAddressItem({ searchResult, searchContext }: SearchENSA * ex. if searching `uni.eth` resolves to 0x123, and the primary ENS for 0x123 * is `uniswap.eth`, then we should show "uni.eth | owned by uniswap.eth" */ - const { data: fetchedPrimaryENSName, isLoading: isFetchingPrimaryENSName } = useENSName( + const { data: fetchedPrimaryENSName, loading: isFetchingPrimaryENSName } = useENSName( savedPrimaryENSName ? undefined : address, ) diff --git a/apps/mobile/src/components/explore/search/items/SearchUnitagItem.tsx b/apps/mobile/src/components/explore/search/items/SearchUnitagItem.tsx index 0e1a541917b..f3aa95593cc 100644 --- a/apps/mobile/src/components/explore/search/items/SearchUnitagItem.tsx +++ b/apps/mobile/src/components/explore/search/items/SearchUnitagItem.tsx @@ -2,12 +2,12 @@ import React from 'react' import { SearchWalletItemBase } from 'src/components/explore/search/items/SearchWalletItemBase' import { Flex, Text } from 'ui/src' import { imageSizes } from 'ui/src/theme' -import { useAvatar } from 'uniswap/src/features/address/avatar' import { SearchContext } from 'uniswap/src/features/search/SearchContext' import { UnitagSearchResult } from 'uniswap/src/features/search/SearchResult' import { sanitizeAddressText, shortenAddress } from 'uniswap/src/utils/addresses' import { AccountIcon } from 'wallet/src/components/accounts/AccountIcon' import { DisplayNameText } from 'wallet/src/components/accounts/DisplayNameText' +import { useAvatar } from 'wallet/src/features/wallet/hooks' import { DisplayNameType } from 'wallet/src/features/wallet/types' type SearchUnitagItemProps = { diff --git a/apps/mobile/src/components/explore/search/utils.test.ts b/apps/mobile/src/components/explore/search/utils.test.ts index 61d9f8e9204..675f5456f15 100644 --- a/apps/mobile/src/components/explore/search/utils.test.ts +++ b/apps/mobile/src/components/explore/search/utils.test.ts @@ -15,8 +15,8 @@ import { token, tokenMarket, tokenProject, -} from 'uniswap/src/test/fixtures' -import { createArray } from 'uniswap/src/test/utils' +} from 'wallet/src/test/fixtures' +import { createArray } from 'wallet/src/test/utils' type ExploreSearchResult = NonNullable diff --git a/apps/mobile/src/components/forceUpgrade/ForceUpgradeModal.tsx b/apps/mobile/src/components/forceUpgrade/ForceUpgradeModal.tsx index 96884734481..56cee578b19 100644 --- a/apps/mobile/src/components/forceUpgrade/ForceUpgradeModal.tsx +++ b/apps/mobile/src/components/forceUpgrade/ForceUpgradeModal.tsx @@ -79,7 +79,7 @@ export function ForceUpgradeModal(): JSX.Element { {t('forceUpgrade.description')} {mnemonicId && ( - + {t('forceUpgrade.action.recoveryPhrase')} )} diff --git a/apps/mobile/src/components/home/HomeExploreTab.tsx b/apps/mobile/src/components/home/HomeExploreTab.tsx index daa8745849e..ba351534b60 100644 --- a/apps/mobile/src/components/home/HomeExploreTab.tsx +++ b/apps/mobile/src/components/home/HomeExploreTab.tsx @@ -18,7 +18,6 @@ import { useHomeScreenTokensQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' -import { useAppFiatCurrency } from 'uniswap/src/features/fiatCurrency/hooks' import { Experiments, OnboardingRedesignHomeScreenProperties } from 'uniswap/src/features/gating/experiments' import { useExperimentValue } from 'uniswap/src/features/gating/hooks' import { MobileEventName } from 'uniswap/src/features/telemetry/constants' @@ -26,6 +25,7 @@ import { useTranslation } from 'uniswap/src/i18n' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { isAndroid } from 'utilities/src/platform' import { selectHasUsedExplore } from 'wallet/src/features/behaviorHistory/selectors' +import { useAppFiatCurrency } from 'wallet/src/features/fiatCurrency/hooks' import { TokenMetadataDisplayType } from 'wallet/src/features/wallet/types' const ESTIMATED_ITEM_SIZE = 68 diff --git a/apps/mobile/src/components/home/introCards/FundWalletModal.tsx b/apps/mobile/src/components/home/introCards/FundWalletModal.tsx index 8cf32828c16..48d9c686e79 100644 --- a/apps/mobile/src/components/home/introCards/FundWalletModal.tsx +++ b/apps/mobile/src/components/home/introCards/FundWalletModal.tsx @@ -2,7 +2,7 @@ import React, { PropsWithChildren, useCallback, useMemo } from 'react' import { FlatList, ImageBackground } from 'react-native' import { useDispatch } from 'react-redux' import { openModal } from 'src/features/modals/modalSlice' -import { Flex, useIsDarkMode, useShadowPropsShort } from 'ui/src' +import { Flex, useIsDarkMode } from 'ui/src' import { CRYPTO_PURCHASE_BACKGROUND_DARK, CRYPTO_PURCHASE_BACKGROUND_LIGHT } from 'ui/src/assets' import { ArrowDownCircle, Buy } from 'ui/src/components/icons' import { borderRadii, iconSizes, spacing } from 'ui/src/theme' @@ -18,7 +18,6 @@ import { ImageUri } from 'wallet/src/features/images/ImageUri' export function FundWalletModal({ onClose }: { onClose: () => void }): JSX.Element { const isDarkMode = useIsDarkMode() - const shadowProps = useShadowPropsShort() const { t } = useTranslation() const dispatch = useDispatch() const cexTransferProviders = useCexTransferProviders() @@ -106,9 +105,11 @@ export function FundWalletModal({ onClose }: { onClose: () => void }): JSX.Eleme key={card.title} {...card} containerProps={{ - ...shadowProps, py: '$spacing20', - px: '$spacing20', + // TODO WALL-3699 replace with spore shadow support + shadowColor: isDarkMode ? 'rgba(0, 0, 0, 0.24)' : 'rgba(0, 0, 0, 0.02)', + shadowOffset: { width: 0, height: 1 }, + shadowRadius: 6, }} /> ))} diff --git a/apps/mobile/src/components/home/introCards/IntroCard.tsx b/apps/mobile/src/components/home/introCards/IntroCard.tsx index 4518bc7a390..349006cb902 100644 --- a/apps/mobile/src/components/home/introCards/IntroCard.tsx +++ b/apps/mobile/src/components/home/introCards/IntroCard.tsx @@ -25,6 +25,7 @@ export type IntroCardProps = { description: string cardType: CardType + onPress?: () => void onClose?: () => void } @@ -35,6 +36,7 @@ export function IntroCard({ title, description, cardType, + onPress, onClose, }: IntroCardProps): JSX.Element { const isDarkMode = useIsDarkMode() @@ -54,6 +56,7 @@ export function IntroCard({ gap="$spacing12" p="$spacing16" paddingStart="$spacing12" + onPress={onPress} > {cardType === CardType.Required ? ( - - + + {t('onboarding.home.intro.label.required')} diff --git a/apps/mobile/src/components/home/introCards/IntroCardStack.tsx b/apps/mobile/src/components/home/introCards/IntroCardStack.tsx index ed6a5336761..87c6673d610 100644 --- a/apps/mobile/src/components/home/introCards/IntroCardStack.tsx +++ b/apps/mobile/src/components/home/introCards/IntroCardStack.tsx @@ -1,10 +1,8 @@ import { IntroCard, IntroCardProps } from 'src/components/home/introCards/IntroCard' import { SwipeableCardStack } from 'ui/src/components/swipeablecards/SwipeableCardStack' -export type IntroCardWrapper = IntroCardProps & { onPress?: () => void } - type IntroCardStackProps = { - cards: IntroCardWrapper[] + cards: IntroCardProps[] keyExtractor: (card: IntroCardProps) => string onSwiped?: (card: IntroCardProps, index: number) => void diff --git a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx index 59b314b0053..b4d699f79ed 100644 --- a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx +++ b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx @@ -1,17 +1,15 @@ import { SharedEventName } from '@uniswap/analytics-events' import React, { useCallback, useMemo, useState } from 'react' -import { FadeIn, FadeOut } from 'react-native-reanimated' import { useDispatch, useSelector } from 'react-redux' import { navigate } from 'src/app/navigation/rootNavigation' import { FundWalletModal } from 'src/components/home/introCards/FundWalletModal' import { CardType, IntroCardProps } from 'src/components/home/introCards/IntroCard' -import { IntroCardStack, IntroCardWrapper } from 'src/components/home/introCards/IntroCardStack' -import { UnitagBanner } from 'src/components/unitags/UnitagBanner' +import { IntroCardStack } from 'src/components/home/introCards/IntroCardStack' import { useUnitagClaimHandler } from 'src/features/unitags/useUnitagClaimHandler' -import { Flex } from 'ui/src' import { Buy, Person, ShieldCheck, UniswapLogo } from 'ui/src/components/icons' -import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { AccountType } from 'uniswap/src/features/accounts/types' +import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' +import { useExperimentValue } from 'uniswap/src/features/gating/hooks' import { ElementName, MobileEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { OnboardingCardLoggingName } from 'uniswap/src/features/telemetry/types' @@ -27,20 +25,11 @@ import { UNITAG_SUFFIX_NO_LEADING_DOT } from 'wallet/src/features/unitags/consta import { useCanActiveAddressClaimUnitag } from 'wallet/src/features/unitags/hooks' import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' -type IntroCardWithName = IntroCardWrapper & { +type IntroCardWithName = IntroCardProps & { loggingName: OnboardingCardLoggingName } -type OnboardingIntroCardStackProps = { - onboardingRedesignHomeEnabled: boolean - onboardingRedesignBackupEnabled: boolean - isLoading?: boolean -} -export function OnboardingIntroCardStack({ - onboardingRedesignHomeEnabled, - onboardingRedesignBackupEnabled, - isLoading = false, -}: OnboardingIntroCardStackProps): JSX.Element | null { +export function OnboardingIntroCardStack(): JSX.Element { const { t } = useTranslation() const dispatch = useDispatch() const activeAccount = useActiveAccountWithThrow() @@ -62,15 +51,31 @@ export function OnboardingIntroCardStack({ const shouldPromptUnitag = activeAccount.type === AccountType.SignerMnemonic && !hasSkippedUnitagPrompt && canClaimUnitag - const cards = useMemo(() => { - if (!onboardingRedesignHomeEnabled && !onboardingRedesignBackupEnabled) { - return [] - } + const redesignRecoveryBackupEnabled = useExperimentValue( + Experiments.OnboardingRedesignRecoveryBackup, + OnboardingRedesignRecoveryBackupProperties.Enabled, + false, + ) - const output: IntroCardWithName[] = [] + const cards = useMemo(() => { + const output: IntroCardWithName[] = [ + { + loggingName: OnboardingCardLoggingName.FundWallet, + Icon: Buy, + title: t('onboarding.home.intro.fund.title'), + description: t('onboarding.home.intro.fund.description'), + cardType: CardType.Required, + onPress: (): void => { + setShowFundModal(true) + sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { + element: ElementName.OnboardingIntroCardFundWallet, + }) + }, + }, + ] if (!hasViewedWelcomeWalletCard) { - output.push({ + output.unshift({ loggingName: OnboardingCardLoggingName.WelcomeWallet, Icon: UniswapLogo, iconProps: { @@ -86,23 +91,7 @@ export function OnboardingIntroCardStack({ }) } - if (onboardingRedesignHomeEnabled) { - output.push({ - loggingName: OnboardingCardLoggingName.FundWallet, - Icon: Buy, - title: t('onboarding.home.intro.fund.title'), - description: t('onboarding.home.intro.fund.description'), - cardType: CardType.Required, - onPress: (): void => { - setShowFundModal(true) - sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { - element: ElementName.OnboardingIntroCardFundWallet, - }) - }, - }) - } - - if (onboardingRedesignBackupEnabled && !hasBackups) { + if (redesignRecoveryBackupEnabled && !hasBackups) { output.push({ loggingName: OnboardingCardLoggingName.RecoveryBackup, Icon: ShieldCheck, @@ -141,8 +130,7 @@ export function OnboardingIntroCardStack({ handleUnitagDismiss, hasBackups, hasViewedWelcomeWalletCard, - onboardingRedesignBackupEnabled, - onboardingRedesignHomeEnabled, + redesignRecoveryBackupEnabled, shouldPromptUnitag, t, welcomeCardTitle, @@ -164,18 +152,10 @@ export function OnboardingIntroCardStack({ [cards, dispatch, hasViewedWelcomeWalletCard, welcomeCardTitle], ) - if (isLoading) { - return null - } - - return cards.length ? ( - + return ( + <> card.title} onSwiped={handleSwiped} /> {showFundModal && setShowFundModal(false)} />} - - ) : shouldPromptUnitag ? ( - - - - ) : null + + ) } diff --git a/apps/mobile/src/components/input/PasswordInput.tsx b/apps/mobile/src/components/input/PasswordInput.tsx index f5bc02b407d..14a73d962e4 100644 --- a/apps/mobile/src/components/input/PasswordInput.tsx +++ b/apps/mobile/src/components/input/PasswordInput.tsx @@ -39,11 +39,8 @@ export const PasswordInput = forwardRef(functio flex={1} fontFamily="$subHeading" fontSize="$small" - fontWeight="$book" placeholder={placeholder} placeholderTextColor="$neutral3" - px="$spacing16" - py="$spacing20" returnKeyType={returnKeyType || 'done'} secureTextEntry={!showPassword} textContentType="none" diff --git a/apps/mobile/src/components/mnemonic/HiddenMnemonicWordView.tsx b/apps/mobile/src/components/mnemonic/HiddenMnemonicWordView.tsx index 4ce0e64356a..da567fe002e 100644 --- a/apps/mobile/src/components/mnemonic/HiddenMnemonicWordView.tsx +++ b/apps/mobile/src/components/mnemonic/HiddenMnemonicWordView.tsx @@ -1,6 +1,6 @@ import React from 'react' import { useTranslation } from 'react-i18next' -import { Flex, Text, TouchableArea, useShadowPropsShort } from 'ui/src' +import { Flex, Text, TouchableArea, useShadowPropsMedium } from 'ui/src' import { EyeSlash } from 'ui/src/components/icons' const ROW_COUNT = 6 @@ -14,7 +14,7 @@ export function HiddenMnemonicWordView({ onRevealPress, }: HiddenMnemonicWordViewProps): JSX.Element { const { t } = useTranslation() - const shadowProps = useShadowPropsShort() + const shadowProps = useShadowPropsMedium() return ( @@ -22,9 +22,7 @@ export function HiddenMnemonicWordView({ row alignItems="stretch" backgroundColor="$surface2" - borderColor="$surface3" borderRadius="$rounded20" - borderWidth={1} gap="$spacing36" px="$spacing32" py="$spacing24" @@ -39,16 +37,14 @@ export function HiddenMnemonicWordView({ {...shadowProps} row backgroundColor="$surface1" - borderColor="$surface3" borderRadius="$rounded16" - borderWidth={1} gap="$spacing4" paddingEnd="$spacing16" paddingStart="$spacing12" py="$spacing8" > - + {t('common.button.reveal')} diff --git a/apps/mobile/src/components/mnemonic/MnemonicConfirmation.tsx b/apps/mobile/src/components/mnemonic/MnemonicConfirmation.tsx index 7724e2cd9eb..3699d56824c 100644 --- a/apps/mobile/src/components/mnemonic/MnemonicConfirmation.tsx +++ b/apps/mobile/src/components/mnemonic/MnemonicConfirmation.tsx @@ -3,7 +3,6 @@ import { StyleProp, ViewProps, requireNativeComponent } from 'react-native' import { useNativeComponentKey } from 'src/app/hooks' import { FlexProps, HiddenFromScreenReaders, flexStyles } from 'ui/src' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' -import { spacing } from 'ui/src/theme' import { isAndroid } from 'utilities/src/platform' interface NativeMnemonicConfirmationProps { @@ -35,7 +34,7 @@ export function MnemonicConfirmation(props: MnemonicConfirmationProps): JSX.Elem const { key } = useNativeComponentKey(isAndroid) return ( - + + {showMnemonicWithReveal ? ( ) : ( - setHeight(Math.round(e.nativeEvent.layout.height))}> + setHeight(Math.round(e.nativeEvent.layout.height))}> { @@ -96,6 +96,6 @@ const styles = StyleSheet.create({ mnemonicDisplay: { // Set flex: 1 to prevent component from collapsing before it is measured flex: 1, - marginBottom: spacing.spacing12, + marginBottom: spacing.spacing16, }, }) diff --git a/apps/mobile/src/components/text/AnimatedText.test.tsx b/apps/mobile/src/components/text/AnimatedText.test.tsx index 20d58792dca..9e098b1d123 100644 --- a/apps/mobile/src/components/text/AnimatedText.test.tsx +++ b/apps/mobile/src/components/text/AnimatedText.test.tsx @@ -9,7 +9,30 @@ describe(AnimatedText, () => { it('renders without error', () => { const tree = render() - expect(tree).toMatchSnapshot() + expect(tree).toMatchInlineSnapshot(` + + `) }) describe('when text is in the loading state', () => { diff --git a/apps/mobile/src/components/text/LongMarkdownText.tsx b/apps/mobile/src/components/text/LongMarkdownText.tsx index 11738bbc519..67e437525cd 100644 --- a/apps/mobile/src/components/text/LongMarkdownText.tsx +++ b/apps/mobile/src/components/text/LongMarkdownText.tsx @@ -118,7 +118,7 @@ export function LongMarkdownText(props: LongMarkdownTextProps): JSX.Element { py="$none" style={{ color: readMoreOrLessColor }} testID={TestID.ReadMoreButton} - variant="buttonLabel2" + variant="buttonLabel3" onPress={toggleExpanded} > {expanded ? t('common.longText.button.less') : t('common.longText.button.more')} diff --git a/apps/mobile/src/components/text/LongText.tsx b/apps/mobile/src/components/text/LongText.tsx index 171e17af98e..52bde0e26a6 100644 --- a/apps/mobile/src/components/text/LongText.tsx +++ b/apps/mobile/src/components/text/LongText.tsx @@ -66,7 +66,7 @@ export function LongText(props: LongTextProps): JSX.Element { py="$none" style={{ color: readMoreOrLessColor }} testID={TestID.ReadMoreButton} - variant="buttonLabel2" + variant="buttonLabel3" onPress={(): void => setExpanded(!expanded)} > {expanded ? t('common.longText.button.less') : t('common.longText.button.more')} diff --git a/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap deleted file mode 100644 index 948d0333726..00000000000 --- a/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap +++ /dev/null @@ -1,27 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`AnimatedText renders without error 1`] = ` - -`; diff --git a/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap index 5c375be5301..474d11578f1 100644 --- a/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap @@ -7,9 +7,8 @@ exports[`renders a DecimalNumber 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -22,9 +21,8 @@ exports[`renders a DecimalNumber 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -43,9 +41,8 @@ exports[`renders a DecimalNumber without a comma separator 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -58,9 +55,8 @@ exports[`renders a DecimalNumber without a comma separator 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -79,9 +75,8 @@ exports[`renders a DecimalNumber without a decimal part 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/text/__snapshots__/LongMarkdownText.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/LongMarkdownText.test.tsx.snap index 74624d5c7cc..8536d0bc954 100644 --- a/apps/mobile/src/components/text/__snapshots__/LongMarkdownText.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/LongMarkdownText.test.tsx.snap @@ -58,7 +58,7 @@ exports[`LongMarkdownText renders without error 1`] = ` [ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, "lineHeight": 24, }, @@ -101,7 +101,7 @@ exports[`LongMarkdownText renders without error 1`] = ` [ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, "lineHeight": 24, }, diff --git a/apps/mobile/src/components/text/__snapshots__/LongText.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/LongText.test.tsx.snap index 68da7b72c38..7f43af2bc63 100644 --- a/apps/mobile/src/components/text/__snapshots__/LongText.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/LongText.test.tsx.snap @@ -16,9 +16,8 @@ exports[`LongText renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap b/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap index 8c519688ecf..f6a3234342a 100644 --- a/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap @@ -15,9 +15,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -31,9 +30,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -47,9 +45,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -63,9 +60,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -79,9 +75,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -95,9 +90,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -111,9 +105,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -127,9 +120,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -143,9 +135,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -159,9 +150,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -175,9 +165,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -191,9 +180,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -207,9 +195,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -223,9 +210,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -239,9 +225,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -255,9 +240,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -271,9 +255,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -287,9 +270,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -303,9 +285,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -319,9 +300,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -335,9 +315,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -351,9 +330,8 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } @@ -372,9 +350,8 @@ exports[`renders text without matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/components/unitags/ChangeUnitagModal.tsx b/apps/mobile/src/components/unitags/ChangeUnitagModal.tsx index b729b993602..76835b3d5e3 100644 --- a/apps/mobile/src/components/unitags/ChangeUnitagModal.tsx +++ b/apps/mobile/src/components/unitags/ChangeUnitagModal.tsx @@ -5,7 +5,7 @@ import { ActivityIndicator, Keyboard } from 'react-native' import { getUniqueId } from 'react-native-device-info' import { useDispatch } from 'react-redux' import { Button, Flex, Text, useSporeColors } from 'ui/src' -import { AlertTriangleFilled } from 'ui/src/components/icons' +import { AlertTriangle } from 'ui/src/components/icons' import { fonts, spacing } from 'ui/src/theme' import { TextInput } from 'uniswap/src/components/input/TextInput' import { Modal } from 'uniswap/src/components/modals/Modal' @@ -192,7 +192,6 @@ export function ChangeUnitagModal({ color="$neutral1" fontFamily="$subHeading" fontSize={fonts.subheading1.fontSize} - fontWeight="$book" m="$none" maxLength={20} numberOfLines={1} @@ -278,7 +277,7 @@ function ChangeUnitagConfirmModal({ mb="$spacing8" minWidth="$spacing48" > - + {t('unitags.editUsername.confirm.title')} diff --git a/apps/mobile/src/components/unitags/ChoosePhotoOptionsModal.tsx b/apps/mobile/src/components/unitags/ChoosePhotoOptionsModal.tsx index fcff2774cdd..26a53eeac43 100644 --- a/apps/mobile/src/components/unitags/ChoosePhotoOptionsModal.tsx +++ b/apps/mobile/src/components/unitags/ChoosePhotoOptionsModal.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next' import { selectPhotoFromLibrary } from 'src/components/unitags/AvatarSelection' import { ChooseNftModal } from 'src/components/unitags/ChooseNftModal' import { Flex, Text, useSporeColors } from 'ui/src' -import { Camera, PhotoStacked, Trash } from 'ui/src/components/icons' +import { Camera, Photo, Trash } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' @@ -118,13 +118,13 @@ const ChoosePhotoOption = ({ type }: { type: PhotoAction }): JSX.Element => { p="$spacing24" > {type === PhotoAction.BrowseCameraRoll && } - {type === PhotoAction.BrowseNftsList && } + {type === PhotoAction.BrowseNftsList && } {type === PhotoAction.RemovePhoto && } {type === PhotoAction.BrowseCameraRoll && t('unitags.choosePhoto.option.cameraRoll')} {type === PhotoAction.BrowseNftsList && t('unitags.choosePhoto.option.nft')} diff --git a/apps/mobile/src/components/unitags/DeleteUnitagModal.tsx b/apps/mobile/src/components/unitags/DeleteUnitagModal.tsx index 6c438cc7ef6..105f9a10543 100644 --- a/apps/mobile/src/components/unitags/DeleteUnitagModal.tsx +++ b/apps/mobile/src/components/unitags/DeleteUnitagModal.tsx @@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next' import { ActivityIndicator } from 'react-native' import { useDispatch } from 'react-redux' import { Button, Flex, Text, useSporeColors } from 'ui/src' -import { AlertTriangleFilled } from 'ui/src/components/icons' +import { AlertTriangle } from 'ui/src/components/icons' import { fonts } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' import { ModalName, UnitagEventName } from 'uniswap/src/features/telemetry/constants' @@ -93,7 +93,7 @@ export function DeleteUnitagModal({ mb="$spacing8" minWidth="$spacing48" > - + {t('unitags.delete.confirm.title')} diff --git a/apps/mobile/src/components/unitags/UnitagBanner.tsx b/apps/mobile/src/components/unitags/UnitagBanner.tsx index bdb6e35a08f..4597d330fc5 100644 --- a/apps/mobile/src/components/unitags/UnitagBanner.tsx +++ b/apps/mobile/src/components/unitags/UnitagBanner.tsx @@ -75,7 +75,7 @@ export function UnitagBanner({ }} + components={{ highlight: }} i18nKey="unitags.banner.title.compact" values={{ unitagDomain: UNITAG_SUFFIX_NO_LEADING_DOT }} /> @@ -98,7 +98,7 @@ export function UnitagBanner({ {/* TODO: replace with Button when it's extensible enough to accommodate designs */} - + {t('unitags.banner.button.claim')} @@ -108,7 +108,7 @@ export function UnitagBanner({ testID={TestID.Cancel} onPress={() => handleDismiss()} > - + {t('common.button.later')} diff --git a/apps/mobile/src/features/CloudBackup/CloudBackupForm/PasswordInput.tsx b/apps/mobile/src/features/CloudBackup/CloudBackupForm/PasswordInput.tsx index 92cc1193878..1726249dea1 100644 --- a/apps/mobile/src/features/CloudBackup/CloudBackupForm/PasswordInput.tsx +++ b/apps/mobile/src/features/CloudBackup/CloudBackupForm/PasswordInput.tsx @@ -1,10 +1,12 @@ import { useRef } from 'react' import { useTranslation } from 'react-i18next' import { TextInput } from 'react-native' -import { PasswordInput } from 'src/components/input/PasswordInput' +import { PasswordInput as Input } from 'src/components/input/PasswordInput' import { useCloudBackupPasswordFormContext } from 'src/features/CloudBackup/CloudBackupForm/CloudBackupPasswordFormContext' import { PasswordError } from 'src/features/onboarding/PasswordError' import { Flex, Text } from 'ui/src' +import { DiamondExclamation } from 'ui/src/components/icons' +import { iconSizes } from 'ui/src/theme' import { useDebounce } from 'utilities/src/time/timing' import { PASSWORD_VALIDATION_DEBOUNCE_MS, @@ -13,7 +15,7 @@ import { getPasswordStrengthTextAndColor, } from 'wallet/src/utils/password' -export function CloudPasswordInput(): JSX.Element { +export function PasswordInput(): JSX.Element { const { password, error, passwordStrength, isConfirmation, onPasswordChangeText, onPasswordSubmitEditing } = useCloudBackupPasswordFormContext() const debouncedPasswordStrength = useDebounce(passwordStrength, PASSWORD_VALIDATION_DEBOUNCE_MS) @@ -32,7 +34,7 @@ export function CloudPasswordInput(): JSX.Element { return ( - } {error ? : null} + {!isConfirmation && ( + + + + {t('settings.setting.backup.password.disclaimer')} + + + )} ) } diff --git a/apps/mobile/src/features/CloudBackup/CloudBackupForm/index.ts b/apps/mobile/src/features/CloudBackup/CloudBackupForm/index.ts index 479ff313b61..fa72f4b3769 100644 --- a/apps/mobile/src/features/CloudBackup/CloudBackupForm/index.ts +++ b/apps/mobile/src/features/CloudBackup/CloudBackupForm/index.ts @@ -1,9 +1,9 @@ import { CloudBackupPasswordFormContextProvider } from 'src/features/CloudBackup/CloudBackupForm/CloudBackupPasswordFormContext' import { ContinueButton } from 'src/features/CloudBackup/CloudBackupForm/ContinueButton' -import { CloudPasswordInput } from 'src/features/CloudBackup/CloudBackupForm/PasswordInput' +import { PasswordInput } from 'src/features/CloudBackup/CloudBackupForm/PasswordInput' export const CloudBackupPassword = { - PasswordInput: CloudPasswordInput, + PasswordInput, ContinueButton, FormProvider: CloudBackupPasswordFormContextProvider, } diff --git a/apps/mobile/src/features/appRating/selectors.ts b/apps/mobile/src/features/appRating/selectors.ts index 57ad283b63c..cb8da6514ed 100644 --- a/apps/mobile/src/features/appRating/selectors.ts +++ b/apps/mobile/src/features/appRating/selectors.ts @@ -1,6 +1,5 @@ import { createSelector, Selector } from '@reduxjs/toolkit' import { MobileState } from 'src/app/mobileReducer' -import { selectTransactions } from 'uniswap/src/features/transactions/selectors' import { TransactionsState } from 'uniswap/src/features/transactions/slice' import { TransactionDetails, @@ -9,6 +8,7 @@ import { } from 'uniswap/src/features/transactions/types/transactionDetails' import { flattenObjectOfObjects } from 'utilities/src/primitives/objects' import { ONE_MINUTE_MS } from 'utilities/src/time/time' +import { selectTransactions } from 'wallet/src/features/transactions/selectors' const NUM_CONSECUTIVE_SWAPS = 2 diff --git a/apps/mobile/src/features/dataApi/balances.test.ts b/apps/mobile/src/features/dataApi/balances.test.ts index 9f57128baee..0bb18abd31b 100644 --- a/apps/mobile/src/features/dataApi/balances.test.ts +++ b/apps/mobile/src/features/dataApi/balances.test.ts @@ -1,8 +1,8 @@ import { useBalances } from 'src/features/dataApi/balances' import { preloadedMobileState } from 'src/test/fixtures' import { act, renderHook, waitFor } from 'src/test/test-utils' -import { SAMPLE_CURRENCY_ID_1, portfolio, portfolioBalances } from 'uniswap/src/test/fixtures' -import { queryResolvers } from 'uniswap/src/test/utils' +import { SAMPLE_CURRENCY_ID_1, portfolio, portfolioBalances } from 'wallet/src/test/fixtures' +import { queryResolvers } from 'wallet/src/test/utils' const preloadedState = preloadedMobileState() diff --git a/apps/mobile/src/features/dataApi/balances.ts b/apps/mobile/src/features/dataApi/balances.ts index f585434f774..46a31c43a69 100644 --- a/apps/mobile/src/features/dataApi/balances.ts +++ b/apps/mobile/src/features/dataApi/balances.ts @@ -2,14 +2,17 @@ import { useMemo } from 'react' import { usePortfolioBalances } from 'uniswap/src/features/dataApi/balances' import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' import { CurrencyId } from 'uniswap/src/types/currency' +import { usePortfolioValueModifiers } from 'wallet/src/features/dataApi/balances' import { useActiveAccountAddressWithThrow } from 'wallet/src/features/wallet/hooks' /** Helper hook to retrieve balances for a set of currencies for the active account. */ export function useBalances(currencies: CurrencyId[] | undefined): PortfolioBalance[] | null { const address = useActiveAccountAddressWithThrow() + const valueModifiers = usePortfolioValueModifiers(address) ?? [] const { data: balances } = usePortfolioBalances({ address, fetchPolicy: 'cache-and-network', + valueModifiers, }) return useMemo(() => { diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts index 6b8bc55b5bc..191b93dad5c 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.test.ts @@ -14,15 +14,15 @@ import { waitForWcWeb3WalletIsReady } from 'src/features/walletConnect/saga' import { UNISWAP_WEB_URL } from 'uniswap/src/constants/urls' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { MobileScreens } from 'uniswap/src/types/screens/mobile' +import { setAccountAsActive } from 'wallet/src/features/wallet/slice' import { SAMPLE_CURRENCY_ID_1, SAMPLE_CURRENCY_ID_2, SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, -} from 'uniswap/src/test/fixtures' -import { MobileScreens } from 'uniswap/src/types/screens/mobile' -import { setAccountAsActive } from 'wallet/src/features/wallet/slice' -import { signerMnemonicAccount } from 'wallet/src/test/fixtures' + signerMnemonicAccount, +} from 'wallet/src/test/fixtures' const account = signerMnemonicAccount() diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts index 559aafb6185..3fe375aa835 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts @@ -29,7 +29,6 @@ import { DynamicConfigs, UwuLinkConfigKey } from 'uniswap/src/features/gating/co import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' import { getDynamicConfigValue } from 'uniswap/src/features/gating/hooks' import { Statsig } from 'uniswap/src/features/gating/sdk/statsig' -import { BACKEND_NATIVE_CHAIN_ADDRESS_STRING } from 'uniswap/src/features/search/utils' import { MobileEventName, ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import i18n from 'uniswap/src/i18n/i18n' @@ -44,6 +43,7 @@ import { ScantasticParams } from 'wallet/src/features/scantastic/types' import { getContractManager, getProviderManager } from 'wallet/src/features/wallet/context' import { selectAccounts, selectActiveAccount, selectActiveAccountAddress } from 'wallet/src/features/wallet/selectors' import { setAccountAsActive } from 'wallet/src/features/wallet/slice' +import { UNISWAP_APP_NATIVE_TOKEN } from 'wallet/src/utils/linking' export interface DeepLink { url: string @@ -62,7 +62,7 @@ const NFT_ITEM_SHARE_LINK_HASH_REGEX = /^(#\/)?nfts\/asset\/(0x[a-fA-F0-9]{40})\ const NFT_COLLECTION_SHARE_LINK_HASH_REGEX = /^(#\/)?nfts\/collection\/(0x[a-fA-F0-9]{40})$/ const TOKEN_SHARE_LINK_HASH_REGEX = RegExp( // eslint-disable-next-line no-useless-escape - `^(#\/)?tokens\/([\\w\\d]*)\/(0x[a-fA-F0-9]{40}|${BACKEND_NATIVE_CHAIN_ADDRESS_STRING})$`, + `^(#\/)?tokens\/([\\w\\d]*)\/(0x[a-fA-F0-9]{40}|${UNISWAP_APP_NATIVE_TOKEN})$`, ) const ADDRESS_SHARE_LINK_HASH_REGEX = /^(#\/)?address\/(0x[a-fA-F0-9]{40})$/ @@ -135,7 +135,7 @@ export function* handleUniswapAppDeepLink(path: string, url: string, linkSource: return } const currencyId = - contractAddress === BACKEND_NATIVE_CHAIN_ADDRESS_STRING + contractAddress === UNISWAP_APP_NATIVE_TOKEN ? buildNativeCurrencyId(chainId) : buildCurrencyId(chainId, contractAddress) yield* put( diff --git a/apps/mobile/src/features/deepLinking/handleSwapLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleSwapLinkSaga.ts index 26903b34b30..da59953a338 100644 --- a/apps/mobile/src/features/deepLinking/handleSwapLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleSwapLinkSaga.ts @@ -4,7 +4,7 @@ import { put } from 'typed-redux-saga' import { AssetType, CurrencyAsset } from 'uniswap/src/entities/assets' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { TransactionState } from 'uniswap/src/features/transactions/types/transactionState' -import { WALLET_SUPPORTED_CHAIN_IDS, WalletChainId } from 'uniswap/src/types/chains' +import { WALLET_SUPPORTED_CHAIN_IDS } from 'uniswap/src/types/chains' import { CurrencyField } from 'uniswap/src/types/currency' import { getValidAddress } from 'uniswap/src/utils/addresses' import { currencyIdToAddress, currencyIdToChain } from 'uniswap/src/utils/currencyId' @@ -55,10 +55,10 @@ const parseAndValidateSwapParams = (url: URL) => { throw new Error('No outputCurrencyId') } - const inputChain = currencyIdToChain(inputCurrencyId) as WalletChainId + const inputChain = currencyIdToChain(inputCurrencyId) const inputAddress = currencyIdToAddress(inputCurrencyId) - const outputChain = currencyIdToChain(outputCurrencyId) as WalletChainId + const outputChain = currencyIdToChain(outputCurrencyId) const outputAddress = currencyIdToAddress(outputCurrencyId) if (!inputChain || !inputAddress) { diff --git a/apps/mobile/src/features/externalProfile/ProfileHeader.tsx b/apps/mobile/src/features/externalProfile/ProfileHeader.tsx index 8b58b41df59..b7ae6d1690e 100644 --- a/apps/mobile/src/features/externalProfile/ProfileHeader.tsx +++ b/apps/mobile/src/features/externalProfile/ProfileHeader.tsx @@ -26,16 +26,16 @@ import { ENS_LOGO } from 'ui/src/assets' import { SendAction, XTwitter } from 'ui/src/components/icons' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { DEP_accentColors, iconSizes, imageSizes, validColor } from 'ui/src/theme' -import { useAvatar } from 'uniswap/src/features/address/avatar' import { useENSDescription, useENSName, useENSTwitterUsername } from 'uniswap/src/features/ens/api' import { selectWatchedAddressSet } from 'uniswap/src/features/favorites/selectors' import { ModalName } from 'uniswap/src/features/telemetry/constants' + import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { CurrencyField } from 'uniswap/src/types/currency' import { openUri } from 'uniswap/src/utils/linking' import { RecipientSelectSpeedBumps } from 'wallet/src/components/RecipientSearch/RecipientSelectSpeedBumps' import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay' -import { useDisplayName } from 'wallet/src/features/wallet/hooks' +import { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' import { DisplayNameType } from 'wallet/src/features/wallet/types' const HEADER_GRADIENT_HEIGHT = 144 @@ -189,7 +189,7 @@ export const ProfileHeader = memo(function ProfileHeader({ address }: ProfileHea - + {twitter} @@ -203,7 +203,7 @@ export const ProfileHeader = memo(function ProfileHeader({ address }: ProfileHea source={ENS_LOGO} width={imageSizes.image16} /> - + {primaryENSName} @@ -247,7 +247,7 @@ export const ProfileHeader = memo(function ProfileHeader({ address }: ProfileHea > - + {t('common.button.send')} diff --git a/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx b/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx index b30519415fa..d71adae25a4 100644 --- a/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx +++ b/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx @@ -4,17 +4,19 @@ import { useTranslation } from 'react-i18next' import { NativeSyntheticEvent, TextInput, TextInputSelectionChangeEventData } from 'react-native' import { TouchableOpacity } from 'react-native-gesture-handler' import { useAnimatedStyle, useSharedValue } from 'react-native-reanimated' -import { ColorTokens, Flex, Text, TouchableArea, useHapticFeedback, useSporeColors } from 'ui/src' +import { ColorTokens, Flex, Text, useHapticFeedback, useSporeColors } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { useDeviceDimensions } from 'ui/src/hooks/useDeviceDimensions' import { fonts, spacing } from 'ui/src/theme' import { Pill } from 'uniswap/src/components/pill/Pill' +import { SelectTokenButton } from 'uniswap/src/features/fiatOnRamp/SelectTokenButton' import { FiatCurrencyInfo, FiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/types' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { usePrevious } from 'utilities/src/react/hooks' import { DEFAULT_DELAY, useDebounce } from 'utilities/src/time/timing' import { AmountInput } from 'wallet/src/components/input/AmountInput' import { useFormatExactCurrencyAmount } from 'wallet/src/features/fiatOnRamp/hooks' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { errorShakeAnimation } from 'wallet/src/utils/animations' import { useDynamicFontSizing } from 'wallet/src/utils/useDynamicFontSizing' @@ -72,15 +74,17 @@ export const FiatOnRampAmountSection = forwardRef - + {debouncedErrorText} @@ -195,9 +193,6 @@ export const FiatOnRampAmountSection = forwardRef - {!value && predefinedAmountsSupported ? ( - + {currency.currencyInfo && formattedAmount && ( + + )} + {predefinedAmountsSupported ? ( + {PREDEFINED_AMOUNTS.map((amount) => ( ))} - ) : ( - - - - {formattedCurrencyAmount} - {currency.currencyInfo?.currency.symbol} - - {/* TODO: support switching from fiat to token amounts */} - {/* */} - - - )} + ) : null} {notAvailableInThisRegion ? ( ) : !appFiatCurrencySupported ? ( @@ -295,7 +282,7 @@ function PredefinedAmount({ foregroundColor={colors[disabled ? 'neutral3' : highlighted ? 'neutral1' : 'neutral2'].val} label={formattedAmount} px="$spacing16" - textVariant="buttonLabel2" + textVariant="buttonLabel3" /> ) diff --git a/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx b/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx index 3ae872dfca4..071cf9972dc 100644 --- a/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx +++ b/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx @@ -28,8 +28,6 @@ interface FiatOnRampContextType { setQuoteCurrency: (quoteCurrency: FiatOnRampCurrency) => void amount?: number setAmount: (amount: number | undefined) => void - isOffRamp: boolean - setIsOffRamp: (isOffRamp: boolean) => void } const initialState: FiatOnRampContextType = { @@ -43,8 +41,6 @@ const initialState: FiatOnRampContextType = { countryCode: '', countryState: undefined, quoteCurrency: { currencyInfo: undefined }, - isOffRamp: false, - setIsOffRamp: () => undefined, } const FiatOnRampContext = createContext(initialState) @@ -60,7 +56,6 @@ export function FiatOnRampProvider({ children }: { children: React.ReactNode }): const [countryState, setCountryState] = useState() const [baseCurrencyInfo, setBaseCurrencyInfo] = useState() const [amount, setAmount] = useState() - const [isOffRamp, setIsOffRamp] = useState(false) const { initialState: initialModalState } = useSelector(selectModalState(ModalName.FiatOnRampAggregator)) const prefilledCurrency = initialModalState?.prefilledCurrency @@ -93,8 +88,6 @@ export function FiatOnRampProvider({ children }: { children: React.ReactNode }): setQuoteCurrency, amount, setAmount, - isOffRamp, - setIsOffRamp, }} > {children} diff --git a/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx b/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx index e8d101bfccc..b35ffe3e660 100644 --- a/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx +++ b/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx @@ -5,7 +5,6 @@ import { TokenFiatOnRampList } from 'src/components/TokenSelector/TokenFiatOnRam import { Flex, Text, useSporeColors } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { Modal } from 'uniswap/src/components/modals/Modal' -import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' import { FOR_MODAL_SNAP_POINTS } from 'uniswap/src/features/fiatOnRamp/constants' import { FiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/types' import Trace from 'uniswap/src/features/telemetry/Trace' @@ -18,9 +17,6 @@ interface Props { error: boolean loading: boolean list: FiatOnRampCurrency[] | undefined - balancesById: Record | undefined - selectedCurrency?: FiatOnRampCurrency - isOffRamp: boolean } export function FiatOnRampTokenSelectorModal({ @@ -30,9 +26,6 @@ export function FiatOnRampTokenSelectorModal({ onClose, onRetry, onSelectCurrency, - balancesById, - selectedCurrency, - isOffRamp, }: { onClose: () => void } & Props): JSX.Element { const { t } = useTranslation() const colors = useSporeColors() @@ -56,12 +49,9 @@ export function FiatOnRampTokenSelectorModal({ diff --git a/apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx b/apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx deleted file mode 100644 index 127d002587d..00000000000 --- a/apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { useTranslation } from 'react-i18next' -import { Popover, Text } from 'ui/src' - -const POPOVER_OFFSET_X = 31 -const POPOVER_OFFSET_Y = 18 -const POPOVER_WIDTH = 200 - -export function OffRampPopover({ triggerContent }: { triggerContent: JSX.Element }): JSX.Element { - const { t } = useTranslation() - - return ( - - {triggerContent} - - - {t('fiatOffRamp.welcome.tooltip')} - - - ) -} diff --git a/apps/mobile/src/features/firebase/firebaseDataSaga.ts b/apps/mobile/src/features/firebase/firebaseDataSaga.ts index b4148ac80a4..4dee35062e6 100644 --- a/apps/mobile/src/features/firebase/firebaseDataSaga.ts +++ b/apps/mobile/src/features/firebase/firebaseDataSaga.ts @@ -5,12 +5,11 @@ import { getFirebaseUidOrError, getFirestoreMetadataRef, getFirestoreUidRef } fr import { getOneSignalUserIdOrError } from 'src/features/notifications/Onesignal' import { all, call, put, select, takeEvery, takeLatest } from 'typed-redux-saga' import { AccountType } from 'uniswap/src/features/accounts/types' -import { Language } from 'uniswap/src/features/language/constants' -import { getLocale } from 'uniswap/src/features/language/hooks' -import { selectCurrentLanguage } from 'uniswap/src/features/settings/selectors' -import { setCurrentLanguage } from 'uniswap/src/features/settings/slice' import { logger } from 'utilities/src/logger/logger' import { getKeys } from 'utilities/src/primitives/objects' +import { Language } from 'wallet/src/features/language/constants' +import { getLocale } from 'wallet/src/features/language/hooks' +import { selectCurrentLanguage, setCurrentLanguage } from 'wallet/src/features/language/slice' import { EditAccountAction, TogglePushNotificationParams, diff --git a/apps/mobile/src/features/import/InputWithSuffix.tsx b/apps/mobile/src/features/import/InputWithSuffix.tsx index bbb2e43fa20..e57ffd02dc2 100644 --- a/apps/mobile/src/features/import/InputWithSuffix.tsx +++ b/apps/mobile/src/features/import/InputWithSuffix.tsx @@ -1,6 +1,6 @@ import { InputWithSuffixProps } from 'src/features/import/InputWIthSuffixProps' -import { PlatformSplitStubError } from 'utilities/src/errors' +import { NotImplementedError } from 'utilities/src/errors' export default function InputWithSuffix(_props: InputWithSuffixProps): JSX.Element { - throw new PlatformSplitStubError('InputWithSuffix') + throw new NotImplementedError('InputWithSuffix component is not implemented') } diff --git a/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap b/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap index 66580e8076e..7c7fb2177c1 100644 --- a/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap +++ b/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap @@ -85,9 +85,8 @@ exports[`GenericImportForm renders a placeholder when there is no value 1`] = ` "borderTopWidth": 1, "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "500", "height": "auto", "lineHeight": 17, "minWidth": 0, @@ -123,9 +122,8 @@ exports[`GenericImportForm renders a placeholder when there is no value 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } @@ -206,10 +204,10 @@ exports[`GenericImportForm renders a placeholder when there is no value 1`] = ` style={ { "color": "#FC72FF", - "fontFamily": "Basel Grotesk", - "fontSize": 15, + "fontFamily": "Basel-Medium", + "fontSize": 13, "fontWeight": "500", - "lineHeight": 17.25, + "lineHeight": 16, } } suppressHighlighting={true} diff --git a/apps/mobile/src/features/modals/ModalsState.ts b/apps/mobile/src/features/modals/ModalsState.ts index b13b4d7dabe..511e3172a5f 100644 --- a/apps/mobile/src/features/modals/ModalsState.ts +++ b/apps/mobile/src/features/modals/ModalsState.ts @@ -16,7 +16,6 @@ export interface AppModalState { export interface ModalsState { [ModalName.AccountSwitcher]: AppModalState [ModalName.BackupReminder]: AppModalState - [ModalName.BackupReminderWarning]: AppModalState [ModalName.KoreaCexTransferInfoModal]: AppModalState [ModalName.ExchangeTransferModal]: AppModalState<{ serviceProvider: FORServiceProvider diff --git a/apps/mobile/src/features/modals/modalSlice.ts b/apps/mobile/src/features/modals/modalSlice.ts index 28790687edc..1a6d01bf58c 100644 --- a/apps/mobile/src/features/modals/modalSlice.ts +++ b/apps/mobile/src/features/modals/modalSlice.ts @@ -90,15 +90,9 @@ type BackupReminderParams = { initialState?: undefined } -type BackupWarningParams = { - name: typeof ModalName.BackupReminderWarning - initialState?: undefined -} - export type OpenModalParams = | AccountSwitcherModalParams | BackupReminderParams - | BackupWarningParams | KoreaCexTransferInfoModalParams | ExchangeTransferModalParams | ExperimentsModalParams diff --git a/apps/mobile/src/features/nfts/collection/ListPriceCard.tsx b/apps/mobile/src/features/nfts/collection/ListPriceCard.tsx index 6ee5a52560d..069f9c6f512 100644 --- a/apps/mobile/src/features/nfts/collection/ListPriceCard.tsx +++ b/apps/mobile/src/features/nfts/collection/ListPriceCard.tsx @@ -5,9 +5,9 @@ import { ColorTokens, Flex, FlexProps, SpaceTokens, Text, useSporeColors } from import { Ethereum } from 'ui/src/components/logos' import { TextVariantTokens, borderRadii, iconSizes, spacing } from 'ui/src/theme' import { IAmount } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' import { isIOS } from 'utilities/src/platform' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' type ListPriceProps = FlexProps & { price: IAmount @@ -48,7 +48,7 @@ export function PriceAmount({ price, gap = '$spacing4', iconSize = iconSizes.icon16, - textVariant = 'buttonLabel2', + textVariant = 'buttonLabel4', iconColor = '$neutral1', textColor = '$neutral1', }: ListPriceProps): JSX.Element { diff --git a/apps/mobile/src/features/nfts/collection/NFTCollectionHeader.tsx b/apps/mobile/src/features/nfts/collection/NFTCollectionHeader.tsx index 0024914a28c..e3339b02f2e 100644 --- a/apps/mobile/src/features/nfts/collection/NFTCollectionHeader.tsx +++ b/apps/mobile/src/features/nfts/collection/NFTCollectionHeader.tsx @@ -10,10 +10,10 @@ import { Flex, FlexProps, Text, useDeviceInsets, useExtractedColors, useSporeCol import VerifiedIcon from 'ui/src/assets/icons/verified.svg' import { Ethereum } from 'ui/src/components/logos' import { iconSizes, spacing } from 'ui/src/theme' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { NumberType } from 'utilities/src/format/types' import { ImageUri } from 'wallet/src/features/images/ImageUri' import { NFTViewer } from 'wallet/src/features/images/NFTViewer' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' const PROFILE_IMAGE_SIZE = 72 const PROFILE_IMAGE_WRAPPER_SIZE = PROFILE_IMAGE_SIZE + spacing.spacing4 diff --git a/apps/mobile/src/features/nfts/item/CollectionPreviewCard.test.tsx b/apps/mobile/src/features/nfts/item/CollectionPreviewCard.test.tsx index ffd71bf32d6..75548548d1d 100644 --- a/apps/mobile/src/features/nfts/item/CollectionPreviewCard.test.tsx +++ b/apps/mobile/src/features/nfts/item/CollectionPreviewCard.test.tsx @@ -1,7 +1,7 @@ import React from 'react' import { CollectionPreviewCard } from 'src/features/nfts/item/CollectionPreviewCard' import { render } from 'src/test/test-utils' -import { NFT_COLLECTION } from 'uniswap/src/test/fixtures' +import { NFT_COLLECTION } from 'wallet/src/test/fixtures' it('renders collection preview card', () => { const tree = render( null} />) diff --git a/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap b/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap index 43a5e89b68e..35ed042ea69 100644 --- a/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap +++ b/apps/mobile/src/features/nfts/item/__snapshots__/CollectionPreviewCard.test.tsx.snap @@ -93,9 +93,8 @@ exports[`renders collection preview card 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, "textAlign": "center", } @@ -139,9 +138,8 @@ exports[`renders collection preview card 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 19, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/features/nfts/item/__snapshots__/traits.test.tsx.snap b/apps/mobile/src/features/nfts/item/__snapshots__/traits.test.tsx.snap index f58225f4cdb..4c6e07ec4c6 100644 --- a/apps/mobile/src/features/nfts/item/__snapshots__/traits.test.tsx.snap +++ b/apps/mobile/src/features/nfts/item/__snapshots__/traits.test.tsx.snap @@ -24,10 +24,10 @@ exports[`renders trait card 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel Grotesk", - "fontSize": 17, + "fontFamily": "Basel-Medium", + "fontSize": 13, "fontWeight": "500", - "lineHeight": 19.549999999999997, + "lineHeight": 16, } } suppressHighlighting={true} @@ -40,9 +40,8 @@ exports[`renders trait card 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/features/nfts/item/traits.test.tsx b/apps/mobile/src/features/nfts/item/traits.test.tsx index ba72cfd5194..51a1665d46f 100644 --- a/apps/mobile/src/features/nfts/item/traits.test.tsx +++ b/apps/mobile/src/features/nfts/item/traits.test.tsx @@ -1,7 +1,7 @@ import React from 'react' import { NFTTraitCard } from 'src/features/nfts/item/traits' import { render } from 'src/test/test-utils' -import { NFT_ASSET_TRAIT } from 'uniswap/src/test/fixtures' +import { NFT_ASSET_TRAIT } from 'wallet/src/test/fixtures' it('renders trait card', () => { const tree = render() diff --git a/apps/mobile/src/features/nfts/item/traits.tsx b/apps/mobile/src/features/nfts/item/traits.tsx index 6fa510fa022..c25b0397f72 100644 --- a/apps/mobile/src/features/nfts/item/traits.tsx +++ b/apps/mobile/src/features/nfts/item/traits.tsx @@ -1,7 +1,6 @@ import dayjs from 'dayjs' import React from 'react' -import { ListRenderItemInfo, StyleSheet } from 'react-native' -import { FlatList } from 'react-native-gesture-handler' +import { FlatList, ListRenderItemInfo, StyleSheet } from 'react-native' import { Flex, Text, useSporeColors } from 'ui/src' import { spacing } from 'ui/src/theme' import { NftAssetTrait } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' @@ -30,7 +29,7 @@ export function NFTTraitCard({ return ( - + {trait.name} diff --git a/apps/mobile/src/features/onboarding/BackupSpeedBumpModal.tsx b/apps/mobile/src/features/onboarding/BackupSpeedBumpModal.tsx index 56d5f55037b..89f099f91cf 100644 --- a/apps/mobile/src/features/onboarding/BackupSpeedBumpModal.tsx +++ b/apps/mobile/src/features/onboarding/BackupSpeedBumpModal.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react' +import { useState } from 'react' import { useTranslation } from 'react-i18next' import { LockPreviewImage } from 'src/features/onboarding/LockPreviewImage' import { Button, CheckBox, Flex, Text, useIsDarkMode, useShadowPropsShort } from 'ui/src' @@ -19,29 +19,30 @@ export function BackupSpeedBumpModal({ backupType, onContinue, onClose }: Backup const { t } = useTranslation() const [checked, setChecked] = useState(false) - const { preview, title, description, disclaimer } = useMemo(() => { - switch (backupType) { - case BackupType.Cloud: - return { - preview: , - title: t('onboarding.backup.speedBump.cloud.title'), - description: t('onboarding.backup.speedBump.cloud.description'), - disclaimer: t('onboarding.backup.speedBump.cloud.disclaimer'), - } - case BackupType.Manual: - return { - preview: , - title: t('onboarding.backup.speedBump.manual.title'), - description: t('onboarding.backup.speedBump.manual.description'), - disclaimer: t('onboarding.backup.speedBump.manual.disclaimer'), - } - } - }, [backupType, t]) + let preview + let title + let description + + switch (backupType) { + case BackupType.Cloud: + preview = + title = t('onboarding.backup.speedBump.cloud.title') + description = t('onboarding.backup.speedBump.cloud.description') + break + case BackupType.Manual: + preview = + title = t('onboarding.backup.speedBump.manual.title') + description = t('onboarding.backup.speedBump.manual.description') + break + default: + break + } return ( {preview} + {title} @@ -68,7 +69,7 @@ export function BackupSpeedBumpModal({ backupType, onContinue, onClose }: Backup }} /> - {disclaimer} + {t('onboarding.backup.speedBump.disclaimer')} diff --git a/apps/mobile/src/features/onboarding/OnboardingScreen.tsx b/apps/mobile/src/features/onboarding/OnboardingScreen.tsx index bd83bb6b3d1..0b9b8714bf2 100644 --- a/apps/mobile/src/features/onboarding/OnboardingScreen.tsx +++ b/apps/mobile/src/features/onboarding/OnboardingScreen.tsx @@ -3,10 +3,10 @@ import { useHeaderHeight } from '@react-navigation/elements' import React, { PropsWithChildren, useCallback } from 'react' import { BackHandler, KeyboardAvoidingView, StyleSheet } from 'react-native' import { FadeIn, FadeOut } from 'react-native-reanimated' -import { HeaderSkipButton, renderHeaderBackButton } from 'src/app/navigation/components' +import { renderHeaderBackButton } from 'src/app/navigation/components' import { useOnboardingStackNavigation } from 'src/app/navigation/types' import { SHORT_SCREEN_HEADER_HEIGHT_RATIO, Screen } from 'src/components/layout/Screen' -import { Flex, GeneratedIcon, SpaceTokens, Text, useDeviceInsets, useMedia } from 'ui/src' +import { Flex, SpaceTokens, Text, useDeviceInsets, useMedia } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { fonts } from 'ui/src/theme' import { isIOS } from 'utilities/src/platform' @@ -14,23 +14,19 @@ import { isIOS } from 'utilities/src/platform' type OnboardingScreenProps = { subtitle?: string title?: string - Icon?: GeneratedIcon paddingTop?: SpaceTokens childrenGap?: SpaceTokens keyboardAvoidingViewEnabled?: boolean disableGoBack?: boolean - onSkip?: () => void } export function OnboardingScreen({ title, subtitle, - Icon, children, paddingTop = '$none', keyboardAvoidingViewEnabled = true, disableGoBack = false, - onSkip, }: PropsWithChildren): JSX.Element { const navigation = useOnboardingStackNavigation() const headerHeight = useHeaderHeight() @@ -44,16 +40,13 @@ export function OnboardingScreen({ navigation.setOptions({ headerLeft: disableGoBack ? (): null => null : renderHeaderBackButton, gestureEnabled: !disableGoBack, - headerRight: !onSkip - ? (): null => null - : (_props): JSX.Element => onSkip()} />, }) const subscription = BackHandler.addEventListener('hardwareBackPress', () => { return disableGoBack }) return subscription.remove - }, [navigation, disableGoBack, onSkip]), + }, [navigation, disableGoBack]), ) return ( @@ -69,16 +62,15 @@ export function OnboardingScreen({ > {/* Text content */} - - {Icon && ( - - - - - - )} + {title && ( - + {title} )} @@ -88,7 +80,7 @@ export function OnboardingScreen({ color="$neutral2" maxFontSizeMultiplier={media.short ? 1.1 : fonts.body2.maxFontSizeMultiplier} textAlign="center" - variant="subheading2" + variant="body2" > {subtitle} diff --git a/apps/mobile/src/features/onboarding/OptionCard.tsx b/apps/mobile/src/features/onboarding/OptionCard.tsx index 41f528beac1..15134505bca 100644 --- a/apps/mobile/src/features/onboarding/OptionCard.tsx +++ b/apps/mobile/src/features/onboarding/OptionCard.tsx @@ -47,25 +47,24 @@ export function OptionCard({ {icon} - - - {title} - - + + {title} + {badgeText && ( - + {badgeText} diff --git a/apps/mobile/src/features/onboarding/SafeKeyboardOnboardingScreen.tsx b/apps/mobile/src/features/onboarding/SafeKeyboardOnboardingScreen.tsx index 6f491d0e0e8..3816a55bb50 100644 --- a/apps/mobile/src/features/onboarding/SafeKeyboardOnboardingScreen.tsx +++ b/apps/mobile/src/features/onboarding/SafeKeyboardOnboardingScreen.tsx @@ -4,14 +4,13 @@ import React, { PropsWithChildren } from 'react' import { StyleSheet } from 'react-native' import { FadeIn, FadeOut } from 'react-native-reanimated' import { SafeKeyboardScreen } from 'src/components/layout/SafeKeyboardScreen' -import { Flex, GeneratedIcon, SpaceTokens, Text, useMedia, useSporeColors } from 'ui/src' +import { Flex, SpaceTokens, Text, useMedia, useSporeColors } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { opacify } from 'ui/src/theme' type OnboardingScreenProps = { subtitle?: string title?: string - Icon?: GeneratedIcon paddingTop?: SpaceTokens footer?: JSX.Element minHeightWhenKeyboardExpanded?: boolean @@ -20,7 +19,6 @@ type OnboardingScreenProps = { export function SafeKeyboardOnboardingScreen({ title, subtitle, - Icon, children, footer, paddingTop = '$none', @@ -44,21 +42,14 @@ export function SafeKeyboardOnboardingScreen({ const page = ( <> {title || subtitle ? ( - - {Icon && ( - - - - - - )} + {title && ( - + {title} )} {subtitle && ( - + {subtitle} )} diff --git a/apps/mobile/src/features/onboarding/hooks.ts b/apps/mobile/src/features/onboarding/hooks.ts index 9eda0414d3c..40debb481b5 100644 --- a/apps/mobile/src/features/onboarding/hooks.ts +++ b/apps/mobile/src/features/onboarding/hooks.ts @@ -1,11 +1,9 @@ import { SharedEventName } from '@uniswap/analytics-events' import { useDispatch } from 'react-redux' import { OnboardingStackBaseParams, useOnboardingStackNavigation } from 'src/app/navigation/types' -import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' import { MobileAppsFlyerEvents } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent, sendAppsFlyerEvent } from 'uniswap/src/features/telemetry/send' -import { ImportType, OnboardingEntryPoint } from 'uniswap/src/types/onboarding' +import { OnboardingEntryPoint } from 'uniswap/src/types/onboarding' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { logger } from 'utilities/src/logger/logger' import { useOnboardingContext } from 'wallet/src/features/onboarding/OnboardingContext' @@ -30,16 +28,8 @@ export function useCompleteOnboardingCallback({ const onboardingAddresses = Object.keys(onboardingAccounts) return async () => { - const createdFromOnboardingRedesign = - importType === ImportType.CreateNew && - getExperimentValue( - Experiments.OnboardingRedesignRecoveryBackup, - OnboardingRedesignRecoveryBackupProperties.Enabled, - false, - ) - // Run all shared onboarding completion logic - await finishOnboarding({ importType, createdFromOnboardingRedesign }) + await finishOnboarding({ importType }) // Send appsflyer event for mobile attribution if (entryPoint === OnboardingEntryPoint.FreshInstallOrReplace) { diff --git a/apps/mobile/src/features/openai/AIAssistantScreen.tsx b/apps/mobile/src/features/openai/AIAssistantScreen.tsx index 8ab07d501a9..67e379ffe7c 100644 --- a/apps/mobile/src/features/openai/AIAssistantScreen.tsx +++ b/apps/mobile/src/features/openai/AIAssistantScreen.tsx @@ -6,9 +6,8 @@ import { ArrowUpCircle, UniswapLogo } from 'ui/src/components/icons' import { fonts, spacing } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' import { useBottomSheetSafeKeyboard } from 'uniswap/src/components/modals/useBottomSheetSafeKeyboard' -import { useAvatar } from 'uniswap/src/features/address/avatar' import { AccountIcon } from 'wallet/src/components/accounts/AccountIcon' -import { useActiveAccountAddress } from 'wallet/src/features/wallet/hooks' +import { useActiveAccountAddress, useAvatar } from 'wallet/src/features/wallet/hooks' export function AIAssistantScreen(): JSX.Element { const scrollRef = useRef(null) diff --git a/apps/mobile/src/features/scantastic/ScantasticModal.tsx b/apps/mobile/src/features/scantastic/ScantasticModal.tsx index 5b24ea79214..c99dc0688bf 100644 --- a/apps/mobile/src/features/scantastic/ScantasticModal.tsx +++ b/apps/mobile/src/features/scantastic/ScantasticModal.tsx @@ -6,7 +6,7 @@ import { closeAllModals } from 'src/features/modals/modalSlice' import { selectModalState } from 'src/features/modals/selectModalState' import { getEncryptedMnemonic } from 'src/features/scantastic/ScantasticEncryption' import { Button, Flex, Text, TouchableArea, useSporeColors } from 'ui/src' -import { AlertTriangleFilled, Faceid, Laptop, LinkBrokenHorizontal, Wifi } from 'ui/src/components/icons' +import { AlertTriangle, Faceid, Laptop, LinkBrokenHorizontal, Wifi } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' import { uniswapUrls } from 'uniswap/src/constants/urls' @@ -285,7 +285,7 @@ export function ScantasticModal(): JSX.Element | null { - + {t('common.text.error')} @@ -293,7 +293,7 @@ export function ScantasticModal(): JSX.Element | null { @@ -349,7 +349,7 @@ export function ScantasticModal(): JSX.Element | null { p="$spacing16" width="100%" > - + {t('scantastic.confirmation.warning')} @@ -364,7 +364,7 @@ export function ScantasticModal(): JSX.Element | null { {t('scantastic.confirmation.button.continue')} - + {t('common.button.cancel')} diff --git a/apps/mobile/src/features/send/SendFormButton.tsx b/apps/mobile/src/features/send/SendFormButton.tsx index 13868c5064b..3763357f7cd 100644 --- a/apps/mobile/src/features/send/SendFormButton.tsx +++ b/apps/mobile/src/features/send/SendFormButton.tsx @@ -4,11 +4,10 @@ import { Button } from 'ui/src' import { AccountType } from 'uniswap/src/features/accounts/types' import { useTransactionModalContext } from 'uniswap/src/features/transactions/TransactionModal/TransactionModalContext' import { WarningAction } from 'uniswap/src/features/transactions/WarningModal/types' -import { useIsBlocked } from 'uniswap/src/features/trm/hooks' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { SendScreen, useSendContext } from 'wallet/src/features/transactions/contexts/SendContext' import { createTransactionId } from 'wallet/src/features/transactions/utils' -import { useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' export function SendFormButton({ diff --git a/apps/mobile/src/features/send/SendFormScreen.tsx b/apps/mobile/src/features/send/SendFormScreen.tsx index 616fed1eec1..8c232d9d1d0 100644 --- a/apps/mobile/src/features/send/SendFormScreen.tsx +++ b/apps/mobile/src/features/send/SendFormScreen.tsx @@ -2,6 +2,7 @@ import React, { Dispatch, SetStateAction, useCallback, useEffect, useState } fro import { useTranslation } from 'react-i18next' import { Keyboard, LayoutAnimation, TouchableWithoutFeedback } from 'react-native' import Animated from 'react-native-reanimated' +import { useSelector } from 'react-redux' import { RecipientSelect } from 'src/components/RecipientSelect/RecipientSelect' import { SendFormButton } from 'src/features/send/SendFormButton' import { SendHeader } from 'src/features/send/SendHeader' @@ -11,10 +12,19 @@ import { Flex, useSporeColors } from 'ui/src' import EyeIcon from 'ui/src/assets/icons/eye.svg' import { iconSizes } from 'ui/src/theme' import { TokenSelectorModal, TokenSelectorVariation } from 'uniswap/src/components/TokenSelector/TokenSelector' +import { + useCommonTokensOptions, + useFilterCallbacks, + usePopularTokensOptions, + usePortfolioTokenOptions, + useTokenSectionsForSearchResults, +} from 'uniswap/src/components/TokenSelector/hooks' import { TokenSelectorFlow } from 'uniswap/src/components/TokenSelector/types' import { Modal } from 'uniswap/src/components/modals/Modal' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' +import { TokenSearchResult } from 'uniswap/src/features/search/SearchResult' +import { selectSearchHistory } from 'uniswap/src/features/search/selectSearchHistory' import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { useTokenWarningDismissed } from 'uniswap/src/features/tokens/slice/hooks' import { TransactionModalFooterContainer, TransactionModalInnerContainer, @@ -22,7 +32,15 @@ import { import { useTransactionModalContext } from 'uniswap/src/features/transactions/TransactionModal/TransactionModalContext' import { WarningSeverity } from 'uniswap/src/features/transactions/WarningModal/types' import { CurrencyField } from 'uniswap/src/types/currency' +import { + useAddToSearchHistory, + useFavoriteTokensOptions, + useTokenSectionsForEmptySearch, +} from 'wallet/src/components/TokenSelector/hooks' import { WarningModal } from 'wallet/src/components/modals/WarningModal/WarningModal' +import { useWalletNavigation } from 'wallet/src/contexts/WalletNavigationContext' +import { usePortfolioValueModifiers } from 'wallet/src/features/dataApi/balances' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { useSendContext } from 'wallet/src/features/transactions/contexts/SendContext' import { useActiveAccountAddressWithThrow } from 'wallet/src/features/wallet/hooks' @@ -106,8 +124,12 @@ export function SendFormContent({ const colors = useSporeColors() const { t } = useTranslation() const { formatNumberOrString, convertFiatAmountFormatted } = useLocalizationContext() + const { navigateToBuyOrReceiveWithEmptyWallet } = useWalletNavigation() const activeAccountAddress = useActiveAccountAddressWithThrow() + const valueModifiers = usePortfolioValueModifiers(activeAccountAddress) + const { registerSearch } = useAddToSearchHistory() + const searchHistory = useSelector(selectSearchHistory) const { selectingCurrencyField, onSelectCurrency, updateSendForm } = useSendContext() @@ -140,10 +162,22 @@ export function SendFormContent({ Keyboard.dismiss()} diff --git a/apps/mobile/src/features/send/SendHeader.tsx b/apps/mobile/src/features/send/SendHeader.tsx index c195b3eeeea..2b3a40d4df4 100644 --- a/apps/mobile/src/features/send/SendHeader.tsx +++ b/apps/mobile/src/features/send/SendHeader.tsx @@ -43,7 +43,7 @@ export function SendHeader({ flowName, setShowViewOnlyModal }: HeaderContentProp > - + {t('swap.header.viewOnly')} diff --git a/apps/mobile/src/features/send/SendTokenForm.tsx b/apps/mobile/src/features/send/SendTokenForm.tsx index b08641ff9d0..656e532afe5 100644 --- a/apps/mobile/src/features/send/SendTokenForm.tsx +++ b/apps/mobile/src/features/send/SendTokenForm.tsx @@ -13,7 +13,6 @@ import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useTransactionModalContext } from 'uniswap/src/features/transactions/TransactionModal/TransactionModalContext' import { WarningSeverity } from 'uniswap/src/features/transactions/WarningModal/types' import { useUSDCValue } from 'uniswap/src/features/transactions/swap/hooks/useUSDCPrice' -import { useIsBlocked } from 'uniswap/src/features/trm/hooks' import { CurrencyField } from 'uniswap/src/types/currency' import { truncateToMaxDecimals } from 'utilities/src/format/truncateToMaxDecimals' import { RecipientInputPanel } from 'wallet/src/components/input/RecipientInputPanel' @@ -31,7 +30,7 @@ import { import { SwapArrowButton } from 'wallet/src/features/transactions/swap/SwapArrowButton' import { useUSDTokenUpdater } from 'wallet/src/features/transactions/swap/trade/hooks/useUSDTokenUpdater' import { BlockedAddressWarning } from 'wallet/src/features/trm/BlockedAddressWarning' -import { useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' const TRANSFER_DIRECTION_BUTTON_SIZE = iconSizes.icon20 const TRANSFER_DIRECTION_BUTTON_INNER_PADDING = spacing.spacing12 diff --git a/apps/mobile/src/features/unitags/ChooseProfilePictureScreen.tsx b/apps/mobile/src/features/unitags/ChooseProfilePictureScreen.tsx index b60c2d68939..2e07b057d69 100644 --- a/apps/mobile/src/features/unitags/ChooseProfilePictureScreen.tsx +++ b/apps/mobile/src/features/unitags/ChooseProfilePictureScreen.tsx @@ -8,15 +8,12 @@ import { ChoosePhotoOptionsModal } from 'src/components/unitags/ChoosePhotoOptio import { UnitagProfilePicture } from 'src/components/unitags/UnitagProfilePicture' import { SafeKeyboardOnboardingScreen } from 'src/features/onboarding/SafeKeyboardOnboardingScreen' import { UnitagName } from 'src/features/unitags/UnitagName' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { Button, Flex, Text, useIsDarkMode, useSporeColors } from 'ui/src' -import { Pen, Photo } from 'ui/src/components/icons' +import { Pen } from 'ui/src/components/icons' import { fonts, iconSizes, imageSizes, spacing } from 'ui/src/theme' import { useENSName } from 'uniswap/src/features/ens/api' import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' import { getExperimentValue } from 'uniswap/src/features/gating/hooks' -import { UnitagEventName } from 'uniswap/src/features/telemetry/constants' -import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { UnitagClaimSource } from 'uniswap/src/features/unitags/types' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { UniverseChainId } from 'uniswap/src/types/chains' @@ -39,7 +36,6 @@ function convertEntryPointToAnalyticsSource(entryPoint: UnitagEntryPoint): Unita } export function ChooseProfilePictureScreen({ - navigation, route, }: UnitagStackScreenProp): JSX.Element { const { entryPoint, unitag, unitagFontSize, address } = route.params @@ -124,30 +120,8 @@ export function ChooseProfilePictureScreen({ } } - const onPressSkip = (): void => { - const onboardingExperimentEnabled = getExperimentValue( - Experiments.OnboardingRedesignRecoveryBackup, - OnboardingRedesignRecoveryBackupProperties.Enabled, - false, - ) - - sendAnalyticsEvent(UnitagEventName.UnitagOnboardingActionTaken, { action: 'later' }) - // Navigate to next screen if in onboarding - navigate(MobileScreens.OnboardingStack, { - screen: onboardingExperimentEnabled ? OnboardingScreens.Notifications : OnboardingScreens.WelcomeWallet, - params: { - importType: ImportType.CreateNew, - entryPoint: OnboardingEntryPoint.FreshInstallOrReplace, - }, - }) - } - - const showSkipButton = entryPoint === OnboardingScreens.Landing - useNavigationHeader(navigation, showSkipButton ? onPressSkip : undefined) - return ( diff --git a/apps/mobile/src/features/unitags/ClaimUnitagScreen.tsx b/apps/mobile/src/features/unitags/ClaimUnitagScreen.tsx index 99ca5fbec6a..aae88ed39ec 100644 --- a/apps/mobile/src/features/unitags/ClaimUnitagScreen.tsx +++ b/apps/mobile/src/features/unitags/ClaimUnitagScreen.tsx @@ -8,10 +8,10 @@ import { navigate } from 'src/app/navigation/rootNavigation' import { UnitagStackParamList } from 'src/app/navigation/types' import { SafeKeyboardOnboardingScreen } from 'src/features/onboarding/SafeKeyboardOnboardingScreen' import { UnitagName } from 'src/features/unitags/UnitagName' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' +import { useAddBackButton } from 'src/utils/useAddBackButton' import { AnimatePresence, Button, Flex, Image, Text, TouchableArea, useSporeColors } from 'ui/src' import { ENS_LOGO } from 'ui/src/assets' -import { InfoCircleFilled, LinkHorizontalAlt, Person } from 'ui/src/components/icons' +import { InfoCircleFilled, LinkHorizontalAlt } from 'ui/src/components/icons' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { DEP_accentColors, fonts, iconSizes, imageSizes, spacing, validColor } from 'ui/src/theme' import { TextInput } from 'uniswap/src/components/input/TextInput' @@ -20,7 +20,8 @@ import { LearnMoreLink } from 'uniswap/src/components/text/LearnMoreLink' import { uniswapUrls } from 'uniswap/src/constants/urls' import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' import { getExperimentValue } from 'uniswap/src/features/gating/hooks' -import { ModalName, UnitagEventName } from 'uniswap/src/features/telemetry/constants' +import Trace from 'uniswap/src/features/telemetry/Trace' +import { ElementName, ModalName, UnitagEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { ImportType, OnboardingEntryPoint } from 'uniswap/src/types/onboarding' @@ -56,6 +57,7 @@ type Props = NativeStackScreenProps { + const onPressMaybeLater = (): void => { const onboardingExperimentEnabled = getExperimentValue( Experiments.OnboardingRedesignRecoveryBackup, OnboardingRedesignRecoveryBackupProperties.Enabled, @@ -162,9 +164,6 @@ export function ClaimUnitagScreen({ navigation, route }: Props): JSX.Element { }) } - const showSkipButton = entryPoint === OnboardingScreens.Landing - useNavigationHeader(navigation, showSkipButton ? onPressSkip : undefined) - const navigateWithAnimation = useCallback( (unitag: string) => { if (!unitagAddress) { @@ -247,7 +246,7 @@ export function ClaimUnitagScreen({ navigation, route }: Props): JSX.Element { : t('unitags.onboarding.claim.title.choose') return ( - + {UNITAG_SUFFIX} @@ -356,6 +355,15 @@ export function ClaimUnitagScreen({ navigation, route }: Props): JSX.Element { )} + {entryPoint === OnboardingScreens.Landing && ( + + + + {t('common.button.later')} + + + + )} diff --git a/apps/mobile/src/screens/Import/RestoreCloudBackupLoadingScreen.tsx b/apps/mobile/src/screens/Import/RestoreCloudBackupLoadingScreen.tsx index 1e61f6696ee..b83b50030e5 100644 --- a/apps/mobile/src/screens/Import/RestoreCloudBackupLoadingScreen.tsx +++ b/apps/mobile/src/screens/Import/RestoreCloudBackupLoadingScreen.tsx @@ -11,9 +11,9 @@ import { import { clearCloudBackups } from 'src/features/CloudBackup/cloudBackupSlice' import { useCloudBackups } from 'src/features/CloudBackup/hooks' import { OnboardingScreen } from 'src/features/onboarding/OnboardingScreen' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' +import { useAddBackButton } from 'src/utils/useAddBackButton' import { Flex, Loader } from 'ui/src' -import { DownloadAlt, OSDynamicCloudIcon } from 'ui/src/components/icons' +import { OSDynamicCloudIcon } from 'ui/src/components/icons' import { imageSizes } from 'ui/src/theme' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' import { ImportType } from 'uniswap/src/types/onboarding' @@ -46,7 +46,7 @@ export function RestoreCloudBackupLoadingScreen({ navigation, route: { params } const backups = useCloudBackups(mnemonicId) - useNavigationHeader(navigation) + useAddBackButton(navigation) // Starts query for cloud backup files, backup files found are streamed into Redux const fetchCloudStorageBackups = useCallback(() => { @@ -171,7 +171,7 @@ export function RestoreCloudBackupLoadingScreen({ navigation, route: { params } } return ( - + ) diff --git a/apps/mobile/src/screens/Import/RestoreCloudBackupPasswordScreen.tsx b/apps/mobile/src/screens/Import/RestoreCloudBackupPasswordScreen.tsx index f73dc28b8ec..ad7a767df4f 100644 --- a/apps/mobile/src/screens/Import/RestoreCloudBackupPasswordScreen.tsx +++ b/apps/mobile/src/screens/Import/RestoreCloudBackupPasswordScreen.tsx @@ -16,9 +16,8 @@ import { import { selectLockoutEndTime, selectPasswordAttempts } from 'src/features/CloudBackup/selectors' import { OnboardingScreen } from 'src/features/onboarding/OnboardingScreen' import { PasswordError } from 'src/features/onboarding/PasswordError' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' +import { useAddBackButton } from 'src/utils/useAddBackButton' import { Button, Flex, Text, TouchableArea } from 'ui/src' -import { Cloud } from 'ui/src/components/icons' import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { ImportType } from 'uniswap/src/types/onboarding' import { OnboardingScreens } from 'uniswap/src/types/screens/mobile' @@ -101,7 +100,7 @@ export function RestoreCloudBackupPasswordScreen({ navigation, route: { params } }, [isLockedOut, lockoutMessage, remainingLockoutTime, dispatch]), ) - useNavigationHeader(navigation) + useAddBackButton(navigation) const onPasswordSubmit = async (): Promise => { if (isLockedOut || enteredPassword.length === 0) { @@ -142,7 +141,6 @@ export function RestoreCloudBackupPasswordScreen({ navigation, route: { params } return ( @@ -166,7 +164,7 @@ export function RestoreCloudBackupPasswordScreen({ navigation, route: { params } {isRestoringMnemonic && ( - + {t('account.cloud.password.recoveryPhrase')} diff --git a/apps/mobile/src/screens/Import/RestoreCloudBackupScreen.tsx b/apps/mobile/src/screens/Import/RestoreCloudBackupScreen.tsx index e92bda0d2b4..82bcc0b73d8 100644 --- a/apps/mobile/src/screens/Import/RestoreCloudBackupScreen.tsx +++ b/apps/mobile/src/screens/Import/RestoreCloudBackupScreen.tsx @@ -6,14 +6,14 @@ import { OnboardingStackParamList } from 'src/app/navigation/types' import { useCloudBackups } from 'src/features/CloudBackup/hooks' import { CloudStorageMnemonicBackup } from 'src/features/CloudBackup/types' import { OnboardingScreen } from 'src/features/onboarding/OnboardingScreen' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' +import { useAddBackButton } from 'src/utils/useAddBackButton' import { Flex, Text, TouchableArea, Unicon, useIsDarkMode } from 'ui/src' -import { DownloadAlt, RotatableChevron } from 'ui/src/components/icons' +import { RotatableChevron } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' -import { FORMAT_DATE_TIME_SHORT, useLocalizedDayjs } from 'uniswap/src/features/language/localizedDayjs' import { OnboardingScreens } from 'uniswap/src/types/screens/mobile' import { sanitizeAddressText, shortenAddress } from 'uniswap/src/utils/addresses' import { getCloudProviderName } from 'uniswap/src/utils/cloud-backup/getCloudProviderName' +import { FORMAT_DATE_TIME_SHORT, useLocalizedDayjs } from 'wallet/src/features/language/localizedDayjs' type Props = NativeStackScreenProps @@ -34,11 +34,10 @@ export function RestoreCloudBackupScreen({ navigation, route: { params } }: Prop }) } - useNavigationHeader(navigation) + useAddBackButton(navigation) return ( @@ -65,7 +64,7 @@ export function RestoreCloudBackupScreen({ navigation, route: { params } }: Prop {sanitizeAddressText(shortenAddress(mnemonicId))} - + {localizedDayjs.unix(createdAt).format(FORMAT_DATE_TIME_SHORT)} diff --git a/apps/mobile/src/screens/Import/SeedPhraseInputScreen.android.mock.tsx b/apps/mobile/src/screens/Import/SeedPhraseInputScreen.android.mock.tsx index 57f5ce9d541..e084588f9a6 100644 --- a/apps/mobile/src/screens/Import/SeedPhraseInputScreen.android.mock.tsx +++ b/apps/mobile/src/screens/Import/SeedPhraseInputScreen.android.mock.tsx @@ -5,7 +5,7 @@ import { OnboardingStackParamList } from 'src/app/navigation/types' import { useLockScreenOnBlur } from 'src/features/authentication/lockScreenContext' import { GenericImportForm } from 'src/features/import/GenericImportForm' import { SafeKeyboardOnboardingScreen } from 'src/features/onboarding/SafeKeyboardOnboardingScreen' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' +import { useAddBackButton } from 'src/utils/useAddBackButton' import { Button, Flex, Text, TouchableArea } from 'ui/src' import { QuestionInCircleFilled } from 'ui/src/components/icons' import { uniswapUrls } from 'uniswap/src/constants/urls' @@ -48,7 +48,7 @@ export function SeedPhraseInputScreen({ navigation, route: { params } }: Props): const isRestoringMnemonic = params.importType === ImportType.RestoreMnemonic - useNavigationHeader(navigation) + useAddBackButton(navigation) const signerAccounts = useSignerAccounts() const mnemonicId = (isRestoringMnemonic && signerAccounts[0]?.mnemonicId) || undefined diff --git a/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx b/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx index c827da694fc..f816cf0f6a9 100644 --- a/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx +++ b/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx @@ -13,9 +13,9 @@ import { StringKey, handleSubmit, } from 'src/screens/Import/SeedPhraseInput' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' +import { useAddBackButton } from 'src/utils/useAddBackButton' import { Button, Flex, Text, TouchableArea } from 'ui/src' -import { PapersText, QuestionInCircleFilled } from 'ui/src/components/icons' +import { QuestionInCircleFilled } from 'ui/src/components/icons' import { uniswapUrls } from 'uniswap/src/constants/urls' import Trace from 'uniswap/src/features/telemetry/Trace' import { ElementName } from 'uniswap/src/features/telemetry/constants' @@ -47,7 +47,7 @@ export function SeedPhraseInputScreen({ navigation, route: { params } }: Props): const seedPhraseInputRef = useRef(null) const isRestoringMnemonic = params.importType === ImportType.RestoreMnemonic - useNavigationHeader(navigation) + useAddBackButton(navigation) const signerAccounts = useSignerAccounts() const targetMnemonicId = (isRestoringMnemonic && signerAccounts[0]?.mnemonicId) || undefined @@ -72,7 +72,6 @@ export function SeedPhraseInputScreen({ navigation, route: { params } }: Props): return ( + + )} diff --git a/apps/mobile/src/screens/Onboarding/CloudBackupPasswordConfirmScreen.tsx b/apps/mobile/src/screens/Onboarding/CloudBackupPasswordConfirmScreen.tsx index d6a5a856f7d..725f6a986ed 100644 --- a/apps/mobile/src/screens/Onboarding/CloudBackupPasswordConfirmScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/CloudBackupPasswordConfirmScreen.tsx @@ -1,14 +1,13 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Keyboard } from 'react-native' import { OnboardingStackParamList } from 'src/app/navigation/types' import { CloudBackupPassword } from 'src/features/CloudBackup/CloudBackupForm' import { BackupSpeedBumpModal } from 'src/features/onboarding/BackupSpeedBumpModal' import { SafeKeyboardOnboardingScreen } from 'src/features/onboarding/SafeKeyboardOnboardingScreen' import { Flex } from 'ui/src' -import { Cloud } from 'ui/src/components/icons' -import { OnboardingEntryPoint } from 'uniswap/src/types/onboarding' +import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' +import { useExperimentValue } from 'uniswap/src/features/gating/hooks' import { OnboardingScreens } from 'uniswap/src/types/screens/mobile' import { BackupType } from 'wallet/src/features/wallet/accounts/types' @@ -17,14 +16,17 @@ export type Props = NativeStackScreenProps { - setShowSpeedBumpModal(false) navigation.navigate({ name: OnboardingScreens.BackupCloudProcessing, params, @@ -40,18 +42,10 @@ export function CloudBackupPasswordConfirmScreen({ navigation, route: { params } passwordToConfirm={password} > { - Keyboard.dismiss() - setShowSpeedBumpModal(true) - } - : undefined - } + onPressContinue={onboardingExperimentEnabled ? (): void => setShowSpeedBumpModal(true) : undefined} /> } diff --git a/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx b/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx index 80df22d33f5..e71e8bb1d7f 100644 --- a/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx @@ -5,7 +5,6 @@ import { OnboardingStackParamList } from 'src/app/navigation/types' import { CloudBackupPassword } from 'src/features/CloudBackup/CloudBackupForm' import { SafeKeyboardOnboardingScreen } from 'src/features/onboarding/SafeKeyboardOnboardingScreen' import { Flex } from 'ui/src' -import { Cloud } from 'ui/src/components/icons' import { OnboardingScreens } from 'uniswap/src/types/screens/mobile' export type Props = NativeStackScreenProps @@ -30,7 +29,6 @@ export function CloudBackupPasswordCreateScreen({ navigation, route: { params } return ( diff --git a/apps/mobile/src/screens/Onboarding/CloudBackupProcessingScreen.tsx b/apps/mobile/src/screens/Onboarding/CloudBackupProcessingScreen.tsx index edd3b299e91..786025458e8 100644 --- a/apps/mobile/src/screens/Onboarding/CloudBackupProcessingScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/CloudBackupProcessingScreen.tsx @@ -1,24 +1,24 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import React from 'react' +import { navigate } from 'src/app/navigation/rootNavigation' import { OnboardingStackParamList } from 'src/app/navigation/types' import { Screen } from 'src/components/layout/Screen' import { CloudBackupProcessingAnimation } from 'src/features/CloudBackup/CloudBackupProcessingAnimation' import { OnboardingEntryPoint } from 'uniswap/src/types/onboarding' -import { OnboardingScreens } from 'uniswap/src/types/screens/mobile' +import { MobileScreens, OnboardingScreens } from 'uniswap/src/types/screens/mobile' type Props = NativeStackScreenProps /** Screen to perform secure recovery phrase backup to Cloud */ -export function CloudBackupProcessingScreen({ navigation, route: { params } }: Props): JSX.Element | null { - const { password, importType, entryPoint, address } = params - +export function CloudBackupProcessingScreen({ + navigation, + route: { + params: { password, importType, entryPoint, address }, + }, +}: Props): JSX.Element | null { const onBackupComplete = (): void => { if (entryPoint === OnboardingEntryPoint.BackupCard) { - navigation.navigate({ - name: OnboardingScreens.BackupManual, - params: { ...params, fromCloudBackup: true }, - merge: true, - }) + navigate(MobileScreens.Home) } else { navigation.navigate({ name: OnboardingScreens.Notifications, diff --git a/apps/mobile/src/screens/Onboarding/LandingScreen.tsx b/apps/mobile/src/screens/Onboarding/LandingScreen.tsx index d1aaeabb39e..ebaa3edfc94 100644 --- a/apps/mobile/src/screens/Onboarding/LandingScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/LandingScreen.tsx @@ -93,7 +93,7 @@ export function LandingScreen({ navigation }: Props): JSX.Element { testID={TestID.CreateAccount} onPress={onPressCreateWallet} > - + {t('onboarding.landing.button.create')} @@ -114,9 +114,9 @@ export function LandingScreen({ navigation }: Props): JSX.Element { onPress={onPressImportWallet} > {t('onboarding.landing.button.add')} diff --git a/apps/mobile/src/screens/Onboarding/ManualBackupScreen.tsx b/apps/mobile/src/screens/Onboarding/ManualBackupScreen.tsx index c8c4247fe32..4e677641ab1 100644 --- a/apps/mobile/src/screens/Onboarding/ManualBackupScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/ManualBackupScreen.tsx @@ -13,9 +13,11 @@ import { BackupSpeedBumpModal } from 'src/features/onboarding/BackupSpeedBumpMod import { OnboardingScreen } from 'src/features/onboarding/OnboardingScreen' import { Button, Flex, Text, useMedia, useSporeColors } from 'ui/src' import LockIcon from 'ui/src/assets/icons/lock.svg' -import { EyeSlash, FileListLock, GraduationCap, Key, PapersText, Pen } from 'ui/src/components/icons' +import { EyeSlash, FileListLock, Key, Pen } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' import { Modal } from 'uniswap/src/components/modals/Modal' +import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' +import { useExperimentValue } from 'uniswap/src/features/gating/hooks' import { ModalName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { TestID } from 'uniswap/src/test/fixtures/testIDs' @@ -43,8 +45,11 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS const onboardingContextAccount = getOnboardingOrImportedAccount() const activeAccount = useSignerAccountIfExists(params.address) - const { entryPoint, fromCloudBackup } = params - const onboardingExperimentEnabled = entryPoint === OnboardingEntryPoint.BackupCard + const onboardingExperimentEnabled = useExperimentValue( + Experiments.OnboardingRedesignRecoveryBackup, + OnboardingRedesignRecoveryBackupProperties.Enabled, + false, + ) const account = activeAccount || onboardingContextAccount @@ -66,7 +71,7 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS const [displayContinueButtonEnabled, setDisplayContinueButtonEnabled] = useState(!onboardingExperimentEnabled) // warning modal on seed phrase view - const [seedWarningAcknowledged, setSeedWarningAcknowledged] = useState(fromCloudBackup ?? false) + const [seedWarningAcknowledged, setSeedWarningAcknowledged] = useState(false) const onValidationSuccessful = (): void => { setConfirmContinueButtonPressed(true) @@ -83,10 +88,6 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS } } - const finishCloudBackup = (): void => { - navigate(MobileScreens.Home) - } - useEffect(() => { if (view !== View.SeedPhrase) { return @@ -125,13 +126,8 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS case View.SeedPhrase: return ( - @@ -173,7 +165,6 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS case View.SeedPhraseConfirm: return ( - - - setConfirmContinueButtonEnabled(true)} - /> - + + setConfirmContinueButtonEnabled(true)} + /> + + - + + + + + {t('common.button.later')} + + + + + + + ) } diff --git a/apps/mobile/src/screens/Onboarding/SecuritySetupScreen.tsx b/apps/mobile/src/screens/Onboarding/SecuritySetupScreen.tsx index a93872bb493..b264ec34eed 100644 --- a/apps/mobile/src/screens/Onboarding/SecuritySetupScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/SecuritySetupScreen.tsx @@ -16,14 +16,14 @@ import { import { setRequiredForTransactions } from 'src/features/biometrics/slice' import { OnboardingScreen } from 'src/features/onboarding/OnboardingScreen' import { useCompleteOnboardingCallback } from 'src/features/onboarding/hooks' -import { Button, Flex, useIsDarkMode, useSporeColors } from 'ui/src' +import { Button, Flex, Text, TouchableArea, useIsDarkMode, useSporeColors } from 'ui/src' import { SECURITY_SCREEN_BACKGROUND_DARK, SECURITY_SCREEN_BACKGROUND_LIGHT } from 'ui/src/assets' import FaceIcon from 'ui/src/assets/icons/faceid-thin.svg' import FingerprintIcon from 'ui/src/assets/icons/fingerprint.svg' -import { Lock } from 'ui/src/components/icons' import { borderRadii, imageSizes, opacify } from 'ui/src/theme' import Trace from 'uniswap/src/features/telemetry/Trace' import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { ImportType } from 'uniswap/src/types/onboarding' import { OnboardingScreens } from 'uniswap/src/types/screens/mobile' import { isIOS } from 'utilities/src/platform' @@ -52,7 +52,7 @@ export function SecuritySetupScreen({ route: { params } }: Props): JSX.Element { } }, [isLoadingAccount, onCompleteOnboarding]) - const onSkipPressed = useCallback(async () => { + const onMaybeLaterPressed = useCallback(async () => { if (params?.importType === ImportType.Watch) { await onPressNext() } else { @@ -107,7 +107,6 @@ export function SecuritySetupScreen({ route: { params } }: Props): JSX.Element { )} @@ -141,13 +139,22 @@ export function SecuritySetupScreen({ route: { params } }: Props): JSX.Element { )} - - - + + + + + {t('common.button.later')} + + + + + + + ) diff --git a/apps/mobile/src/screens/Onboarding/TermsOfService.tsx b/apps/mobile/src/screens/Onboarding/TermsOfService.tsx index 45c0c27b1b4..447d6f5eaa8 100644 --- a/apps/mobile/src/screens/Onboarding/TermsOfService.tsx +++ b/apps/mobile/src/screens/Onboarding/TermsOfService.tsx @@ -5,20 +5,20 @@ import { openUri } from 'uniswap/src/utils/linking' export function TermsOfService(): JSX.Element { return ( - + => openUri(uniswapUrls.termsOfServiceUrl)} /> ), highlightPrivacy: ( => openUri(uniswapUrls.privacyPolicyUrl)} /> ), diff --git a/apps/mobile/src/screens/Onboarding/WelcomeWalletScreen.tsx b/apps/mobile/src/screens/Onboarding/WelcomeWalletScreen.tsx index e3a63dcd786..6478597d4de 100644 --- a/apps/mobile/src/screens/Onboarding/WelcomeWalletScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/WelcomeWalletScreen.tsx @@ -5,14 +5,11 @@ import { useTranslation } from 'react-i18next' import { AppStackParamList, OnboardingStackParamList } from 'src/app/navigation/types' import { Screen } from 'src/components/layout/Screen' import { UnitagProfilePicture } from 'src/components/unitags/UnitagProfilePicture' -import { useNavigationHeader } from 'src/utils/useNavigationHeader' +import { useAddBackButton } from 'src/utils/useAddBackButton' import { Button, Flex, Loader, Text, useMedia, useSporeColors } from 'ui/src' import LockIcon from 'ui/src/assets/icons/lock.svg' import { fonts, iconSizes, opacify } from 'ui/src/theme' import { useENSAvatar } from 'uniswap/src/features/ens/api' -import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' -import { getExperimentValue } from 'uniswap/src/features/gating/hooks' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import Trace from 'uniswap/src/features/telemetry/Trace' import { ElementName } from 'uniswap/src/features/telemetry/constants' import { TestID } from 'uniswap/src/test/fixtures/testIDs' @@ -21,6 +18,7 @@ import { NumberType } from 'utilities/src/format/types' import { AccountIcon } from 'wallet/src/components/accounts/AccountIcon' import { DisplayNameText } from 'wallet/src/components/accounts/DisplayNameText' import { Arrow } from 'wallet/src/components/icons/Arrow' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { useCreateOnboardingAccountIfNone, useOnboardingContext, @@ -35,7 +33,7 @@ type Props = CompositeScreenProps< > export function WelcomeWalletScreen({ navigation, route: { params } }: Props): JSX.Element { - useNavigationHeader(navigation) + useAddBackButton(navigation) useCreateOnboardingAccountIfNone() const { getOnboardingAccountAddress, getUnitagClaim } = useOnboardingContext() @@ -51,14 +49,8 @@ export function WelcomeWalletScreen({ navigation, route: { params } }: Props): J const { data: avatar } = useENSAvatar(onboardingAccountAddress) const onPressNext = (): void => { - const onboardingExperimentEnabled = getExperimentValue( - Experiments.OnboardingRedesignRecoveryBackup, - OnboardingRedesignRecoveryBackupProperties.Enabled, - false, - ) - navigation.navigate({ - name: onboardingExperimentEnabled ? OnboardingScreens.Notifications : OnboardingScreens.Backup, + name: OnboardingScreens.Backup, merge: true, params, }) @@ -129,7 +121,7 @@ export function WelcomeWalletScreen({ navigation, route: { params } }: Props): J - + {t('onboarding.wallet.continue')} diff --git a/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap b/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap index 077ed7331a8..78ad4f7b1d5 100644 --- a/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap +++ b/apps/mobile/src/screens/Onboarding/__snapshots__/BackupScreen.test.tsx.snap @@ -58,7 +58,7 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` { "alignItems": "center", "flexDirection": "column", - "gap": 8, + "gap": 12, "justifyContent": "center", "marginBottom": 12, "marginLeft": 12, @@ -67,110 +67,22 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` } } > - - - - - - - - - - Choose your backup method + Choose a backup method - This is how you will recover your wallet if you delete the app or lose your device. + Backups let you restore your wallet if you delete the app or lose your device @@ -290,15 +201,19 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FEF4FF", + "backgroundColor": "#FC72FF1f", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 28, + "height": 24, "justifyContent": "center", - "width": 28, + "paddingBottom": 16, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 16, + "width": 24, } } > @@ -331,8 +246,8 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` ] } tintColor="#FC72FF" - vbHeight={16} - vbWidth={16} + vbHeight={24} + vbWidth={24} > @@ -397,64 +304,21 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` } } > - - - Set a recovery password - - - - - Quick - - + iCloud backup + - Back up your wallet via iCloud, protected by a recovery password. + Encrypt your recovery phrase with a secure password @@ -534,75 +397,27 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FEF4FF", + "backgroundColor": "#FC72FF1f", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 28, + "height": 24, "justifyContent": "center", - "width": 28, + "paddingBottom": 16, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 16, + "width": 24, } } > - - - - - + - - - Write down recovery phrase - - + Manual backup + - Record your 12 secret words on a piece of paper and store it in a safe place. + Write your recovery phrase down and store it in a safe location @@ -783,9 +587,8 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } @@ -860,7 +663,7 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` { "alignItems": "center", "flexDirection": "column", - "gap": 8, + "gap": 12, "justifyContent": "center", "marginBottom": 12, "marginLeft": 12, @@ -869,110 +672,22 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` } } > - - - - - - - - - - Choose your backup method + Choose a backup method - This is how you will recover your wallet if you delete the app or lose your device. + Backups let you restore your wallet if you delete the app or lose your device @@ -1092,15 +806,19 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FEF4FF", + "backgroundColor": "#FC72FF1f", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 28, + "height": 24, "justifyContent": "center", - "width": 28, + "paddingBottom": 16, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 16, + "width": 24, } } > @@ -1133,8 +851,8 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` ] } tintColor="#FC72FF" - vbHeight={16} - vbWidth={16} + vbHeight={24} + vbWidth={24} > @@ -1199,64 +909,21 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` } } > - - - Set a recovery password - - - - - Quick - - + iCloud backup + - Back up your wallet via iCloud, protected by a recovery password. + Encrypt your recovery phrase with a secure password @@ -1336,75 +1002,27 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FEF4FF", + "backgroundColor": "#FC72FF1f", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 28, + "height": 24, "justifyContent": "center", - "width": 28, + "paddingBottom": 16, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 16, + "width": 24, } } > - - - - - + - - - Write down recovery phrase - - + Manual backup + - Record your 12 secret words on a piece of paper and store it in a safe place. + Write your recovery phrase down and store it in a safe location @@ -1585,9 +1192,8 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel Grotesk", + "fontFamily": "Basel-Book", "fontSize": 17, - "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx b/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx index efeb6ff8c6a..54a96c801f4 100644 --- a/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx +++ b/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx @@ -19,8 +19,9 @@ import { setRequiredForAppAccess, setRequiredForTransactions, } from 'src/features/biometrics/slice' -import { Flex, Switch, Text, TouchableArea } from 'ui/src' +import { Flex, Text, TouchableArea } from 'ui/src' import { isAndroid, isIOS } from 'utilities/src/platform' +import { Switch } from 'wallet/src/components/buttons/Switch' import { openSettings } from 'wallet/src/utils/linking' interface BiometricAuthSetting { @@ -176,7 +177,7 @@ export function SettingsBiometricAuthScreen(): JSX.Element { onValueChange(!value) }} > - + diff --git a/apps/mobile/src/screens/SettingsCloudBackupStatus.tsx b/apps/mobile/src/screens/SettingsCloudBackupStatus.tsx index 62df13c673f..84edc626b49 100644 --- a/apps/mobile/src/screens/SettingsCloudBackupStatus.tsx +++ b/apps/mobile/src/screens/SettingsCloudBackupStatus.tsx @@ -105,7 +105,7 @@ export function SettingsCloudBackupStatus({ - + {t('settings.setting.backup.status.recoveryPhrase.backed')} @@ -113,7 +113,7 @@ export function SettingsCloudBackupStatus({ {googleDriveEmail && ( - + {googleDriveEmail} )} diff --git a/apps/mobile/src/screens/SettingsFiatCurrencyModal.tsx b/apps/mobile/src/screens/SettingsFiatCurrencyModal.tsx index 71640f90d40..00fbf9d8567 100644 --- a/apps/mobile/src/screens/SettingsFiatCurrencyModal.tsx +++ b/apps/mobile/src/screens/SettingsFiatCurrencyModal.tsx @@ -7,10 +7,10 @@ import { Flex, Text, TouchableArea, useSporeColors } from 'ui/src' import { Check } from 'ui/src/components/icons' import { Modal } from 'uniswap/src/components/modals/Modal' import { useBottomSheetFocusHook } from 'uniswap/src/components/modals/hooks' -import { FiatCurrency, ORDERED_CURRENCIES } from 'uniswap/src/features/fiatCurrency/constants' -import { useAppFiatCurrency, useFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { setCurrentFiatCurrency } from 'uniswap/src/features/settings/slice' import { ModalName } from 'uniswap/src/features/telemetry/constants' +import { FiatCurrency, ORDERED_CURRENCIES } from 'wallet/src/features/fiatCurrency/constants' +import { useAppFiatCurrency, useFiatCurrencyInfo } from 'wallet/src/features/fiatCurrency/hooks' +import { setCurrentFiatCurrency } from 'wallet/src/features/fiatCurrency/slice' export function SettingsFiatCurrencyModal(): JSX.Element { const dispatch = useDispatch() diff --git a/apps/mobile/src/screens/SettingsScreen.tsx b/apps/mobile/src/screens/SettingsScreen.tsx index 9d48354b87f..c0576c368b5 100644 --- a/apps/mobile/src/screens/SettingsScreen.tsx +++ b/apps/mobile/src/screens/SettingsScreen.tsx @@ -7,7 +7,6 @@ import { useDispatch, useSelector } from 'react-redux' import { OnboardingStackNavigationProp, SettingsStackNavigationProp } from 'src/app/navigation/types' import { FooterSettings } from 'src/components/Settings/FooterSettings' import { OnboardingRow } from 'src/components/Settings/OnboardingRow' -import { ResetBehaviorHistoryRow } from 'src/components/Settings/ResetBehaviorHistoryRow' import { SettingsRow, SettingsSection, @@ -41,8 +40,6 @@ import { } from 'ui/src/components/icons' import { iconSizes, spacing } from 'ui/src/theme' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' -import { useCurrentLanguageInfo } from 'uniswap/src/features/language/hooks' import { useHideSmallBalancesSetting, useHideSpamTokensSetting } from 'uniswap/src/features/settings/hooks' import { setHideSmallBalances, setHideSpamTokens } from 'uniswap/src/features/settings/slice' import { ModalName } from 'uniswap/src/features/telemetry/constants' @@ -53,13 +50,11 @@ import { isDevEnv } from 'utilities/src/environment' import { isAndroid } from 'utilities/src/platform' import { useCurrentAppearanceSetting } from 'wallet/src/features/appearance/hooks' import { selectHapticsEnabled, setHapticsUserSettingEnabled } from 'wallet/src/features/appearance/slice' +import { useAppFiatCurrencyInfo } from 'wallet/src/features/fiatCurrency/hooks' +import { useCurrentLanguageInfo } from 'wallet/src/features/language/hooks' import { BackupType } from 'wallet/src/features/wallet/accounts/types' import { useSignerAccounts } from 'wallet/src/features/wallet/hooks' -// avoids rendering during animation which makes it laggy -// set to a bit above the Switch animation "simple" which is 80ms -const AVOID_RENDER_DURING_ANIMATION_MS = 100 - export function SettingsScreen(): JSX.Element { const navigation = useNavigation() const dispatch = useDispatch() @@ -78,23 +73,17 @@ export function SettingsScreen(): JSX.Element { const hideSmallBalances = useHideSmallBalancesSetting() const onToggleHideSmallBalances = useCallback(() => { - setTimeout(() => { - dispatch(setHideSmallBalances(!hideSmallBalances)) - }, AVOID_RENDER_DURING_ANIMATION_MS) + dispatch(setHideSmallBalances(!hideSmallBalances)) }, [dispatch, hideSmallBalances]) const hideSpamTokens = useHideSpamTokensSetting() const onToggleHideSpamTokens = useCallback(() => { - setTimeout(() => { - dispatch(setHideSpamTokens(!hideSpamTokens)) - }, AVOID_RENDER_DURING_ANIMATION_MS) + dispatch(setHideSpamTokens(!hideSpamTokens)) }, [dispatch, hideSpamTokens]) const hapticsUserEnabled = useSelector(selectHapticsEnabled) const onToggleEnableHaptics = useCallback(() => { - setTimeout(() => { - dispatch(setHapticsUserSettingEnabled(!hapticsUserEnabled)) - }, AVOID_RENDER_DURING_ANIMATION_MS) + dispatch(setHapticsUserSettingEnabled(!hapticsUserEnabled)) }, [dispatch, hapticsUserEnabled]) // Signer account info @@ -233,7 +222,7 @@ export function SettingsScreen(): JSX.Element { { screen: MobileScreens.WebView, screenProps: { - uriLink: uniswapUrls.helpArticleUrls.walletHelp, + uriLink: uniswapUrls.helpUrl, headerTitle: t('settings.action.help'), }, text: t('settings.action.help'), @@ -274,7 +263,6 @@ export function SettingsScreen(): JSX.Element { icon: , }, { component: }, - { component: }, ], }, ] diff --git a/apps/mobile/src/screens/SettingsWallet.tsx b/apps/mobile/src/screens/SettingsWallet.tsx index 29a46459fb0..c0be1b1710e 100644 --- a/apps/mobile/src/screens/SettingsWallet.tsx +++ b/apps/mobile/src/screens/SettingsWallet.tsx @@ -26,7 +26,7 @@ import { useNotificationOSPermissionsEnabled, } from 'src/features/notifications/hooks/useNotificationOSPermissionsEnabled' import { showNotificationSettingsAlert } from 'src/screens/Onboarding/NotificationsSetupScreen' -import { Button, Flex, Switch, Text, useSporeColors } from 'ui/src' +import { Button, Flex, Text, useSporeColors } from 'ui/src' import NotificationIcon from 'ui/src/assets/icons/bell.svg' import GlobalIcon from 'ui/src/assets/icons/global.svg' import TextEditIcon from 'ui/src/assets/icons/textEdit.svg' @@ -40,6 +40,7 @@ import { TestID } from 'uniswap/src/test/fixtures/testIDs' import { UniverseChainId } from 'uniswap/src/types/chains' import { MobileScreens, UnitagScreens } from 'uniswap/src/types/screens/mobile' import { AddressDisplay } from 'wallet/src/components/accounts/AddressDisplay' +import { Switch } from 'wallet/src/components/buttons/Switch' import { EditAccountAction, editAccountActions } from 'wallet/src/features/wallet/accounts/editAccountSaga' import { useAccounts, useSelectAccountNotificationSetting } from 'wallet/src/features/wallet/hooks' @@ -137,10 +138,9 @@ export function SettingsWallet({ { action: ( ), text: t('settings.setting.wallet.notifications.title'), @@ -251,7 +251,7 @@ function AddressDisplayHeader({ address }: { address: Address }): JSX.Element { /> {(!ensName || !!unitag) && ( - +

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

+
+ +
+
+ +
+ + +
+ + + + + + +
+
+ + +`; + +exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable is true 1`] = ` + + .c7 { box-sizing: border-box; margin: 0; min-width: 0; + width: 100%; } -.c20 { +.c13 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c17 { box-sizing: border-box; margin: 0; min-width: 0; padding: 8px 0px; } -.c24 { +.c21 { box-sizing: border-box; margin: 0; min-width: 0; @@ -30,7 +656,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` margin-right: 18px; } -.c27 { +.c25 { box-sizing: border-box; margin: 0; min-width: 0; @@ -56,7 +682,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` justify-content: space-between; } -.c15 { +.c14 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -71,9 +697,10 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; + gap: 12px; } -.c18 { +.c16 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -91,7 +718,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` gap: 4px; } -.c19 { +.c18 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -106,10 +733,10 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; - gap: 12px; + padding: 8px 0px; } -.c21 { +.c22 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -124,10 +751,9 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; - padding: 8px 0px; } -.c28 { +.c26 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -158,7 +784,15 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` margin: !important; } -.c36 { +.c10 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c34 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -166,7 +800,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` letter-spacing: -0.01em; } -.c37 { +.c35 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -177,11 +811,11 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` font-weight: 500; } -.c37:hover { +.c35:hover { opacity: 0.6; } -.c37:active { +.c35:active { opacity: 0.4; } @@ -199,7 +833,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` justify-content: flex-start; } -.c10 { +.c11 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -214,7 +848,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` gap: 16px; } -.c11 { +.c12 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -229,7 +863,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` gap: 12px; } -.c26 { +.c24 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -247,7 +881,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` flex: 1; } -.c32 { +.c30 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -264,7 +898,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` align-items: center; } -.c31 { +.c29 { -webkit-align-items: center; -webkit-box-align: center; -ms-flex-align: center; @@ -292,7 +926,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` transition: 125ms; } -.c34 { +.c32 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -314,7 +948,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` padding: 0 8px; } -.c33 { +.c31 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -332,18 +966,18 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` justify-content: center; } -.c33 img { +.c31 img { border: 1px solid #22222212; border-radius: 12px; } -.c33 > img, -.c33 span { +.c31 > img, +.c31 span { height: 40px; width: 40px; } -.c30 { +.c28 { -webkit-align-items: stretch; -webkit-box-align: stretch; -ms-flex-align: stretch; @@ -364,46 +998,21 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` background-color: #F9F9F9; } -.c30:hover { +.c28:hover { cursor: pointer; background-color: #22222212; } -.c30:focus { +.c28:focus { background-color: #22222212; } -.c38 { +.c36 { font-weight: 535; color: #7D7D7D; } -.c12 { - max-height: 72px; - width: 100%; - background: #FFFFFF; - border-radius: 16px; - position: relative; -} - -.c13 { - background: url(/images/extension_promo/background_connector.png); - background-repeat: no-repeat; - background-size: cover; - opacity: 1; - max-height: 72px; - width: 100%; - height: 100%; - border-radius: 16px; - position: absolute; - top: 0; - left: 0; - z-index: 0; - -webkit-transition: opacity 125ms ease-in-out; - transition: opacity 125ms ease-in-out; -} - -.c16 { +.c15 { padding: 16px; gap: 12px; border-radius: 16px; @@ -419,19 +1028,10 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` z-index: 1; } -.c16:hover { +.c15:hover { background: #22222212; } -.c17 { - height: 40px; - width: 40px; - border-radius: 10px; - fill: linear-gradient(0deg,#fff1ff 0%,rgba(255,255,255,0) 100%),#fffbff; - -webkit-filter: drop-shadow(0px 1.179px 3.537px rgba(255,117,249,0.24)); - filter: drop-shadow(0px 1.179px 3.537px rgba(255,117,249,0.24)); -} - .c6 { display: -webkit-box; display: -webkit-flex; @@ -449,7 +1049,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` gap: 16px; } -.c29 { +.c27 { display: grid; -webkit-flex: 1; -ms-flex: 1; @@ -463,11 +1063,11 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` transition: max-height 125ms ease-in-out,opacity 125ms ease-in-out; } -.c35 { +.c33 { padding: 0 4px; } -.c22 { +.c19 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -479,21 +1079,21 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` user-select: none; } -.c22:hover { +.c19:hover { opacity: 0.6; } -.c22:active { +.c19:active { opacity: 0.4; } -.c23 { +.c20 { height: 1px; width: 100%; background: #22222212; } -.c25 { +.c23 { height: 20px; width: 20px; fill: #7D7D7D; @@ -640,7 +1240,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` } @media (max-width:960px) { - .c33 { + .c31 { -webkit-align-items: flex-end; -webkit-box-align: flex-end; -ms-flex-align: flex-end; @@ -649,7 +1249,7 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` } @media (max-width:960px) { - .c29 { + .c27 { grid-template-columns: 1fr; } } @@ -737,58 +1337,20 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` class="c7 c8 c9" width="100%" > - Connect a wallet - +
-
-
- uniswap-app-icon -
-
- - Get Uniswap Wallet - - - Available on iOS, Android, and Chrome - -
-
-
-
-
Uniswap Mobile @@ -828,13 +1390,13 @@ exports[`AccountDrawer tests AccountDrawer default styles 1`] = `
By connecting a wallet, you agree to Uniswap Labs’ and consent to its ({ useIsUniExtensionAvailable: jest.fn(), + useUniswapWalletOptions: jest.fn(), })) describe('AccountDrawer tests', () => { - it('AccountDrawer default styles', () => { + it('AccountDrawer styles when isUniExtensionAvailable is false', () => { + mocked(useUniswapWalletOptions).mockReturnValue(false) + mocked(useIsUniExtensionAvailable).mockReturnValue(false) + + const { asFragment } = render() + expect(asFragment()).toMatchSnapshot() + const drawerWrapper = screen.getByTestId('account-drawer') + expect(drawerWrapper).toBeInTheDocument() + expect(drawerWrapper).toHaveStyleRule('width', DRAWER_WIDTH) + }) + + it('AccountDrawer styles when isUniExtensionAvailable is true', () => { + mocked(useUniswapWalletOptions).mockReturnValue(true) mocked(useIsUniExtensionAvailable).mockReturnValue(true) const { asFragment } = render() diff --git a/apps/web/src/components/AccountDrawer/index.tsx b/apps/web/src/components/AccountDrawer/index.tsx index 66e0b81a436..eb167b2726e 100644 --- a/apps/web/src/components/AccountDrawer/index.tsx +++ b/apps/web/src/components/AccountDrawer/index.tsx @@ -20,7 +20,7 @@ import Trace from 'uniswap/src/features/telemetry/Trace' import { isMobileWeb } from 'utilities/src/platform' const DRAWER_WIDTH_XL = '390px' -const DRAWER_WIDTH = '320px' +export const DRAWER_WIDTH = '320px' const DRAWER_MARGIN = '8px' const DRAWER_OFFSET = '10px' diff --git a/apps/web/src/components/AddressQRModal/index.tsx b/apps/web/src/components/AddressQRModal/index.tsx index e349269fd29..04b45da9df4 100644 --- a/apps/web/src/components/AddressQRModal/index.tsx +++ b/apps/web/src/components/AddressQRModal/index.tsx @@ -1,5 +1,6 @@ import { AddressDisplay } from 'components/AccountDetails/AddressDisplay' import { SecondaryIdentifiers } from 'components/AccountDrawer/Status' +import { useAvatarColorProps } from 'components/AddressQRModal/useAvatarColorProps' import Identicon from 'components/Identicon' import { GetHelpHeader } from 'components/Modal/GetHelpHeader' import { PRODUCTION_CHAIN_IDS } from 'constants/chains' @@ -11,7 +12,6 @@ import { ApplicationModal } from 'state/application/reducer' import { ExternalLink, ThemedText } from 'theme/components' import { AdaptiveWebModal, Flex, QRCodeDisplay, Text, useSporeColors } from 'ui/src' import { NetworkLogos } from 'uniswap/src/components/network/NetworkLogos' -import { useAddressColorProps } from 'uniswap/src/features/address/color' import { useUnitagByAddress } from 'uniswap/src/features/unitags/hooks' import { Trans } from 'uniswap/src/i18n' @@ -31,7 +31,7 @@ export function AddressQRModal({ accountAddress }: { accountAddress: Address }) const { ENSName } = useENSName(accountAddress) const { unitag } = useUnitagByAddress(accountAddress) const hasSecondaryIdentifier = ENSName || unitag?.username - const addressColor = useAddressColorProps(accountAddress) + const { smartColor } = useAvatarColorProps(accountAddress) const goBack = useCallback(() => { toggleModal() @@ -58,8 +58,12 @@ export function AddressQRModal({ accountAddress }: { accountAddress: Address }) diff --git a/apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx b/apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx new file mode 100644 index 00000000000..9cf7c4b2381 --- /dev/null +++ b/apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx @@ -0,0 +1,82 @@ +import useENSAvatar from 'hooks/useENSAvatar' +import { useMemo } from 'react' +import { + GradientProps, + getUniconColors, + passesContrast, + useExtractedColors, + useIsDarkMode, + useSporeColors, +} from 'ui/src' +import { useUnitagByAddress } from 'uniswap/src/features/unitags/hooks' + +// Fetches avatar for address, in priority uses: unitag avatar, ens avatar, undefined +// Note that this hook is used instead of just useENSAvatar because our implementation +// of useENSAvatar checks for reverse name resolution which Unitags does not support. +// Chose to do this because even if we used useENSAvatar without reverse name resolution, +// there is more latency because it has to go to the contract via CCIP-read first. +function useAvatar(address: string | undefined): { + avatar: Maybe + loading: boolean +} { + const { unitag, loading: unitagLoading } = useUnitagByAddress(address) + const { avatar: ensAvatar, loading: ensLoading } = useENSAvatar(address) + const unitagAvatar = unitag?.metadata?.avatar + + if (!address) { + return { loading: false, avatar: undefined } + } + + if (unitagAvatar) { + return { avatar: unitagAvatar, loading: false } + } + + if (ensAvatar) { + return { avatar: ensAvatar, loading: false } + } + + return { avatar: undefined, loading: ensLoading || unitagLoading } +} + +type AvatarColors = { + primary: string + base: string + detail: string +} + +type ColorProps = { + smartColor: string + gradientProps: GradientProps +} + +export const useAvatarColorProps = (address: Address): ColorProps => { + const colors = useSporeColors() + const isDarkMode = useIsDarkMode() + const { color: uniconColor } = getUniconColors(address, isDarkMode) as { color: string } + const { avatar, loading: avatarLoading } = useAvatar(address) + const { colors: avatarColors } = useExtractedColors(avatar) as { colors: AvatarColors } + const hasAvatar = !!avatar && !avatarLoading + + const smartColor: string = useMemo(() => { + const contrastThreshold = 3 // WCAG AA standard for contrast + const backgroundColor = colors.surface2.val // replace with your actual background color + + if (hasAvatar && avatarColors && avatarColors.primary) { + if (passesContrast(avatarColors.primary, backgroundColor, contrastThreshold)) { + return avatarColors.primary + } + if (passesContrast(avatarColors.base, backgroundColor, contrastThreshold)) { + return avatarColors.base + } + if (passesContrast(avatarColors.detail, backgroundColor, contrastThreshold)) { + return avatarColors.detail + } + // Modify the color if it doesn't pass the contrast check + // Replace 'modifiedColor' with the actual color you want to use + return colors.neutral1.val as string + } + return uniconColor + }, [avatarColors, hasAvatar, uniconColor, colors.surface2.val, colors.neutral1.val]) + + return { smartColor, gradientProps: {} } +} diff --git a/apps/web/src/components/Charts/ChartHeader.tsx b/apps/web/src/components/Charts/ChartHeader.tsx index c4d4eb5e022..138877d5c65 100644 --- a/apps/web/src/components/Charts/ChartHeader.tsx +++ b/apps/web/src/components/Charts/ChartHeader.tsx @@ -1,91 +1,76 @@ import { useHeaderDateFormatter } from 'components/Charts/hooks' -import { PROTOCOL_LEGEND_ELEMENT_ID } from 'components/Charts/types' +import Column from 'components/Column' +import Row from 'components/Row' import { getProtocolColor, getProtocolName } from 'graphql/data/util' -import { useTheme } from 'lib/styled-components' +import styled, { useTheme } from 'lib/styled-components' import { UTCTimestamp } from 'lightweight-charts' import { ReactElement, ReactNode } from 'react' -import { EllipsisTamaguiStyle } from 'theme/components' +import { EllipsisStyle } from 'theme/components' import { ThemedText } from 'theme/components/text' -import { Flex, Text, styled } from 'ui/src' +import { textFadeIn } from 'theme/styles' import { PriceSource } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { NumberType, useFormatter } from 'utils/formatNumbers' export type ChartHeaderProtocolInfo = { protocol: PriceSource; value?: number } -const ProtocolLegendWrapper = styled(Flex, { - position: 'absolute', - right: 0, - py: '$spacing4', - px: '$spacing12', - gap: '$gap12', - pointerEvents: 'none', - variants: { - isMultichainExploreEnabled: { - true: { - right: 'unset', - p: '$spacing8', - gap: '$gap6', - borderRadius: '$rounded12', - border: '1px solid', - borderColor: '$surface3', - backgroundColor: '$surface2', - boxShadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.02), 0px 1px 6px 2px rgba(0, 0, 0, 0.03)', - zIndex: '$tooltip', - }, - }, - }, -}) +const ChartHeaderWrapper = styled(Row)` + ${textFadeIn}; + position: absolute; + width: 100%; + gap: 8px; + align-items: flex-start; +` +const ChartHeaderLeftDisplay = styled.div` + position: absolute; + display: flex; + flex-direction: column; + gap: 4px; + padding-bottom: 14px; + text-align: left; + pointer-events: none; + width: 70%; + + * { + ${EllipsisStyle} + } +` +const ProtocolLegendWrapper = styled(Column)` + position: absolute; + right: 0px; + padding: 4px 12px; + gap: 12px; + text-align: left; + pointer-events: none; +` +const ProtocolBlip = styled.div<{ color: string }>` + background-color: ${({ color }) => color}; + border-radius: 4px; + width: 12px; + height: 12px; +` + +const ProtocolText = styled(ThemedText.Caption)` + width: 80px; + text-align: right; + ${EllipsisStyle} +` function ProtocolLegend({ protocolData }: { protocolData?: ChartHeaderProtocolInfo[] }) { const { formatFiatPrice } = useFormatter() const theme = useTheme() - const isMultichainExploreEnabled = useFeatureFlag(FeatureFlags.MultichainExplore) return ( - + {protocolData ?.map(({ value, protocol }) => { const display = value ? formatFiatPrice({ price: value, type: NumberType.ChartFiatValue }) - : isMultichainExploreEnabled - ? null - : getProtocolName(protocol) + : getProtocolName(protocol) return ( - !!display && ( - - {isMultichainExploreEnabled ? ( - - {getProtocolName(protocol)} - - ) : ( - - {display} - - )} - - {isMultichainExploreEnabled && ( - - {display} - - )} - - ) + + {display} + + ) }) .reverse()} @@ -108,9 +93,7 @@ function HeaderValueDisplay({ value, valueFormatterType = NumberType.ChartFiatVa } return ( - - {formatFiatPrice({ price: value, type: valueFormatterType })} - + {formatFiatPrice({ price: value, type: valueFormatterType })} ) } @@ -140,18 +123,16 @@ export function ChartHeader({ protocolData, additionalFields, }: ChartHeaderProps) { - const isHovered = !!time - const isMultichainExploreEnabled = useFeatureFlag(FeatureFlags.MultichainExplore) return ( - - + + - + {additionalFields} - - - {((isHovered && protocolData) || !isMultichainExploreEnabled) && } - + + + + ) } diff --git a/apps/web/src/components/Charts/ChartModel.tsx b/apps/web/src/components/Charts/ChartModel.tsx index 33665a5220d..accb5407539 100644 --- a/apps/web/src/components/Charts/ChartModel.tsx +++ b/apps/web/src/components/Charts/ChartModel.tsx @@ -1,12 +1,13 @@ import { refitChartContentAtom } from 'components/Charts/TimeSelector' -import { PROTOCOL_LEGEND_ELEMENT_ID, SeriesDataItemType } from 'components/Charts/types' +import { SeriesDataItemType } from 'components/Charts/types' import { formatTickMarks } from 'components/Charts/utils' +import Row from 'components/Row' import { MissingDataBars } from 'components/Table/icons' import { useScreenSize } from 'hooks/screenSize' import { useActiveLocale } from 'hooks/useActiveLocale' import { useOnClickOutside } from 'hooks/useOnClickOutside' import { useUpdateAtom } from 'jotai/utils' -import { DefaultTheme, useTheme } from 'lib/styled-components' +import styled, { DefaultTheme, useTheme } from 'lib/styled-components' import { BarPrice, CrosshairMode, @@ -20,7 +21,8 @@ import { } from 'lightweight-charts' import { ReactElement, useEffect, useMemo, useRef, useState } from 'react' import { ThemedText } from 'theme/components' -import { Flex, TamaguiElement, assertWebElement, styled } from 'ui/src' +import { textFadeIn } from 'theme/styles' +import { Z_INDEX } from 'theme/zIndex' import { Trans } from 'uniswap/src/i18n' import { useFormatter } from 'utils/formatNumbers' import { v4 as uuidv4 } from 'uuid' @@ -132,7 +134,6 @@ export abstract class ChartModel { const transformY = `calc(${yPx}px${yPct})` const tooltip = document.getElementById(this.tooltipId) - const legend = document.getElementById(PROTOCOL_LEGEND_ELEMENT_ID) if (tooltip) { tooltip.style.transform = `translate(${transformX}, ${transformY})` @@ -140,28 +141,6 @@ export abstract class ChartModel { const tooltipMeasurement = tooltip.getBoundingClientRect() this._lastTooltipWidth = tooltipMeasurement?.width || null } - if (legend) { - // keep legend centered on mouse cursor if hovered - legend.style.left = `${x}px` - const heroWidth = 230 - // adjust height of tooltip if hovering below the hero text - if (x < heroWidth) { - legend.style.top = '80px' - } else { - legend.style.top = 'unset' - } - const transformOffset = 60 - const maxXOffset = this.api.paneSize().width - 40 - // keeps the legend centered on mouse x axis without getting cut off by chart edges - if (x < transformOffset) { - // Additional 4px of padding is added to prevent box-shadow from being cutoff - legend.style.transform = `translateX(-${x - 4}%)` - } else if (x > maxXOffset) { - legend.style.transform = `translateX(-${transformOffset + (x - maxXOffset)}%)` - } else { - legend.style.transform = `translateX(-${transformOffset}%)` - } - } } /** Updates the chart without re-creating it or resetting pan/zoom. */ @@ -240,6 +219,13 @@ export abstract class ChartModel { const isBetween = (num: number, lower: number, upper: number) => num > lower && num < upper +const ChartDiv = styled.div<{ height?: number }>` + ${({ height }) => height && `height: ${height}px`}; + width: 100%; + position: relative; + ${textFadeIn}; +` + /** Returns a div injected with a lightweight-chart, corresponding to the given Model and params */ export function Chart, TDataType extends SeriesDataItemType>({ Model, @@ -259,7 +245,7 @@ export function Chart, TDataType e const setRefitChartContent = useUpdateAtom(refitChartContentAtom) // Lightweight-charts injects a canvas into the page through the div referenced below // It is stored in state to cause a re-render upon div mount, avoiding delay in chart creation - const [chartDivElement, setChartDivElement] = useState(null) + const [chartDivElement, setChartDivElement] = useState(null) const [crosshairData, setCrosshairData] = useState(undefined) const format = useFormatter() const theme = useTheme() @@ -276,7 +262,6 @@ export function Chart, TDataType e // Creates the chart as soon as the chart div ref is defined useEffect(() => { if (chartDivElement && chartModelRef.current === undefined) { - assertWebElement(chartDivElement) chartModelRef.current = new Model(chartDivElement, modelParams) // Providers the time period selector with a handle to refit the chart setRefitChartContent(() => () => chartModelRef.current?.fitContent()) @@ -302,10 +287,7 @@ export function Chart, TDataType e useOnClickOutside({ current: chartDivElement } as React.RefObject, () => setCrosshairData(undefined)) return ( - , TDataType e )} {params.stale && } - + ) } -const ChartTooltip = styled(Flex, { - alignItems: 'center', - position: 'absolute', - left: 0, - top: 0, - zIndex: '$tooltip', - backgroundColor: '$surface5', - backdropFilter: 'blur(8px)', - borderRadius: '$rounded8', - borderColor: '$surface3', - borderStyle: 'solid', - borderWidth: 1, - p: '$spacing8', -}) - -const StaleBannerWrapper = styled(ChartTooltip, { - borderRadius: '$rounded16', - left: 'unset', - top: 'unset', - right: '$spacing12', - bottom: '$spacing40', - p: '$spacing12', - backgroundColor: '$surface4', -}) +const ChartTooltip = styled.div` + display: flex; + flex-direction: column; + align-items: center; + position: absolute; + left: 0%; + top: 0; + z-index: ${Z_INDEX.tooltip}; + background: ${({ theme }) => theme.surface5}; + backdrop-filter: ${({ theme }) => theme.blur.light}; + border-radius: 8px; + border: 1px solid ${({ theme }) => theme.surface3}; + padding: 8px; +` + +const StaleBannerWrapper = styled(ChartTooltip)` + border-radius: 16px; + left: unset; + top: unset; + right: 12px; + bottom: 40px; + padding: 12px; + background: ${({ theme }) => theme.surface4}; +` function StaleBanner() { const theme = useTheme() // TODO(WEB-3739): Update Chart UI to grayscale when data is stale return ( - + - + ) } diff --git a/apps/web/src/components/Charts/PriceChart/index.tsx b/apps/web/src/components/Charts/PriceChart/index.tsx index deb9d6067c8..586270f94bf 100644 --- a/apps/web/src/components/Charts/PriceChart/index.tsx +++ b/apps/web/src/components/Charts/PriceChart/index.tsx @@ -6,7 +6,9 @@ import { } from 'components/Charts/PriceChart/RoundedCandlestickSeries/rounded-candles-series' import { getCandlestickPriceBounds } from 'components/Charts/PriceChart/utils' import { PriceChartType } from 'components/Charts/utils' +import { RowBetween } from 'components/Row' import { DeltaArrow, DeltaText, calculateDelta } from 'components/Tokens/TokenDetails/Delta' +import styled from 'lib/styled-components' import { AreaData, AreaSeriesPartialOptions, @@ -20,8 +22,8 @@ import { UTCTimestamp, } from 'lightweight-charts' import { useMemo } from 'react' +import { ThemedText } from 'theme/components' import { opacify } from 'theme/utils' -import { Flex, Text, styled } from 'ui/src' import { Trans } from 'uniswap/src/i18n' import { NumberType, useFormatter } from 'utils/formatNumbers' @@ -192,6 +194,14 @@ export class PriceChartModel extends ChartModel { } } +const DeltaContainer = styled.div` + font-size: 16px; + line-height: 24px; + display: flex; + align-items: center; + gap: 4px; +` + interface PriceChartDeltaProps { startingPrice: PriceChartData endingPrice: PriceChartData @@ -203,10 +213,10 @@ export function PriceChartDelta({ startingPrice, endingPrice, noColor }: PriceCh const { formatDelta } = useFormatter() return ( - + {formatDelta(delta)} - + ) } @@ -217,34 +227,33 @@ interface PriceChartProps { stale: boolean } -const CandlestickTooltipRow = styled(Flex, { - row: true, - justifyContent: 'space-between', - gap: '$sm', -}) +const TooltipText = styled(ThemedText.LabelSmall)` + color: ${({ theme }) => theme.neutral1}; + line-height: 20px; +` function CandlestickTooltip({ data }: { data: PriceChartData }) { const { formatFiatPrice } = useFormatter() return ( <> - - + +
{formatFiatPrice({ price: data.open })}
-
- + +
{formatFiatPrice({ price: data.high })}
-
- + +
{formatFiatPrice({ price: data.low })}
-
- + +
{formatFiatPrice({ price: data.close })}
-
-
+ + ) } diff --git a/apps/web/src/components/Charts/SparklineChart/index.tsx b/apps/web/src/components/Charts/SparklineChart/index.tsx index b12f22e4c54..58f8e927806 100644 --- a/apps/web/src/components/Charts/SparklineChart/index.tsx +++ b/apps/web/src/components/Charts/SparklineChart/index.tsx @@ -1,16 +1,11 @@ import { getPriceBounds } from 'components/Charts/PriceChart/utils' import LineChart from 'components/Charts/SparklineChart/LineChart' import { LoadingBubble } from 'components/Tokens/loading' -import { getChainFromChainUrlParam } from 'constants/chains' -import { NATIVE_CHAIN_ID } from 'constants/tokens' import { curveCardinal, scaleLinear } from 'd3' import { SparklineMap, TopToken } from 'graphql/data/TopTokens' import { PricePoint } from 'graphql/data/util' import styled, { useTheme } from 'lib/styled-components' import { memo } from 'react' -import { TokenStat } from 'state/explore/types' -import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' -import { addressesAreEquivalent } from 'utils/addressesAreEquivalent' const LoadingContainer = styled.div` height: 100%; @@ -30,7 +25,7 @@ const SparkLineLoadingBubble = styled(LongLoadingBubble)` interface SparklineChartProps { width: number height: number - tokenData: TopToken | TokenStat + tokenData: TopToken pricePercentChange?: number | null sparklineMap: SparklineMap } @@ -38,12 +33,7 @@ interface SparklineChartProps { function _SparklineChart({ width, height, tokenData, pricePercentChange, sparklineMap }: SparklineChartProps) { const theme = useTheme() // for sparkline - const chainId = getChainFromChainUrlParam(tokenData?.chain.toLowerCase())?.id - const chainInfo = chainId && UNIVERSE_CHAIN_INFO[chainId] - const isNative = addressesAreEquivalent(tokenData?.address, chainInfo?.wrappedNativeCurrency.address) - const pricePoints = tokenData?.address - ? sparklineMap[isNative ? NATIVE_CHAIN_ID : tokenData.address.toLowerCase()] - : null + const pricePoints = tokenData?.address ? sparklineMap[tokenData.address] : null // Don't display if there's one or less pricepoints if (!pricePoints || pricePoints.length <= 1) { diff --git a/apps/web/src/components/Charts/StackedLineChart/index.tsx b/apps/web/src/components/Charts/StackedLineChart/index.tsx index e33a17ea6a5..904826ec0c6 100644 --- a/apps/web/src/components/Charts/StackedLineChart/index.tsx +++ b/apps/web/src/components/Charts/StackedLineChart/index.tsx @@ -22,7 +22,6 @@ export interface StackedLineData extends WhitespaceData { interface TVLChartParams extends ChartModelParams { colors: string[] - gradients?: { start: string; end: string }[] } export class TVLChartModel extends ChartModel { @@ -75,7 +74,7 @@ export class TVLChartModel extends ChartModel { }, ...gridSettings, }) - const { data, colors, gradients } = params + const { data, colors } = params // Handles changes in data, e.g. time period selection if (this.data !== data) { @@ -88,7 +87,6 @@ export class TVLChartModel extends ChartModel { priceLineVisible: false, lastValueVisible: false, colors, - gradients, lineWidth: 2.5, } as DeepPartial) } diff --git a/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/options.ts b/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/options.ts index 7a8396316ae..c1f163059bb 100644 --- a/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/options.ts +++ b/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/options.ts @@ -8,7 +8,6 @@ import { customSeriesDefaultOptions, CustomSeriesOptions, Logical } from 'lightw export interface StackedAreaSeriesOptions extends CustomSeriesOptions { colors: readonly string[] lineWidth: number - gradients?: { start: string; end: string }[] // Modification: tracks the hovered data point, used for rendering crosshair hoveredLogicalIndex?: Logical } @@ -16,6 +15,5 @@ export interface StackedAreaSeriesOptions extends CustomSeriesOptions { export const defaultOptions: StackedAreaSeriesOptions = { ...customSeriesDefaultOptions, colors: [], - gradients: undefined, lineWidth: 2, } as const diff --git a/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/renderer.ts b/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/renderer.ts index beca9f26631..fdd7418c415 100644 --- a/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/renderer.ts +++ b/apps/web/src/components/Charts/StackedLineChart/stacked-area-series/renderer.ts @@ -80,47 +80,35 @@ export class StackedAreaSeriesRenderer implements options.hoveredLogicalIndex, ) - const fullLinesMeshed = linesMeshed.slice(0, 3) - const highlightLinesMeshed = options.hoveredLogicalIndex ? linesMeshed.slice(3) : [] - - const areaPaths = this._createAreas(fullLinesMeshed) + const areaPaths = this._createAreas(linesMeshed) const colorsCount = options.colors.length - const isHovered = options.hoveredLogicalIndex && options.hoveredLogicalIndex !== -1 - const isMultichainExploreEnabled = !!options.gradients areaPaths.forEach((areaPath, index) => { // Modification: determine area fill opacity based on number of lines and hover state - if (areaPaths.length === 1) { ctx.globalAlpha = 0.12 // single-line charts have low opacity fill - } else if (!isMultichainExploreEnabled) { - ctx.globalAlpha = isHovered ? 0.24 : 1 + } else { + const hasHoveredIndex = options.hoveredLogicalIndex !== undefined && options.hoveredLogicalIndex !== -1 + ctx.globalAlpha = hasHoveredIndex ? 0.24 : 1 // multi-line charts have lower opacity on hover, otherwise full opacity } - const gradient = options.gradients - ? ctx.createLinearGradient(0, 0, renderingScope.mediaSize.width * 2.25, 0) - : undefined - gradient?.addColorStop(0, options.gradients?.[index % colorsCount].start ?? 'transparent') - // End the gradient at the x-coordinate of the crosshair relative to chart width or the end of the chart - const gradientStop = Math.max(hoverInfo.x ? hoverInfo.x / renderingScope.bitmapSize.width : 1, 0) - gradient?.addColorStop(gradientStop, options.gradients?.[index % colorsCount].end ?? 'transparent') - - ctx.fillStyle = gradient ?? options.colors[index % colorsCount] + ctx.fillStyle = options.colors[index % colorsCount] ctx.fill(areaPath) }) - ctx.lineWidth = options.lineWidth * (isMultichainExploreEnabled ? 1 : renderingScope.verticalPixelRatio) + ctx.globalAlpha = 1 + + ctx.lineWidth = options.lineWidth * renderingScope.verticalPixelRatio ctx.lineJoin = 'round' - fullLinesMeshed.toReversed().forEach((linePath, index) => { - const unreversedIndex = fullLinesMeshed.length - index + linesMeshed.toReversed().forEach((linePath, index) => { + const unreversedIndex = linesMeshed.length - index const color = options.colors[unreversedIndex % colorsCount] ctx.strokeStyle = color ctx.fillStyle = color - ctx.globalAlpha = isHovered && isMultichainExploreEnabled ? 0.24 : 1 // Bottom line is just the x-axis, which should not be drawn - if (index !== fullLinesMeshed.length - 1) { + if (index !== linesMeshed.length - 1) { // Line rendering: ctx.beginPath() ctx.strokeStyle = color @@ -129,8 +117,6 @@ export class StackedAreaSeriesRenderer implements // Modification: Draws a glyph where lines intersect with the crosshair const hoverY = hoverInfo.points[index - 1] - // Reset the global alpha to 1 after filling in the area under the graph and before drawing the glyph - ctx.globalAlpha = 1 // Glyph rendering: ctx.globalCompositeOperation = 'destination-out' // This mode allows removing a portion of the drawn line from the canvas @@ -157,26 +143,6 @@ export class StackedAreaSeriesRenderer implements ctx.globalAlpha = 1 }) - - highlightLinesMeshed.toReversed().forEach((linePath, index) => { - if (!linePath) { - ctx.globalAlpha = 1 - return - } - const unreversedIndex = fullLinesMeshed.length - index - const color = options.colors[unreversedIndex % colorsCount] - ctx.strokeStyle = color - ctx.fillStyle = color - ctx.globalAlpha = 1 - - // Bottom line is just the x-axis, which should not be drawn - if (index !== fullLinesMeshed.length - 1) { - // Line rendering: - ctx.beginPath() - ctx.strokeStyle = color - ctx.stroke(linePath.path) - } - }) } /** Builds canvas line paths based on input data */ @@ -190,8 +156,6 @@ export class StackedAreaSeriesRenderer implements const { horizontalPixelRatio, verticalPixelRatio } = renderingScope const oddLines: LinePathData[] = [] const evenLines: LinePathData[] = [] - const oddHighlightLines: LinePathData[] = [] - const evenHighlightLines: LinePathData[] = [] let firstBar = true // Modification: tracks and returns coordinates of where a glyph should be rendered for each line when a crosshair is drawn @@ -230,18 +194,6 @@ export class StackedAreaSeriesRenderer implements oddLines[lineIndex].last.x = x oddLines[lineIndex].last.y = y } - if (firstBar && hoveredIndex && i <= hoveredIndex) { - oddHighlightLines[lineIndex] = { - path: new Path2D(), - first: { x, y }, - last: { x, y }, - } - oddHighlightLines[lineIndex].path.moveTo(x, y) - } else if (hoveredIndex && i <= hoveredIndex) { - oddHighlightLines[lineIndex].path.lineTo(x, y) - oddHighlightLines[lineIndex].last.x = x - oddHighlightLines[lineIndex].last.y = y - } lineIndex += 1 }) firstBar = false @@ -279,20 +231,6 @@ export class StackedAreaSeriesRenderer implements evenLines[lineIndex].last.x = x evenLines[lineIndex].last.y = y } - - if (evenHighlightLines.length <= lineIndex && hoveredIndex && i <= hoveredIndex) { - evenHighlightLines[lineIndex] = { - path: new Path2D(), - first: { x, y }, - last: { x, y }, - } - evenHighlightLines[lineIndex].path.moveTo(x, y) - } else if (hoveredIndex && i <= hoveredIndex) { - evenHighlightLines[lineIndex].path.lineTo(x, y) - evenHighlightLines[lineIndex].last.x = x - evenHighlightLines[lineIndex].last.y = y - } - lineIndex += 1 }) firstBar = false @@ -311,10 +249,6 @@ export class StackedAreaSeriesRenderer implements if (i < evenLines.length) { linesMeshed.push(evenLines[i]) } - if (hoveredIndex) { - linesMeshed.push(oddHighlightLines[i]) - linesMeshed.push(evenHighlightLines[i]) - } } return { linesMeshed, hoverInfo } diff --git a/apps/web/src/components/Charts/TimeSelector.tsx b/apps/web/src/components/Charts/TimeSelector.tsx index 0acc2f65d19..4563ec74b7e 100644 --- a/apps/web/src/components/Charts/TimeSelector.tsx +++ b/apps/web/src/components/Charts/TimeSelector.tsx @@ -1,56 +1,54 @@ import { DISPLAYS, ORDERED_TIMES } from 'components/Tokens/TokenTable/TimeSelector' +import { MEDIUM_MEDIA_BREAKPOINT } from 'components/Tokens/constants' import { TimePeriod } from 'graphql/data/util' import { atom } from 'jotai' import { useAtomValue } from 'jotai/utils' -import { Flex, Text, styled } from 'ui/src' +import styled from 'lib/styled-components' export const refitChartContentAtom = atom<(() => void) | undefined>(undefined) const DEFAULT_TIME_SELECTOR_OPTIONS = ORDERED_TIMES.map((time: TimePeriod) => ({ time, display: DISPLAYS[time] })) -const TimeOptionsContainer = styled(Flex, { - justifyContent: 'flex-end', - gap: '$gap4', - borderRadius: '$rounded16', - height: 24, - px: '$spacing4', - width: 'fit-content', - overflow: 'visible', - $md: { - width: '100%', - justifyContent: 'space-between', - borderWidth: 0, - }, -}) +const TimeOptionsWrapper = styled.div` + display: flex; + width: 100%; + justify-content: flex-end; +` -const TimeButton = styled(Flex, { - flexGrow: 1, - flexShrink: 1, - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - height: 24, - width: 24, - borderRadius: '$roundedFull', - cursor: 'pointer', - animation: 'fast', - borderWidth: 0, - variants: { - active: { - true: { - backgroundColor: '$surface3', - hoverStyle: { - opacity: 1, - }, - }, - false: { - backgroundColor: 'transparent', - hoverStyle: { - opacity: 0.6, - }, - }, - }, - } as const, -}) +const TimeOptionsContainer = styled.div` + display: flex; + justify-content: flex-end; + margin-top: 4px; + gap: 4px; + border-radius: 16px; + height: 40px; + padding: 4px; + width: fit-content; + + @media only screen and (max-width: ${MEDIUM_MEDIA_BREAKPOINT}) { + width: 100%; + justify-content: space-between; + border: none; + } +` +const TimeButton = styled.button<{ active: boolean }>` + flex: 1; + display: flex; + align-items: center; + justify-content: center; + background-color: ${({ theme, active }) => (active ? theme.surface3 : 'transparent')}; + font-weight: 535; + font-size: 14px; + padding: 6px 12px; + border-radius: 12px; + line-height: 16px; + border: none; + cursor: pointer; + color: ${({ theme, active }) => (active ? theme.neutral1 : theme.neutral2)}; + transition-duration: ${({ theme }) => theme.transition.duration.fast}; + :hover { + ${({ active, theme }) => !active && `opacity: ${theme.opacity.hover};`} + } +` interface TimePeriodSelectorOption { time: TimePeriod // Value to be selected/stored, used as default display value @@ -71,29 +69,24 @@ export default function TimePeriodSelector({ const refitChartContent = useAtomValue(refitChartContentAtom) return ( - - {options.map(({ time, display }) => ( - { - if (timePeriod === time) { - refitChartContent?.() - } else { - onChangeTimePeriod(time) - } - }} - > - + + {options.map(({ time, display }) => ( + { + if (timePeriod === time) { + refitChartContent?.() + } else { + onChangeTimePeriod(time) + } + }} > {display} - - - ))} - + + ))} + + ) } diff --git a/apps/web/src/components/Charts/VolumeChart/CrosshairHighlightPrimitive.tsx b/apps/web/src/components/Charts/VolumeChart/CrosshairHighlightPrimitive.tsx index a4ec685b139..bdac192755e 100644 --- a/apps/web/src/components/Charts/VolumeChart/CrosshairHighlightPrimitive.tsx +++ b/apps/web/src/components/Charts/VolumeChart/CrosshairHighlightPrimitive.tsx @@ -54,7 +54,6 @@ interface CrosshairHighlightData { interface HighlightBarCrosshairOptions { color: string crosshairYPosition: number - useThinCrosshair?: boolean } class CrosshairHighlightPaneRenderer implements ISeriesPrimitivePaneRenderer { @@ -82,25 +81,16 @@ class CrosshairHighlightPaneRenderer implements ISeriesPrimitivePaneRenderer { ) * 0.035 const crosshairXPosition = crosshairPos.position + margin - // Modification: use centered 2px wide line to top + // Modification: use rounded rectangle ctx.beginPath() - if (this._data.useThinCrosshair) { - ctx.fillRect( - crosshairXPosition + crosshairPos.length / 2, - crosshairYPosition, - 2, - scope.bitmapSize.height - crosshairYPosition, - ) - } else { - ctx.roundRect( - crosshairXPosition, - crosshairYPosition, - crosshairPos.length, - scope.bitmapSize.height - crosshairYPosition, - 9, - ) - ctx.fill() - } + ctx.roundRect( + crosshairXPosition, + crosshairYPosition, + crosshairPos.length, + scope.bitmapSize.height - crosshairYPosition, + 9, + ) + ctx.fill() // Modification: lower opacity of all content outside the highlight bar ctx.globalCompositeOperation = 'destination-out' diff --git a/apps/web/src/components/Charts/VolumeChart/CustomVolumeChartModel.tsx b/apps/web/src/components/Charts/VolumeChart/CustomVolumeChartModel.tsx index 91f1a36e15f..561d6b32bd0 100644 --- a/apps/web/src/components/Charts/VolumeChart/CustomVolumeChartModel.tsx +++ b/apps/web/src/components/Charts/VolumeChart/CustomVolumeChartModel.tsx @@ -1,16 +1,13 @@ import { ChartModel, ChartModelParams } from 'components/Charts/ChartModel' import { CrosshairHighlightPrimitive } from 'components/Charts/VolumeChart/CrosshairHighlightPrimitive' import { CustomHistogramSeries } from 'components/Charts/VolumeChart/custom-histogram-series' -import { CustomHistogramData, CustomHistogramSeriesOptions } from 'components/Charts/VolumeChart/renderer' -import { BarPrice, DeepPartial, ISeriesApi, Logical } from 'lightweight-charts' +import { CustomHistogramData } from 'components/Charts/VolumeChart/renderer' +import { BarPrice, ISeriesApi } from 'lightweight-charts' import { NumberType } from 'utils/formatNumbers' export type CustomVolumeChartModelParams = { colors: string[] headerHeight: number - useThinCrosshair?: boolean - isMultichainExploreEnabled?: boolean - background?: string } // Custom volume chart model, uses stacked volume chart as base model @@ -18,18 +15,11 @@ export type CustomVolumeChartModelParams = { export class CustomVolumeChartModel extends ChartModel { protected series: ISeriesApi<'Custom'> private highlightBarPrimitive: CrosshairHighlightPrimitive - private hoveredLogicalIndex: Logical | null | undefined constructor(chartDiv: HTMLDivElement, params: ChartModelParams & CustomVolumeChartModelParams) { super(chartDiv, params) - this.series = this.api.addCustomSeries( - new CustomHistogramSeries({ - colors: params.colors, - isMultichainExploreEnabled: params.isMultichainExploreEnabled, - background: params.background, - }), - ) + this.series = this.api.addCustomSeries(new CustomHistogramSeries({ colors: params.colors })) this.series.setData(this.data) @@ -37,21 +27,11 @@ export class CustomVolumeChartModel exten this.highlightBarPrimitive = new CrosshairHighlightPrimitive({ color: params.theme.surface3, crosshairYPosition: params.headerHeight, - useThinCrosshair: params.useThinCrosshair, }) this.series.attachPrimitive(this.highlightBarPrimitive) this.updateOptions(params) this.fitContent() - - this.api.subscribeCrosshairMove((param) => { - if (param?.logical !== this.hoveredLogicalIndex) { - this.hoveredLogicalIndex = param?.logical - this.series.applyOptions({ - hoveredLogicalIndex: this.hoveredLogicalIndex ?? (-1 as Logical), // -1 is used because series will use prev value if undefined is passed - } as DeepPartial) - } - }) } updateOptions(params: ChartModelParams & CustomVolumeChartModelParams, options?: any) { diff --git a/apps/web/src/components/Charts/VolumeChart/custom-histogram-series.tsx b/apps/web/src/components/Charts/VolumeChart/custom-histogram-series.tsx index 53e04c96173..d5f9fb500d8 100644 --- a/apps/web/src/components/Charts/VolumeChart/custom-histogram-series.tsx +++ b/apps/web/src/components/Charts/VolumeChart/custom-histogram-series.tsx @@ -23,14 +23,10 @@ export class CustomHistogramSeries { _renderer: CustomHistogramSeriesRenderer _colors: string[] - _isMultichainExploreEnabled?: boolean - _background?: string constructor(props: CustomHistogramProps) { this._renderer = new CustomHistogramSeriesRenderer(props) this._colors = props.colors - this._isMultichainExploreEnabled = props.isMultichainExploreEnabled - this._background = props.background } priceValueBuilder(plotRow: TData): CustomSeriesPricePlotValues { diff --git a/apps/web/src/components/Charts/VolumeChart/renderer.tsx b/apps/web/src/components/Charts/VolumeChart/renderer.tsx index bb62501ca98..8338c073133 100644 --- a/apps/web/src/components/Charts/VolumeChart/renderer.tsx +++ b/apps/web/src/components/Charts/VolumeChart/renderer.tsx @@ -13,7 +13,6 @@ import { CustomData, CustomSeriesOptions, ICustomSeriesPaneRenderer, - Logical, PaneRendererCustomData, PriceToCoordinateConverter, Time, @@ -42,7 +41,6 @@ interface BarItem { export interface CustomHistogramSeriesOptions extends CustomSeriesOptions { colors: string[] - hoveredLogicalIndex?: Logical } function cumulativeBuildUp(data: StackedHistogramData): number[] { @@ -56,27 +54,19 @@ function cumulativeBuildUp(data: StackedHistogramData): number[] { export interface CustomHistogramProps { colors: string[] - isMultichainExploreEnabled?: boolean - background?: string } export class CustomHistogramSeriesRenderer implements ICustomSeriesPaneRenderer { _data: PaneRendererCustomData | null = null _options: CustomHistogramSeriesOptions | null = null _colors: string[] - _isMultichainExploreEnabled?: boolean - _background?: string constructor(props: CustomHistogramProps) { this._colors = props.colors - this._isMultichainExploreEnabled = props.isMultichainExploreEnabled - this._background = props.background } draw(target: CanvasRenderingTarget2D, priceConverter: PriceToCoordinateConverter): void { - target.useBitmapCoordinateSpace((scope) => - this._drawImpl(scope, priceConverter, this._options?.hoveredLogicalIndex), - ) + target.useBitmapCoordinateSpace((scope) => this._drawImpl(scope, priceConverter)) } update(data: PaneRendererCustomData, options: CustomHistogramSeriesOptions): void { @@ -84,11 +74,7 @@ export class CustomHistogramSeriesRenderer im this._options = options } - _drawImpl( - renderingScope: BitmapCoordinatesRenderingScope, - priceToCoordinate: PriceToCoordinateConverter, - hoveredIndex?: number | null, - ): void { + _drawImpl(renderingScope: BitmapCoordinatesRenderingScope, priceToCoordinate: PriceToCoordinateConverter): void { if ( this._data === null || this._data.bars.length === 0 || @@ -134,36 +120,16 @@ export class CustomHistogramSeriesRenderer im // Modification: draw rounded rect corresponding to total volume const totalBox = positionsBox(zeroY, stack.ys[stack.ys.length - 1], renderingScope.verticalPixelRatio) ctx.beginPath() - - const isMultichainExploreEnabled = this._isMultichainExploreEnabled - if (this._background) { - ctx.fillStyle = this._background - } - - ctx.roundRect( - column.left + margin, - totalBox.position, - width - margin, - totalBox.length, - isMultichainExploreEnabled ? 4 : 8, - ) + ctx.roundRect(column.left + margin, totalBox.position, width - margin, totalBox.length, 8) ctx.fill() // Modification: draw the stack's boxes atop the total volume bar, resulting in the top and bottom boxes being rounded ctx.globalCompositeOperation = 'source-atop' - const isStackedHistogram = stack.ys.length > 1 stack.ys.forEach((y, index) => { const color = this._colors[this._colors.length - 1 - index] // color v2, then v3 const stackBoxPositions = positionsBox(previousY, y, renderingScope.verticalPixelRatio) ctx.fillStyle = color - const isHovered = i === hoveredIndex - ctx.globalAlpha = isStackedHistogram && !isHovered && isMultichainExploreEnabled ? 0.24 : 1 ctx.fillRect(column.left + margin, stackBoxPositions.position, width - margin, stackBoxPositions.length) - if (isStackedHistogram && isMultichainExploreEnabled && !isHovered) { - ctx.globalAlpha = 1 - ctx.fillStyle = color - ctx.fillRect(column.left + margin, stackBoxPositions.position, width - margin, 2) - } previousY = y }) diff --git a/apps/web/src/components/Charts/types.ts b/apps/web/src/components/Charts/types.ts index 6a463df48ca..3d22348ccd2 100644 --- a/apps/web/src/components/Charts/types.ts +++ b/apps/web/src/components/Charts/types.ts @@ -1,5 +1,3 @@ import { SeriesDataItemTypeMap, SeriesOptionsMap, Time } from 'lightweight-charts' export type SeriesDataItemType = SeriesDataItemTypeMap
diff --git a/apps/web/src/components/NavBar/CompanyMenu/Content.tsx b/apps/web/src/components/NavBar/CompanyMenu/Content.tsx index c3cc398c5a8..081416f0c62 100644 --- a/apps/web/src/components/NavBar/CompanyMenu/Content.tsx +++ b/apps/web/src/components/NavBar/CompanyMenu/Content.tsx @@ -28,7 +28,6 @@ export const useMenuContent = (): MenuSection[] => { { title: t('common.protocol'), items: [ - { label: t('common.vote'), href: 'https://vote.uniswapfoundation.org' }, { label: t('common.governance'), href: 'https://uniswap.org/governance' }, { label: t('common.developers'), href: 'https://uniswap.org/developers' }, ], diff --git a/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.test.tsx b/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.test.tsx similarity index 68% rename from apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.test.tsx rename to apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.test.tsx index f0e2365e81d..63ad1c4f8ac 100644 --- a/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.test.tsx +++ b/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.test.tsx @@ -7,11 +7,11 @@ beforeEach(() => { })) }) -import { NewUserCTAButton } from 'components/NavBar/DownloadApp/NewUserCTAButton' +import { GetTheAppButton } from 'components/NavBar/DownloadApp/GetTheAppButton' -describe('NewUserCTAButton', () => { +describe('GetTheAppButton', () => { it('displays a button with call to action text and icons', () => { - const { container } = render() + const { container } = render() expect(container).toMatchSnapshot() expect(screen.getByText('Get the app')).toBeVisible() diff --git a/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.tsx b/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.tsx new file mode 100644 index 00000000000..e6a3184f892 --- /dev/null +++ b/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.tsx @@ -0,0 +1,35 @@ +import { useOpenModal } from 'state/application/hooks' +import { ApplicationModal } from 'state/application/reducer' +import { Button, Flex, Text, styled } from 'ui/src' +import { Trans } from 'uniswap/src/i18n' + +const StyledButton = styled(Button, { + height: '40px', + backgroundColor: '$surface1', + borderRadius: '$rounded20', + borderWidth: '$spacing1', + borderStyle: 'solid', + borderColor: '$surface3', + cursor: 'pointer', + alignItems: 'center', + hoverStyle: { + backgroundColor: '$surface2', + }, + pressStyle: { + backgroundColor: '$surface2', + }, +}) + +export function GetTheAppButton() { + const openModal = useOpenModal(ApplicationModal.GET_THE_APP) + + return ( + + + + + + + + ) +} diff --git a/apps/web/src/components/NavBar/DownloadApp/Modal/Content.tsx b/apps/web/src/components/NavBar/DownloadApp/Modal/Content.tsx index ab813cd421e..67690c76023 100644 --- a/apps/web/src/components/NavBar/DownloadApp/Modal/Content.tsx +++ b/apps/web/src/components/NavBar/DownloadApp/Modal/Content.tsx @@ -1,22 +1,12 @@ -import { useIsAccountCTAExperimentControl } from 'components/NavBar' -import { useScreenSize } from 'hooks/screenSize' -import { PropsWithChildren, ReactNode } from 'react' +import { PropsWithChildren } from 'react' import { ThemedText } from 'theme/components' -import { Flex, Image, Text } from 'ui/src' +import { Flex, Image } from 'ui/src' import { UNISWAP_LOGO } from 'ui/src/assets' import { iconSizes } from 'ui/src/theme' -export function ModalContent({ - title, - subtext, - rightThumbnail, - children, -}: PropsWithChildren<{ title: string; subtext: string; rightThumbnail?: ReactNode }>) { - const isAccountCTAExperimentControl = useIsAccountCTAExperimentControl() - const showRightThumbnail = useScreenSize()['lg'] - - return isAccountCTAExperimentControl ? ( - +export function ModalContent({ title, subtext, children }: PropsWithChildren<{ title: string; subtext: string }>) { + return ( + @@ -28,23 +18,5 @@ export function ModalContent({ {children} - ) : ( - - - - - - - {title} - - - {subtext} - - - {children} - - - {rightThumbnail && showRightThumbnail && {rightThumbnail}} - ) } diff --git a/apps/web/src/components/NavBar/DownloadApp/Modal/GetStarted.tsx b/apps/web/src/components/NavBar/DownloadApp/Modal/GetStarted.tsx index ece9754c2e9..4b945afdfc4 100644 --- a/apps/web/src/components/NavBar/DownloadApp/Modal/GetStarted.tsx +++ b/apps/web/src/components/NavBar/DownloadApp/Modal/GetStarted.tsx @@ -2,22 +2,17 @@ import { InterfaceElementName } from '@uniswap/analytics-events' import ExtensionIllustration from 'assets/images/extensionIllustration.png' import WalletIllustration from 'assets/images/walletIllustration.png' import Column from 'components/Column' -import { AndroidLogo } from 'components/Icons/AndroidLogo' import { AppleLogo } from 'components/Icons/AppleLogo' import { GoogleChromeLogo } from 'components/Icons/GoogleChromeLogo' -import { AccountCTAsExperimentGroup } from 'components/NavBar' +import { GooglePlayStoreLogo } from 'components/Icons/GooglePlayStoreLogo' import { ModalContent } from 'components/NavBar/DownloadApp/Modal/Content' import styled, { useTheme } from 'lib/styled-components' import { Wiggle } from 'pages/Landing/components/animations' import { PropsWithChildren } from 'react' -import { StyledInternalLink } from 'theme/components' -import { Button, Flex, Text, styled as tamaguiStyled } from 'ui/src' +import { Flex, Text } from 'ui/src' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks' import Trace from 'uniswap/src/features/telemetry/Trace' -import { ElementName } from 'uniswap/src/features/telemetry/constants' -import { Trans, useTranslation } from 'uniswap/src/i18n' +import { useTranslation } from 'uniswap/src/i18n' const WiggleIcon = styled(Wiggle)` flex: 0; @@ -46,37 +41,14 @@ const Card = styled(Column)` } } ` - -const SmallCard = tamaguiStyled(Button, { - width: '100%', - height: 72, - backgroundColor: '$surface3', - borderRadius: '$spacing16', - borderWidth: 0, - hoverStyle: { - backgroundColor: '$surface3', - opacity: 0.9, - }, - pressStyle: { - backgroundColor: '$surface3', - opacity: 0.7, - }, -}) - -const PromoImage = styled.img` - display: flex; - width: 320px; - height: 100%; - background: url('/images/extension_promo/announcement_modal_desktop2.png'); - background-repeat: no-repeat; - background-size: cover; - flex: 1; +const RightContent = styled.div` + margin-top: 4px; ` function CardInfo({ title, details, children }: PropsWithChildren<{ title: string; details: string }>) { return ( - - + + {title} @@ -84,78 +56,16 @@ function CardInfo({ title, details, children }: PropsWithChildren<{ title: strin {details} - {children} + {children} ) } -export function GetStarted({ - toAppDownload, - toConnectWalletDrawer, -}: { - toAppDownload: () => void - toConnectWalletDrawer: () => void -}) { +export function GetStarted({ toAppDownload }: { toAppDownload: () => void }) { const theme = useTheme() const { t } = useTranslation() - - const isSignUp = useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.SignInSignUp - const isCreateAccount = - useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.LogInCreateAccount - - return isSignUp || isCreateAccount ? ( - } - > - - - - - - - - - - - - - - - - window.open(uniswapUrls.chromeExtension)}> - - - - - - - - - - - - - - {t('downloadApp.modal.alreadyHaveWallet.signInLink')} - - - ), - }} - /> - - - - ) : ( - + return ( + @@ -167,7 +77,7 @@ export function GetStarted({ - + diff --git a/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx b/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx index 96ac83f7335..effa676d7ee 100644 --- a/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx +++ b/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx @@ -1,51 +1,37 @@ import { InterfaceModalName } from '@uniswap/analytics-events' -import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import Modal from 'components/Modal' -import { useIsAccountCTAExperimentControl } from 'components/NavBar' import { GetStarted } from 'components/NavBar/DownloadApp/Modal/GetStarted' import { GetTheApp } from 'components/NavBar/DownloadApp/Modal/GetTheApp' -import styled from 'lib/styled-components' +import styled, { css } from 'lib/styled-components' import { useCallback, useState } from 'react' import { ArrowLeft, X } from 'react-feather' import { useCloseModal, useModalIsOpen } from 'state/application/hooks' import { ApplicationModal } from 'state/application/reducer' -import { ClickableTamaguiStyle } from 'theme/components' -import { AnimateTransition, Flex, styled as tamaguiStyled } from 'ui/src' -import { iconSizes, zIndices } from 'ui/src/theme' +import { ClickableStyle } from 'theme/components' +import { AnimateTransition, Flex } from 'ui/src' +import { iconSizes } from 'ui/src/theme' import Trace from 'uniswap/src/features/telemetry/Trace' const StyledModal = styled(Modal)` display: block; ` - -const HeaderActionIcon = { - margin: 4, - color: '$neutral1', - ...ClickableTamaguiStyle, -} - -const CloseButton = tamaguiStyled(X, { - ...HeaderActionIcon, - size: iconSizes.icon24, - - variants: { - filled: { - true: { - color: 'white', - borderRadius: '100%', - backgroundColor: '$scrim', - padding: '$spacing4', - margin: '$none', - size: iconSizes.icon32, - }, - false: {}, - }, - }, -}) - -const BackButton = tamaguiStyled(ArrowLeft, { - ...HeaderActionIcon, -}) +const Wrapper = styled.div` + position: relative; + padding: 24px; + width: 100%; + user-select: none; +` +const HeaderActionIcon = css` + margin: 4px; + color: ${({ theme }) => theme.neutral1}; + ${ClickableStyle}; +` +const CloseButton = styled(X)` + ${HeaderActionIcon} +` +const BackButton = styled(ArrowLeft)` + ${HeaderActionIcon} +` enum Page { GetStarted = 'GetStarted', @@ -61,57 +47,23 @@ export function GetTheAppModal() { setTimeout(() => setPage(Page.GetStarted), 500) }, [closeModal, setPage]) const showBackButton = page !== Page.GetStarted - const accountDrawer = useAccountDrawer() - - const isAccountCTAExperimentControl = useIsAccountCTAExperimentControl() return ( - - - {showBackButton && setPage(Page.GetStarted)} size={iconSizes.icon24} />} - - - + + + + {showBackButton && setPage(Page.GetStarted)} size={iconSizes.icon24} />} + + - setPage(Page.GetApp)} - toConnectWalletDrawer={() => { - close() - accountDrawer.open() - }} - /> + setPage(Page.GetApp)} /> - + ) diff --git a/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx b/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx deleted file mode 100644 index 7bcb0b1457f..00000000000 --- a/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { AccountCTAsExperimentGroup, useIsAccountCTAExperimentControl } from 'components/NavBar' -import { useOpenModal } from 'state/application/hooks' -import { ApplicationModal } from 'state/application/reducer' -import { Button, Text, styled } from 'ui/src' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks' -import { useTranslation } from 'uniswap/src/i18n' - -const StyledButton = styled(Button, { - height: '40px', - borderRadius: '$rounded20', - borderWidth: '$spacing1', - borderStyle: 'solid', - alignItems: 'center', - - variants: { - isSignInExperimentControl: { - true: { - backgroundColor: '$surface1', - borderColor: '$surface3', - hoverStyle: { - backgroundColor: '$surface2', - }, - pressStyle: { - backgroundColor: '$surface2', - }, - }, - false: { - backgroundColor: '$accent1', - }, - }, - }, -}) - -export function NewUserCTAButton() { - const { t } = useTranslation() - - const openModal = useOpenModal(ApplicationModal.GET_THE_APP) - - const isSignInExperimentControl = useIsAccountCTAExperimentControl() - const isSignUp = useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.SignInSignUp - const isCreateAccount = - useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.LogInCreateAccount - - return ( - - - {isSignUp ? t('nav.signUp.button') : isCreateAccount ? t('nav.createAccount.button') : t('common.getTheApp')} - - - ) -} diff --git a/apps/web/src/components/NavBar/DownloadApp/__snapshots__/GetTheAppButton.test.tsx.snap b/apps/web/src/components/NavBar/DownloadApp/__snapshots__/GetTheAppButton.test.tsx.snap new file mode 100644 index 00000000000..c793ce325ac --- /dev/null +++ b/apps/web/src/components/NavBar/DownloadApp/__snapshots__/GetTheAppButton.test.tsx.snap @@ -0,0 +1,38 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GetTheAppButton displays a button with call to action text and icons 1`] = ` +
+ + + + + + + + + +
+`; diff --git a/apps/web/src/components/NavBar/DownloadApp/__snapshots__/NewUserCTAButton.test.tsx.snap b/apps/web/src/components/NavBar/DownloadApp/__snapshots__/NewUserCTAButton.test.tsx.snap deleted file mode 100644 index 80ad736b6b6..00000000000 --- a/apps/web/src/components/NavBar/DownloadApp/__snapshots__/NewUserCTAButton.test.tsx.snap +++ /dev/null @@ -1,34 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`NewUserCTAButton displays a button with call to action text and icons 1`] = ` -
- - - - - - - - - -
-`; diff --git a/apps/web/src/components/NavBar/MobileBottomBar/MobileBottomBar.tsx b/apps/web/src/components/NavBar/MobileBottomBar/MobileBottomBar.tsx index f4a01ea23b8..06682f0c602 100644 --- a/apps/web/src/components/NavBar/MobileBottomBar/MobileBottomBar.tsx +++ b/apps/web/src/components/NavBar/MobileBottomBar/MobileBottomBar.tsx @@ -1,35 +1,26 @@ +import { NAV_BREAKPOINT } from 'components/NavBar/ScreenSizes' +import styled from 'lib/styled-components' import { Z_INDEX } from 'theme/zIndex' -import { Flex, styled } from 'ui/src' const MOBILE_BAR_MAX_HEIGHT = 100 // ensure that it's translated out of view on scroll -export const MobileBottomBar = styled(Flex, { - zIndex: Z_INDEX.dropdown, - position: 'fixed' as any, - bottom: 0, - right: 0, - left: 0, - justifyContent: 'space-between', - gap: '$gap8', - width: '100%', - maxHeight: MOBILE_BAR_MAX_HEIGHT, - backdropFilter: 'blur(4px)', - mask: 'linear-gradient(to bottom, transparent, $surface1 15%)', - py: '$padding12', - px: '$padding16', - animation: 'lazy', - display: 'none', - $xl: { - display: 'block', - }, - variants: { - hide: { - true: { - bottom: `-${MOBILE_BAR_MAX_HEIGHT}px !important`, - }, - false: { - bottom: 0, - }, - }, - } as const, -}) +export const MobileBottomBar = styled.div<{ $hide: boolean }>` + z-index: ${Z_INDEX.dropdown}; + position: fixed; + display: flex; + bottom: 0; + right: 0; + left: 0; + justify-content: space-between; + gap: 8px; + width: 100%; + max-height: ${MOBILE_BAR_MAX_HEIGHT}px; + backdrop-filter: blur(4px); + mask: linear-gradient(to bottom, transparent, ${({ theme }) => theme.surface1} 15%); + padding: 12px 16px; + transition: bottom ${({ theme }) => theme.transition.duration.slow}; + ${({ $hide }) => $hide && `bottom: -${MOBILE_BAR_MAX_HEIGHT}px !important`}; + @media screen and (min-width: ${NAV_BREAKPOINT.showMobileBar}px) { + display: none; + } +` diff --git a/apps/web/src/components/NavBar/PreferencesMenu/Preferences.tsx b/apps/web/src/components/NavBar/PreferencesMenu/Preferences.tsx index 30780385fbb..9da6ba2eb74 100644 --- a/apps/web/src/components/NavBar/PreferencesMenu/Preferences.tsx +++ b/apps/web/src/components/NavBar/PreferencesMenu/Preferences.tsx @@ -38,7 +38,7 @@ function SelectButton({ label, onClick }: { label: string; onClick?: () => void const theme = useTheme() return ( - + {label} diff --git a/apps/web/src/components/NavBar/SearchBar/RecentlySearchedAssets.ts b/apps/web/src/components/NavBar/SearchBar/RecentlySearchedAssets.ts index 08179c095fa..7a73bd8bfbe 100644 --- a/apps/web/src/components/NavBar/SearchBar/RecentlySearchedAssets.ts +++ b/apps/web/src/components/NavBar/SearchBar/RecentlySearchedAssets.ts @@ -1,49 +1,122 @@ -import { chainIdToBackendChain } from 'constants/chains' import { NATIVE_CHAIN_ID, nativeOnChain } from 'constants/tokens' -import { GqlSearchToken } from 'graphql/data/SearchTokens' +import { SearchToken, TokenSearchResultWeb } from 'graphql/data/SearchTokens' +import { supportedChainIdFromGQLChain } from 'graphql/data/util' +import { useAtom } from 'jotai' +import { atomWithStorage, useAtomValue } from 'jotai/utils' import { GenieCollection } from 'nft/types' -import { useMemo } from 'react' -import { useSelector } from 'react-redux' -import { MAX_RECENT_SEARCH_RESULTS } from 'uniswap/src/components/TokenSelector/hooks' +import { useCallback, useMemo } from 'react' +import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { Chain, NftCollection, useRecentlySearchedAssetsQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { - SearchResult, - isNFTCollectionSearchResult, - isTokenSearchResult, -} from 'uniswap/src/features/search/SearchResult' -import { selectSearchHistory } from 'uniswap/src/features/search/selectSearchHistory' -import { isNativeCurrencyAddress } from 'uniswap/src/utils/currencyId' +import { toGraphQLChain } from 'uniswap/src/features/chains/utils' +import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' +import { SearchResultType } from 'uniswap/src/features/search/SearchResult' +import { UniverseChainId } from 'uniswap/src/types/chains' import { logger } from 'utilities/src/logger/logger' +import { getNativeTokenDBAddress } from 'utils/nativeTokens' + +// Temporary measure used until backend supports addressing by "NATIVE" +const NATIVE_QUERY_ADDRESS_INPUT = null as unknown as string +function getQueryAddress(chain: Chain) { + return getNativeTokenDBAddress(chain) ?? NATIVE_QUERY_ADDRESS_INPUT +} +function getNativeQueryAddress(chain: Chain) { + return `NATIVE-${chain}` +} + +export const recentlySearchedAssetsAtom = atomWithStorage('recentlySearchedAssetsV3', []) + +// Used by TokenSelector +export function useAddRecentlySearchedCurrency() { + const [searchHistory, updateSearchHistory] = useAtom(recentlySearchedAssetsAtom) + + return useCallback( + (currencyInfo: CurrencyInfo) => { + // Removes the new currency if it was already in the array + const newHistory = searchHistory.filter((oldCurrency) => { + // Don't filter out NFTs of the same chainId when adding a native token to the search history + if (oldCurrency.isNft) { + return true + } + // Filter out tokens of the same address and chainId + if (currencyInfo.currency.isToken) { + return !( + oldCurrency.address === currencyInfo.currency.address && + oldCurrency.chainId === currencyInfo.currency.chainId + ) + // Filter out native tokens of the same chainId + } else { + return oldCurrency.chainId !== currencyInfo.currency.chainId + } + }) + newHistory.unshift({ + type: SearchResultType.Token, + chain: toGraphQLChain(currencyInfo.currency.chainId) ?? Chain.Ethereum, + chainId: currencyInfo.currency.chainId, + address: currencyInfo.currency.isToken + ? currencyInfo.currency.address + : UNIVERSE_CHAIN_INFO[currencyInfo.currency.chainId as UniverseChainId].nativeCurrency.address, + name: currencyInfo.currency.name ?? null, + symbol: currencyInfo.currency.symbol ?? '', + logoUrl: currencyInfo.logoUrl ?? null, + safetyLevel: currencyInfo.safetyLevel ?? null, + isToken: currencyInfo.currency.isToken, + isNative: currencyInfo.currency.isNative, + }) + updateSearchHistory(newHistory) + }, + [searchHistory, updateSearchHistory], + ) +} -export type InterfaceRemoteSearchHistoryItem = GqlSearchToken | GenieCollection +// Used by NavBar +export function useAddRecentlySearchedAsset() { + const [searchHistory, updateSearchHistory] = useAtom(recentlySearchedAssetsAtom) -export function useRecentlySearchedAssets(): { data?: InterfaceRemoteSearchHistoryItem[]; loading: boolean } { - const history = useSelector(selectSearchHistory) - const shortenedHistory = useMemo(() => history.slice(0, MAX_RECENT_SEARCH_RESULTS), [history]) + return useCallback( + (asset: TokenSearchResultWeb) => { + // Removes the new asset if it was already in the array + const address = asset.isNative ? UNIVERSE_CHAIN_INFO[asset.chainId].nativeCurrency.address : asset.address + const newHistory = searchHistory.filter( + (oldAsset) => !(oldAsset.address === address && oldAsset.chain === asset.chain), + ) + newHistory.unshift({ + ...asset, + address, + }) + updateSearchHistory(newHistory) + }, + [searchHistory, updateSearchHistory], + ) +} + +export function useRecentlySearchedAssets() { + const history = useAtomValue(recentlySearchedAssetsAtom) + const shortenedHistory = useMemo(() => history.slice(0, 4), [history]) const { data: queryData, loading } = useRecentlySearchedAssetsQuery({ variables: { - collectionAddresses: shortenedHistory.filter(isNFTCollectionSearchResult).map((asset) => asset.address), - contracts: shortenedHistory.filter(isTokenSearchResult).map((token) => ({ - address: token.address ?? undefined, - chain: chainIdToBackendChain({ chainId: token.chainId }), - })), + collectionAddresses: shortenedHistory.filter((asset) => asset.isNft).map((asset) => asset.address), + contracts: shortenedHistory + .filter((asset) => !asset.isNft) + .map((token) => ({ + address: token.isNative ? getQueryAddress(token.chain) : token.address, + chain: token.chain, + })), }, - skip: shortenedHistory.length === 0, }) - const data = useMemo((): InterfaceRemoteSearchHistoryItem[] | undefined => { + const data = useMemo(() => { if (shortenedHistory.length === 0) { return [] } else if (!queryData) { return undefined } // Collects both tokens and collections in a map, so they can later be returned in original order - const resultsMap: { [key: string]: InterfaceRemoteSearchHistoryItem } = {} + const resultsMap: { [key: string]: GenieCollection | SearchToken } = {} const queryCollections = queryData?.nftCollections?.edges.map((edge) => edge.node as NonNullable) const collections = queryCollections?.map( @@ -68,11 +141,32 @@ export function useRecentlySearchedAssets(): { data?: InterfaceRemoteSearchHisto } }) - const data: InterfaceRemoteSearchHistoryItem[] = [] - shortenedHistory.forEach((asset: SearchResult) => { - const result = generateInterfaceHistoryItem(asset, resultsMap) - if (result) { - data.push(result) + const data: (SearchToken | GenieCollection)[] = [] + shortenedHistory.forEach((asset) => { + if (asset.isNative) { + // Handles special case where wMATIC data needs to be used for MATIC + const chain = supportedChainIdFromGQLChain(asset.chain) + if (!chain) { + logger.error(new Error('Invalid chain retrieved from Search Token/Collection Query'), { + tags: { + file: 'RecentlySearchedAssets', + function: 'useRecentlySearchedAssets', + }, + extra: { asset }, + }) + return + } + const native = nativeOnChain(chain) + const queryAddress = getQueryAddress(asset.chain)?.toLowerCase() ?? getNativeQueryAddress(asset.chain) + const result = resultsMap[queryAddress] + if (result) { + data.push({ ...result, address: NATIVE_CHAIN_ID, ...native }) + } + } else { + const result = resultsMap[asset.address] + if (result) { + data.push(result) + } } }) return data @@ -80,46 +174,3 @@ export function useRecentlySearchedAssets(): { data?: InterfaceRemoteSearchHisto return { data, loading } } - -function generateInterfaceHistoryItem( - asset: SearchResult, - resultsMap: Record, -): InterfaceRemoteSearchHistoryItem | undefined { - if (isNFTCollectionSearchResult(asset)) { - return resultsMap[asset.address] - } - - if (!isTokenSearchResult(asset)) { - return undefined - } - - if (!isNativeCurrencyAddress(asset.chainId, asset.address) && asset.address) { - return resultsMap[asset.address] - } - - // Handle native assets - if (isNativeCurrencyAddress(asset.chainId, asset.address)) { - // Handles special case where wMATIC data needs to be used for MATIC - const chain = chainIdToBackendChain({ chainId: asset.chainId }) - if (!chain) { - logger.error(new Error('Invalid chain retrieved from Search Token/Collection Query'), { - tags: { - file: 'RecentlySearchedAssets', - function: 'useRecentlySearchedAssets', - }, - extra: { asset }, - }) - return undefined - } - const native = nativeOnChain(asset.chainId) - const queryAddress = asset.address ?? getNativeQueryAddress(chain) - const result = resultsMap[queryAddress] - return { ...result, address: NATIVE_CHAIN_ID, ...native } - } - - return undefined -} - -function getNativeQueryAddress(chain: Chain) { - return `NATIVE-${chain}` -} diff --git a/apps/web/src/components/NavBar/SearchBar/SearchBarDropdown.tsx b/apps/web/src/components/NavBar/SearchBar/SearchBarDropdown.tsx index d05fb6039ec..4fda1e9e2df 100644 --- a/apps/web/src/components/NavBar/SearchBar/SearchBarDropdown.tsx +++ b/apps/web/src/components/NavBar/SearchBar/SearchBarDropdown.tsx @@ -3,16 +3,13 @@ import Badge from 'components/Badge' import Column from 'components/Column' import { ScrollBarStyles } from 'components/Common' import { ChainLogo } from 'components/Logo/ChainLogo' -import { - InterfaceRemoteSearchHistoryItem, - useRecentlySearchedAssets, -} from 'components/NavBar/SearchBar/RecentlySearchedAssets' +import { useRecentlySearchedAssets } from 'components/NavBar/SearchBar/RecentlySearchedAssets' import { SkeletonRow, SuggestionRow } from 'components/NavBar/SearchBar/SuggestionRow' import Row from 'components/Row' import { SuspendConditionally } from 'components/Suspense/SuspendConditionally' import { SuspenseWithPreviousRenderAsFallback } from 'components/Suspense/SuspenseWithPreviousRenderAsFallback' import { BACKEND_NOT_YET_SUPPORTED_CHAIN_IDS } from 'constants/chains' -import { GqlSearchToken } from 'graphql/data/SearchTokens' +import { SearchToken } from 'graphql/data/SearchTokens' import useTrendingTokens from 'graphql/data/TrendingTokens' import { useTrendingCollections } from 'graphql/data/nft/TrendingCollections' import { useAccount } from 'hooks/useAccount' @@ -26,11 +23,7 @@ import { useLocation } from 'react-router-dom' import { ThemedText } from 'theme/components' import { Flex } from 'ui/src' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' -import { - HistoryDuration, - SafetyLevel, - Token, -} from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' +import { HistoryDuration, SafetyLevel } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { InterfaceSearchResultSelectionProperties } from 'uniswap/src/features/telemetry/types' import { Trans } from 'uniswap/src/i18n' import { InterfaceChainId } from 'uniswap/src/types/chains' @@ -61,7 +54,7 @@ const NotFoundContainer = styled.div` interface SearchBarDropdownSectionProps { toggleOpen: () => void - suggestions: (InterfaceRemoteSearchHistoryItem | undefined)[] + suggestions: (GenieCollection | SearchToken | undefined)[] header: JSX.Element headerIcon?: JSX.Element hoveredIndex?: number @@ -114,7 +107,7 @@ function SearchBarDropdownSection({ ) } -function isKnownToken(token: GqlSearchToken) { +function isKnownToken(token: SearchToken) { return token.project?.safetyLevel == SafetyLevel.Verified || token.project?.safetyLevel == SafetyLevel.MediumWarning } @@ -134,7 +127,7 @@ const ChainComingSoonBadge = styled(Badge)` interface SearchBarDropdownProps { toggleOpen: () => void - tokens: GqlSearchToken[] + tokens: SearchToken[] collections: GenieCollection[] queryText: string hasInput: boolean @@ -175,13 +168,7 @@ function SearchBarDropdownContents({ }: SearchBarDropdownProps): JSX.Element { const [hoveredIndex, setHoveredIndex] = useState(0) const { data: searchHistory } = useRecentlySearchedAssets() - const shortenedHistory = useMemo( - () => - searchHistory?.filter((item) => 'isVerified' in (item as GenieCollection) || (item as Token).chain) ?? [ - ...Array(2), - ], - [searchHistory], - ) + const shortenedHistory = useMemo(() => searchHistory ?? [...Array(2)], [searchHistory]) const { pathname } = useLocation() const isNFTPage = useIsNftPage() const isTokenPage = pathname.includes('/explore') @@ -214,7 +201,7 @@ function SearchBarDropdownContents({ const trendingTokensLength = !isNFTPage ? 3 : 2 const trendingTokens = useMemo( - () => trendingTokenData?.slice(0, trendingTokensLength) ?? [...Array(trendingTokensLength)], + () => trendingTokenData?.slice(0, trendingTokensLength) ?? [...Array(trendingTokensLength)], [trendingTokenData, trendingTokensLength], ) diff --git a/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx b/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx index 6d6bf995d7b..be2cf4d89d4 100644 --- a/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx +++ b/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx @@ -1,24 +1,23 @@ import { InterfaceEventName } from '@uniswap/analytics-events' import Column from 'components/Column' import QueryTokenLogo from 'components/Logo/QueryTokenLogo' +import { useAddRecentlySearchedAsset } from 'components/NavBar/SearchBar/RecentlySearchedAssets' import TokenSafetyIcon from 'components/TokenSafety/TokenSafetyIcon' import { DeltaArrow, DeltaText } from 'components/Tokens/TokenDetails/Delta' import { LoadingBubble } from 'components/Tokens/loading' import { useTokenWarning } from 'constants/tokenSafety' import { NATIVE_CHAIN_ID } from 'constants/tokens' -import { GqlSearchToken } from 'graphql/data/SearchTokens' +import { SearchToken } from 'graphql/data/SearchTokens' import { getTokenDetailsURL, supportedChainIdFromGQLChain } from 'graphql/data/util' import styled, { css } from 'lib/styled-components' import { searchGenieCollectionToTokenSearchResult, searchTokenToTokenSearchResult } from 'lib/utils/searchBar' import { GenieCollection } from 'nft/types' import { useCallback, useEffect, useState } from 'react' -import { useDispatch } from 'react-redux' import { Link, useNavigate } from 'react-router-dom' import { EllipsisStyle, ThemedText } from 'theme/components' import { Flex } from 'ui/src' import { Verified } from 'ui/src/components/icons/Verified' -import { Chain, TokenStandard } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { addToSearchHistory } from 'uniswap/src/features/search/searchHistorySlice' +import { TokenStandard } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { InterfaceSearchResultSelectionProperties } from 'uniswap/src/features/telemetry/types' import { Trans, useTranslation } from 'uniswap/src/i18n' @@ -81,7 +80,7 @@ const SecondaryContainer = styled(Column)` ` interface SuggestionRowProps { - suggestion: GenieCollection | GqlSearchToken + suggestion: GenieCollection | SearchToken isHovered: boolean setHoveredIndex: (index: number | undefined) => void toggleOpen: () => void @@ -89,8 +88,8 @@ interface SuggestionRowProps { eventProperties: InterfaceSearchResultSelectionProperties } -function suggestionIsToken(suggestion: GenieCollection | GqlSearchToken): suggestion is GqlSearchToken { - return (suggestion as GqlSearchToken).decimals !== undefined +function suggestionIsToken(suggestion: GenieCollection | SearchToken): suggestion is SearchToken { + return (suggestion as SearchToken).decimals !== undefined } export function SuggestionRow({ @@ -103,7 +102,7 @@ export function SuggestionRow({ }: SuggestionRowProps) { const { t } = useTranslation() const isToken = suggestionIsToken(suggestion) - const dispatch = useDispatch() + const addRecentlySearchedAsset = useAddRecentlySearchedAsset() const navigate = useNavigate() const { formatFiatPrice, formatDelta, formatNumberOrString } = useFormatter() const [brokenCollectionImage, setBrokenCollectionImage] = useState(false) @@ -115,25 +114,23 @@ export function SuggestionRow({ const handleClick = useCallback(() => { const address = !suggestion.address && suggestion.standard === TokenStandard.Native ? NATIVE_CHAIN_ID : suggestion.address - - if (isToken && address) { - const chainId = supportedChainIdFromGQLChain(suggestion.chain) - if (chainId) { - const searchResult = searchTokenToTokenSearchResult({ ...suggestion, address, chainId }) - dispatch(addToSearchHistory({ searchResult })) - } - } else { - const searchResult = searchGenieCollectionToTokenSearchResult(suggestion as GenieCollection) - dispatch(addToSearchHistory({ searchResult })) - } + const asset = + isToken && address + ? searchTokenToTokenSearchResult({ + ...suggestion, + address, + chainId: supportedChainIdFromGQLChain(suggestion.chain) as UniverseChainId, + isNative: address === NATIVE_CHAIN_ID, + isToken: suggestion.standard === TokenStandard.Erc20, + }) + : searchGenieCollectionToTokenSearchResult(suggestion as GenieCollection) + asset && addRecentlySearchedAsset(asset) toggleOpen() sendAnalyticsEvent(InterfaceEventName.NAVBAR_RESULT_SELECTED, { ...eventProperties }) - }, [suggestion, isToken, toggleOpen, eventProperties, dispatch]) + }, [suggestion, isToken, addRecentlySearchedAsset, toggleOpen, eventProperties]) - const path = isToken - ? getTokenDetailsURL({ ...suggestion, chain: suggestion.chain ?? Chain.Ethereum }) - : `/nfts/collection/${suggestion.address}` + const path = isToken ? getTokenDetailsURL({ ...suggestion }) : `/nfts/collection/${suggestion.address}` // Close the modal on escape useEffect(() => { const keyDownHandler = (event: KeyboardEvent) => { diff --git a/apps/web/src/components/NavBar/Tabs/TabsContent.tsx b/apps/web/src/components/NavBar/Tabs/TabsContent.tsx index 6212af510c1..e7c46056f9e 100644 --- a/apps/web/src/components/NavBar/Tabs/TabsContent.tsx +++ b/apps/web/src/components/NavBar/Tabs/TabsContent.tsx @@ -26,7 +26,6 @@ export type TabsItem = MenuItem & { export const useTabsContent = (props?: { includeNftsLink?: boolean }): TabsSection[] => { const { t } = useTranslation() const forAggregatorEnabled = useFeatureFlag(FeatureFlags.ForAggregator) - const isMultichainExploreEnabled = useFeatureFlag(FeatureFlags.MultichainExplore) const { pathname } = useLocation() const theme = useTheme() const areTabsVisible = useTabsVisible() @@ -81,7 +80,7 @@ export const useTabsContent = (props?: { includeNftsLink?: boolean }): TabsSecti { label: t('common.transactions'), quickKey: 'X', - href: `/explore/transactions${isMultichainExploreEnabled ? '/ethereum' : ''}`, + href: '/explore/transactions', internal: true, }, { label: t('common.nfts'), quickKey: 'N', href: '/nfts', internal: true }, diff --git a/apps/web/src/components/NavBar/index.tsx b/apps/web/src/components/NavBar/index.tsx index a0293487ce0..58b89317788 100644 --- a/apps/web/src/components/NavBar/index.tsx +++ b/apps/web/src/components/NavBar/index.tsx @@ -1,7 +1,7 @@ import { Bag } from 'components/NavBar/Bag' import { ChainSelector } from 'components/NavBar/ChainSelector' import { CompanyMenu } from 'components/NavBar/CompanyMenu' -import { NewUserCTAButton } from 'components/NavBar/DownloadApp/NewUserCTAButton' +import { GetTheAppButton } from 'components/NavBar/DownloadApp/GetTheAppButton' import { PreferenceMenu } from 'components/NavBar/PreferencesMenu' import { useTabsVisible } from 'components/NavBar/ScreenSizes' import { SearchBar } from 'components/NavBar/SearchBar' @@ -10,7 +10,6 @@ import Row from 'components/Row' import Web3Status from 'components/Web3Status' import { useScreenSize } from 'hooks/screenSize' import { useAccount } from 'hooks/useAccount' -import { useIsExplorePage } from 'hooks/useIsExplorePage' import { useIsLandingPage } from 'hooks/useIsLandingPage' import { useIsLimitPage } from 'hooks/useIsLimitPage' import { useIsNftPage } from 'hooks/useIsNftPage' @@ -21,20 +20,8 @@ import { useProfilePageState } from 'nft/hooks' import { ProfilePageStateType } from 'nft/types' import { BREAKPOINTS, NAV_HEIGHT } from 'theme' import { Z_INDEX } from 'theme/zIndex' -import { Experiments } from 'uniswap/src/features/gating/experiments' import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useExperimentGroupName, useFeatureFlagWithLoading } from 'uniswap/src/features/gating/hooks' - -export enum AccountCTAsExperimentGroup { - Control = 'Control', // Get the app / Connect - SignInSignUp = 'SignIn-SignUp', - LogInCreateAccount = 'LogIn-CreateAccount', -} - -export function useIsAccountCTAExperimentControl() { - const experimentGroupName = useExperimentGroupName(Experiments.AccountCTAs) - return experimentGroupName === AccountCTAsExperimentGroup.Control || experimentGroupName === null -} +import { useFeatureFlagWithLoading } from 'uniswap/src/features/gating/hooks' const Nav = styled.nav` padding: 0px 12px; @@ -79,49 +66,27 @@ const SearchContainer = styled.div` height: 42px; ` -function useShouldHideChainSelector() { +export default function Navbar() { const isNftPage = useIsNftPage() const isLandingPage = useIsLandingPage() const isSendPage = useIsSendPage() const isSwapPage = useIsSwapPage() const isLimitPage = useIsLimitPage() - const isExplorePage = useIsExplorePage() - const { value: multichainFlagEnabled, isLoading: isMultichainFlagLoading } = useFeatureFlagWithLoading( - FeatureFlags.MultichainUX, - ) - const { value: multichainExploreFlagEnabled, isLoading: isMultichainExploreFlagLoading } = useFeatureFlagWithLoading( - FeatureFlags.MultichainExplore, - ) - - const baseHiddenPages = isNftPage - const multichainHiddenPages = isLandingPage || isSendPage || isSwapPage || isLimitPage || baseHiddenPages - const multichainExploreHiddenPages = multichainHiddenPages || isExplorePage - - const hideChainSelector = - multichainExploreFlagEnabled || isMultichainExploreFlagLoading - ? multichainExploreHiddenPages - : multichainFlagEnabled || isMultichainFlagLoading - ? multichainHiddenPages - : baseHiddenPages - - return hideChainSelector -} - -export default function Navbar() { - const isNftPage = useIsNftPage() - const isLandingPage = useIsLandingPage() const sellPageState = useProfilePageState((state) => state.state) const isSmallScreen = !useScreenSize()['sm'] - const isMediumScreen = !useScreenSize()['md'] const areTabsVisible = useTabsVisible() const collapseSearchBar = !useScreenSize()['lg'] const account = useAccount() const NAV_SEARCH_MAX_HEIGHT = 'calc(100vh - 30px)' - const hideChainSelector = useShouldHideChainSelector() - - const isSignInExperimentControl = useIsAccountCTAExperimentControl() + const { value: multichainFlagEnabled, isLoading: isMultichainFlagLoading } = useFeatureFlagWithLoading( + FeatureFlags.MultichainUX, + ) + const hideChainSelector = + multichainFlagEnabled || isMultichainFlagLoading + ? isLandingPage || isSendPage || isSwapPage || isLimitPage || isNftPage + : isNftPage return ( diff --git a/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx b/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx index c8bf28f018c..501c9af6d93 100644 --- a/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx +++ b/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx @@ -48,6 +48,10 @@ const ChartTypeSelectorContainer = styled.div` } ` +const StyledChart: typeof Chart = styled(Chart)` + height: ${PDP_CHART_HEIGHT_PX}px; +` + const PDPChartTypeSelector = ({ chartType, onChartTypeChange, @@ -271,7 +275,7 @@ function PriceChart({ const lastPrice = data[data.length - 1] return ( - + {(crosshairData) => { const displayValue = crosshairData ?? lastPrice const currencyBAmountRaw = Math.floor( @@ -299,7 +303,7 @@ function PriceChart({ /> ) }} - + ) } @@ -395,8 +399,7 @@ function LiquidityChart({ } return ( - }} - + ) } diff --git a/apps/web/src/components/Pools/PoolDetails/PoolDetailsHeader.test.tsx b/apps/web/src/components/Pools/PoolDetails/PoolDetailsHeader.test.tsx index 33b1caae07b..9f0cc3e19f3 100644 --- a/apps/web/src/components/Pools/PoolDetails/PoolDetailsHeader.test.tsx +++ b/apps/web/src/components/Pools/PoolDetails/PoolDetailsHeader.test.tsx @@ -5,15 +5,15 @@ import { ChartType, PriceChartType } from 'components/Charts/utils' import { PoolsDetailsChartType } from 'components/Pools/PoolDetails/ChartSection' import { PoolDetailsBreadcrumb, PoolDetailsHeader } from 'components/Pools/PoolDetails/PoolDetailsHeader' import store from 'state' +import { addSerializedToken } from 'state/user/reducer' import { usdcWethPoolAddress, validBEPoolToken0, validBEPoolToken1 } from 'test-utils/pools/fixtures' import { act, render, screen } from 'test-utils/render' -import { dismissTokenWarning } from 'uniswap/src/features/tokens/slice/slice' describe('PoolDetailsHeader', () => { beforeEach(() => { store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -23,8 +23,8 @@ describe('PoolDetailsHeader', () => { }), ) store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', symbol: 'WETH', diff --git a/apps/web/src/components/Pools/PoolDetails/PoolDetailsLink.test.tsx b/apps/web/src/components/Pools/PoolDetails/PoolDetailsLink.test.tsx index 4b39035d427..b2d72090a6e 100644 --- a/apps/web/src/components/Pools/PoolDetails/PoolDetailsLink.test.tsx +++ b/apps/web/src/components/Pools/PoolDetails/PoolDetailsLink.test.tsx @@ -3,16 +3,16 @@ import 'test-utils/tokens/mocks' import { PoolDetailsLink } from 'components/Pools/PoolDetails/PoolDetailsLink' import { USDC_MAINNET } from 'constants/tokens' import store from 'state' +import { addSerializedToken } from 'state/user/reducer' import { usdcWethPoolAddress, validBEPoolToken0, validBEPoolToken1 } from 'test-utils/pools/fixtures' import { render, screen } from 'test-utils/render' -import { dismissTokenWarning } from 'uniswap/src/features/tokens/slice/slice' import { UniverseChainId } from 'uniswap/src/types/chains' describe('PoolDetailsHeader', () => { beforeEach(() => { store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -22,8 +22,8 @@ describe('PoolDetailsHeader', () => { }), ) store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', symbol: 'WETH', diff --git a/apps/web/src/components/Pools/PoolDetails/PoolDetailsStats.test.tsx b/apps/web/src/components/Pools/PoolDetails/PoolDetailsStats.test.tsx index 8133e380231..3fad1107592 100644 --- a/apps/web/src/components/Pools/PoolDetails/PoolDetailsStats.test.tsx +++ b/apps/web/src/components/Pools/PoolDetails/PoolDetailsStats.test.tsx @@ -3,10 +3,10 @@ import 'test-utils/tokens/mocks' import { PoolDetailsStats } from 'components/Pools/PoolDetails/PoolDetailsStats' import { enableNetConnect } from 'nock' import store from 'state' +import { addSerializedToken } from 'state/user/reducer' import { validPoolDataResponse } from 'test-utils/pools/fixtures' import { act, render, screen } from 'test-utils/render' import { BREAKPOINTS } from 'theme' -import { dismissTokenWarning } from 'uniswap/src/features/tokens/slice/slice' describe('PoolDetailsStats', () => { const mockProps = { @@ -19,8 +19,8 @@ describe('PoolDetailsStats', () => { // Enable network connections for retrieving token logos enableNetConnect() store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -30,8 +30,8 @@ describe('PoolDetailsStats', () => { }), ) store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', symbol: 'WETH', diff --git a/apps/web/src/components/Pools/PoolDetails/PoolDetailsStatsButtons.test.tsx b/apps/web/src/components/Pools/PoolDetails/PoolDetailsStatsButtons.test.tsx index 41d25416c95..fc280c11e13 100644 --- a/apps/web/src/components/Pools/PoolDetails/PoolDetailsStatsButtons.test.tsx +++ b/apps/web/src/components/Pools/PoolDetails/PoolDetailsStatsButtons.test.tsx @@ -5,11 +5,11 @@ import useMultiChainPositions from 'components/AccountDrawer/MiniPortfolio/Pools import { PoolDetailsStatsButtons } from 'components/Pools/PoolDetails/PoolDetailsStatsButtons' import { useAccount } from 'hooks/useAccount' import store from 'state' +import { addSerializedToken } from 'state/user/reducer' import { USE_DISCONNECTED_ACCOUNT } from 'test-utils/constants' import { mocked } from 'test-utils/mocked' import { useMultiChainPositionsReturnValue, validBEPoolToken0, validBEPoolToken1 } from 'test-utils/pools/fixtures' import { act, render, screen } from 'test-utils/render' -import { dismissTokenWarning } from 'uniswap/src/features/tokens/slice/slice' import { UniverseChainId } from 'uniswap/src/types/chains' jest.mock('components/AccountDrawer/MiniPortfolio/Pools/useMultiChainPositions') @@ -34,8 +34,8 @@ describe('PoolDetailsStatsButton', () => { mocked(useAccount).mockReturnValue(USE_DISCONNECTED_ACCOUNT) mocked(useMultiChainPositions).mockReturnValue(useMultiChainPositionsReturnValue) store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -45,8 +45,8 @@ describe('PoolDetailsStatsButton', () => { }), ) store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', symbol: 'WETH', diff --git a/apps/web/src/components/Pools/PoolDetails/PoolDetailsTransactionsTable.tsx b/apps/web/src/components/Pools/PoolDetails/PoolDetailsTransactionsTable.tsx index 4a0b6cece91..31de388c257 100644 --- a/apps/web/src/components/Pools/PoolDetails/PoolDetailsTransactionsTable.tsx +++ b/apps/web/src/components/Pools/PoolDetails/PoolDetailsTransactionsTable.tsx @@ -14,7 +14,7 @@ import { import { OrderDirection, getSupportedGraphQlChain, supportedChainIdFromGQLChain } from 'graphql/data/util' import { useActiveLocalCurrency } from 'hooks/useActiveLocalCurrency' import styled from 'lib/styled-components' -import { useMemo, useReducer, useRef, useState } from 'react' +import { useMemo, useReducer, useState } from 'react' import { ExternalLink, ThemedText } from 'theme/components' import { ProtocolVersion, Token } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { Trans } from 'uniswap/src/i18n' @@ -72,7 +72,6 @@ export function PoolDetailsTransactionsTable({ const activeLocalCurrency = useActiveLocalCurrency() const { formatNumber, formatFiatPrice } = useFormatter() const [filterModalIsOpen, toggleFilterModal] = useReducer((s) => !s, false) - const filterAnchorRef = useRef(null) const [filter, setFilters] = useState([ PoolTableTransactionType.BUY, PoolTableTransactionType.SELL, @@ -98,7 +97,7 @@ export function PoolDetailsTransactionsTable({ - + @@ -151,14 +150,13 @@ export function PoolDetailsTransactionsTable({ id: 'swap-type', header: () => ( - toggleFilterModal()} ref={filterAnchorRef}> + toggleFilterModal()}> diff --git a/apps/web/src/components/Pools/PoolDetails/__snapshots__/PoolDetailsTransactionTable.test.tsx.snap b/apps/web/src/components/Pools/PoolDetails/__snapshots__/PoolDetailsTransactionTable.test.tsx.snap index 291b5c39105..261641b42d7 100644 --- a/apps/web/src/components/Pools/PoolDetails/__snapshots__/PoolDetailsTransactionTable.test.tsx.snap +++ b/apps/web/src/components/Pools/PoolDetails/__snapshots__/PoolDetailsTransactionTable.test.tsx.snap @@ -2,13 +2,30 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` - .c1 { + .c4 { box-sizing: border-box; margin: 0; min-width: 0; } -.c2 { +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c10 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -26,7 +43,37 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` gap: 4px; } -.c5 { +.c33 { + height: 16px; + width: 16px; +} + +.c33 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c34 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c1 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c12 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -34,7 +81,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` letter-spacing: -0.01em; } -.c11 { +.c28 { color: #40B66B; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -42,7 +89,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` letter-spacing: -0.01em; } -.c12 { +.c29 { color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -50,7 +97,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` letter-spacing: -0.01em; } -.c13 { +.c21 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -61,20 +108,175 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` font-weight: 500; } -.c13:hover { +.c21:hover { opacity: 0.6; } -.c13:active { +.c21:active { opacity: 0.4; } -.c8 { +.c25 { display: inline-block; height: inherit; } +.c2 { + max-width: px; + max-height: 600px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0px auto 24px auto; +} + .c3 { + width: 100%; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; +} + +.c19 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c19::-webkit-scrollbar { + display: none; +} + +.c31 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c32 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c6 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c7 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; +} + +.c7::-webkit-scrollbar { + display: none; +} + +.c8 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c8:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c8:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c23 { + -webkit-text-decoration: none; + text-decoration: none; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; + color: #222222; +} + +.c23:hover { + opacity: 0.6; +} + +.c23:active { + opacity: 0.4; +} + +.c11 { height: 16px; width: 16px; color: #222222; @@ -83,7 +285,33 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` transform: rotate(0deg); } -.c7 { +.c13 { + color: #222222; +} + +.c15 { + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + gap: 4px; +} + +.c15:hover { + opacity: 0.6; +} + +.c15:active { + opacity: 0.4; +} + +.c24 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -99,22 +327,110 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` width: 100%; } -.c10 { +.c27 { display: none; height: 16px; width: 16px; color: #7D7D7D; } -.c6:hover .c9 { +.c22:hover .c26 { display: block; } -.c4 { - position: relative; +.c9 { + min-width: 120px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; } .c14 { + min-width: 144px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c17 { + min-width: 125px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c18 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c16 { + position: relative; +} + +.c30 { color: #7D7D7D; stroke: #7D7D7D; } @@ -123,6 +439,12 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` min-height: 256px; } +@media not all and (hover:none) { + .c20:hover { + background: #22222212; + } +} +
- Time - +
Type
@@ -224,48 +544,48 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = `
USD
Wallet
@@ -274,38 +594,36 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = `
@@ -417,13 +758,30 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` exports[`PoolDetailsTransactionsTable renders error state 1`] = ` - .c1 { + .c4 { box-sizing: border-box; margin: 0; min-width: 0; } -.c2 { +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c10 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -441,7 +799,23 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` gap: 4px; } -.c9 { +.c27 { + height: 16px; + width: 16px; +} + +.c27 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c28 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -455,7 +829,7 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` justify-content: flex-start; } -.c5 { +.c12 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -463,7 +837,7 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` letter-spacing: -0.01em; } -.c10 { +.c24 { color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -471,7 +845,7 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` letter-spacing: -0.01em; } -.c8 { +.c23 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -501,7 +875,144 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` border-radius: 20px; } +.c2 { + max-width: px; + max-height: 600px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0px auto 24px auto; +} + .c3 { + width: 100%; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; +} + +.c21 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c21::-webkit-scrollbar { + display: none; +} + +.c25 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c26 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c6 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c7 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; + opacity: 0.4; +} + +.c7::-webkit-scrollbar { + display: none; +} + +.c8 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c8:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c8:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c11 { height: 16px; width: 16px; color: #222222; @@ -510,7 +1021,33 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` transform: rotate(0deg); } -.c6 { +.c13 { + color: #222222; +} + +.c15 { + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + gap: 4px; +} + +.c15:hover { + opacity: 0.6; +} + +.c15:active { + opacity: 0.4; +} + +.c18 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -525,12 +1062,100 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` background-size: 400%; } -.c7 { +.c9 { + min-width: 120px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c14 { + min-width: 144px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c17 { + min-width: 125px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c20 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c19 { width: 75%; height: 16px; } -.c4 { +.c16 { position: relative; } @@ -538,6 +1163,12 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` min-height: 256px; } +@media not all and (hover:none) { + .c22:hover { + background: #22222212; + } +} +
- Time - +
Type
@@ -639,50 +1268,50 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = `
USD
Wallet
@@ -691,542 +1320,542 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = `
@@ -1259,21 +1888,44 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = `
Error loading data
Data is unavailable at the moment; we’re working on a fix
+
+
+ + + + Loading +
+
@@ -1285,13 +1937,30 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` - .c1 { + .c4 { box-sizing: border-box; margin: 0; min-width: 0; } -.c2 { +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c10 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -1309,7 +1978,37 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` gap: 4px; } -.c5 { +.c25 { + height: 16px; + width: 16px; +} + +.c25 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c26 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c1 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c12 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -1317,7 +2016,143 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` letter-spacing: -0.01em; } +.c2 { + max-width: px; + max-height: 600px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0px auto 24px auto; +} + .c3 { + width: 100%; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; +} + +.c21 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c21::-webkit-scrollbar { + display: none; +} + +.c23 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c24 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c6 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c7 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; +} + +.c7::-webkit-scrollbar { + display: none; +} + +.c8 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c8:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c8:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c11 { height: 16px; width: 16px; color: #222222; @@ -1326,7 +2161,33 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` transform: rotate(0deg); } -.c6 { +.c13 { + color: #222222; +} + +.c15 { + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + gap: 4px; +} + +.c15:hover { + opacity: 0.6; +} + +.c15:active { + opacity: 0.4; +} + +.c18 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -1341,12 +2202,100 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` background-size: 400%; } -.c7 { +.c9 { + min-width: 120px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c14 { + min-width: 144px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c17 { + min-width: 125px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c20 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c19 { width: 75%; height: 16px; } -.c4 { +.c16 { position: relative; } @@ -1354,6 +2303,12 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` min-height: 256px; } +@media not all and (hover:none) { + .c22:hover { + background: #22222212; + } +} +
- Time - +
Type
@@ -1455,50 +2408,50 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = `
USD
Wallet
@@ -1507,541 +2460,564 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = `
+
+
+ + + + Loading +
+
diff --git a/apps/web/src/components/Pools/PoolTable/PoolTable.tsx b/apps/web/src/components/Pools/PoolTable/PoolTable.tsx index 55c731477da..96d42d084cc 100644 --- a/apps/web/src/components/Pools/PoolTable/PoolTable.tsx +++ b/apps/web/src/components/Pools/PoolTable/PoolTable.tsx @@ -1,41 +1,29 @@ import { ApolloError } from '@apollo/client' import { ColumnDef, createColumnHelper } from '@tanstack/react-table' import { InterfaceElementName } from '@uniswap/analytics-events' -// eslint-disable-next-line no-restricted-imports -import { TokenStats } from '@uniswap/client-explore/dist/uniswap/explore/v1/service_pb' import { Percent } from '@uniswap/sdk-core' -import { PortfolioLogo } from 'components/AccountDrawer/MiniPortfolio/PortfolioLogo' +import { DoubleCurrencyAndChainLogo } from 'components/DoubleLogo' +import Row from 'components/Row' import { Table } from 'components/Table' import { Cell } from 'components/Table/Cell' import { ClickableHeaderRow, HeaderArrow, HeaderSortText } from 'components/Table/styled' -import { EllipsisText } from 'components/Tokens/TokenTable' +import { NameText } from 'components/Tokens/TokenTable' import { MAX_WIDTH_MEDIA_BREAKPOINT } from 'components/Tokens/constants' import { exploreSearchStringAtom } from 'components/Tokens/state' import { MouseoverTooltip } from 'components/Tooltip' -import { chainIdToBackendChain, useChainFromUrlParam } from 'constants/chains' +import { SupportedInterfaceChainId, chainIdToBackendChain, useChainFromUrlParam } from 'constants/chains' import { BIPS_BASE } from 'constants/misc' import { useUpdateManualOutage } from 'featureFlags/flags/outageBanner' import { PoolSortFields, TablePool, useTopPools } from 'graphql/data/pools/useTopPools' -import { - OrderDirection, - getSupportedGraphQlChain, - gqlToCurrency, - supportedChainIdFromGQLChain, - unwrapToken, -} from 'graphql/data/util' -import { useCurrencyInfo } from 'hooks/Tokens' +import { OrderDirection, getSupportedGraphQlChain, gqlToCurrency, unwrapToken } from 'graphql/data/util' import { useAtom } from 'jotai' import { atomWithReset, useAtomValue, useResetAtom, useUpdateAtom } from 'jotai/utils' +import styled from 'lib/styled-components' import { ReactElement, ReactNode, useCallback, useEffect, useMemo } from 'react' -import { giveExploreStatDefaultValue } from 'state/explore' -import { useTopPools as useRestTopPools } from 'state/explore/topPools' -import { PoolStat } from 'state/explore/types' -import { Flex, Text, styled } from 'ui/src' -import { Chain, ProtocolVersion, Token } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' +import { ThemedText } from 'theme/components' +import { ProtocolVersion, Token } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { Trans } from 'uniswap/src/i18n' -import { InterfaceChainId, UniverseChainId } from 'uniswap/src/types/chains' +import { InterfaceChainId } from 'uniswap/src/types/chains' import { NumberType, useFormatter } from 'utils/formatNumbers' const HEADER_DESCRIPTIONS: Record = { @@ -46,19 +34,16 @@ const HEADER_DESCRIPTIONS: Record = { [PoolSortFields.OneDayApr]: , } -const TableWrapper = styled(Flex, { - m: '0 auto', - maxWidth: MAX_WIDTH_MEDIA_BREAKPOINT, -}) +const TableWrapper = styled.div` + margin: 0 auto; + max-width: ${MAX_WIDTH_MEDIA_BREAKPOINT}; +` -const Badge = styled(Text, { - py: 2, - px: 6, - backgroundColor: '$surface2', - borderRadius: '$rounded6', - variant: 'body4', - color: '$neutral2', -}) +const Badge = styled(ThemedText.LabelMicro)` + padding: 2px 6px; + background: ${({ theme }) => theme.surface2}; + border-radius: 5px; +` interface PoolTableValues { index: number @@ -81,14 +66,6 @@ export enum PoolTableColumns { OneDayApr, } -function getRestTokenLogo(token?: Token | TokenStats, currencyLogo?: string | null): string | undefined { - // We can retrieve currencies for native chain assets and should use that logo over the rest returned logo - if (currencyLogo) { - return currencyLogo - } - return token && !('id' in token) ? token?.logo : undefined -} - function PoolDescription({ token0, token1, @@ -96,31 +73,22 @@ function PoolDescription({ chainId, protocolVersion = ProtocolVersion.V3, }: { - token0?: Token | TokenStats - token1?: Token | TokenStats - feeTier?: number + token0: Token + token1: Token + feeTier: number chainId: InterfaceChainId - protocolVersion?: ProtocolVersion | string + protocolVersion: ProtocolVersion }) { - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) - const currencies = [token0 ? gqlToCurrency(token0) : undefined, token1 ? gqlToCurrency(token1) : undefined] - // skip is isRestExploreEnabled - const currencyLogos = [ - useCurrencyInfo(currencies?.[0], chainId, isRestExploreEnabled)?.logoUrl, - useCurrencyInfo(currencies?.[1], chainId, isRestExploreEnabled)?.logoUrl, - ] - const images = isRestExploreEnabled - ? [getRestTokenLogo(token0, currencyLogos[0]), getRestTokenLogo(token1, currencyLogos[1])] - : undefined + const currencies = [gqlToCurrency(token0), gqlToCurrency(token1)] return ( - - - - {token0?.symbol}/{token1?.symbol} - + + + + {token0.symbol}/{token1.symbol} + {protocolVersion === ProtocolVersion.V2 && {protocolVersion.toLowerCase()}} - {feeTier && {feeTier / BIPS_BASE}%} - + {feeTier / BIPS_BASE}% + ) } @@ -163,9 +131,9 @@ function PoolTableHeader({ const handleSortCategory = useSetSortMethod(category) return ( - + {isCurrentSortMethod && } - {HEADER_TEXT[category]} + {HEADER_TEXT[category]} ) @@ -183,12 +151,7 @@ export function TopPoolTable() { resetSortAscending() }, [resetSortAscending, resetSortMethod]) - const { - topPools: gqlTopPools, - loading: gqlLoading, - errorV3, - errorV2, - } = useTopPools( + const { topPools, loading, errorV3, errorV2 } = useTopPools( { sortBy: sortMethod, sortDirection: sortAscending ? OrderDirection.Asc : OrderDirection.Desc }, chain.id, ) @@ -196,23 +159,18 @@ export function TopPoolTable() { errorV2 && errorV3 ? new ApolloError({ errorMessage: `Could not retrieve V2 and V3 Top Pools on chain: ${chain.id}` }) : undefined - const allDataStillLoading = gqlLoading && !gqlTopPools.length + const allDataStillLoading = loading && !topPools.length useUpdateManualOutage({ chainId: chain.id, errorV3, errorV2 }) - const { - topPools: restTopPools, - isLoading: restIsLoading, - isError: restIsError, - } = useRestTopPools({ sortBy: sortMethod, sortDirection: sortAscending ? OrderDirection.Asc : OrderDirection.Desc }) - - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) - const { topPools, loading, error } = isRestExploreEnabled - ? { topPools: restTopPools, loading: restIsLoading, error: restIsError } - : { topPools: gqlTopPools, loading: allDataStillLoading, error: combinedError } - return ( - + ) } @@ -222,14 +180,16 @@ export function PoolsTable({ loading, error, loadMore, + chainId, maxWidth, maxHeight, hiddenColumns, }: { - pools?: TablePool[] | PoolStat[] + pools?: TablePool[] loading: boolean - error?: ApolloError | boolean + error?: ApolloError loadMore?: ({ onComplete }: { onComplete?: () => void }) => void + chainId: SupportedInterfaceChainId maxWidth?: number maxHeight?: number hiddenColumns?: PoolTableColumns[] @@ -244,8 +204,7 @@ export function PoolsTable({ () => pools?.map((pool, index) => { const poolSortRank = index + 1 - const isGqlPool = 'hash' in pool - const chainId = supportedChainIdFromGQLChain(pool.token0?.chain as Chain) ?? UniverseChainId.Mainnet + return { index: poolSortRank, poolDescription: ( @@ -257,21 +216,21 @@ export function PoolsTable({ protocolVersion={pool.protocolVersion} /> ), - txCount: pool.txCount ?? 0, - tvl: isGqlPool ? pool.tvl : giveExploreStatDefaultValue(pool.totalLiquidity?.value), - volume24h: isGqlPool ? pool.volume24h : giveExploreStatDefaultValue(pool.volume1Day?.value), - volumeWeek: isGqlPool ? pool.volumeWeek : giveExploreStatDefaultValue(pool.volume1Week?.value), + txCount: pool.txCount, + tvl: pool.tvl, + volume24h: pool.volume24h, + volumeWeek: pool.volumeWeek, oneDayApr: pool.oneDayApr, - link: `/explore/pools/${chainIdToBackendChain({ chainId, withFallback: true }).toLowerCase()}/${isGqlPool ? pool.hash : pool.id}`, + link: `/explore/pools/${chainIdToBackendChain({ chainId, withFallback: true }).toLowerCase()}/${pool.hash}`, analytics: { elementName: InterfaceElementName.POOLS_TABLE_ROW, properties: { chain_id: chainId, - pool_address: isGqlPool ? pool.hash : pool?.id, - token0_address: pool?.token0?.address, - token0_symbol: pool?.token0?.symbol, - token1_address: pool?.token1?.address, - token1_symbol: pool?.token1?.symbol, + pool_address: pool.hash, + token0_address: pool.token0.address, + token0_symbol: pool.token0.symbol, + token1_address: pool.token1.address, + token1_symbol: pool.token1.symbol, pool_list_index: index, pool_list_rank: poolSortRank, pool_list_length: pools.length, @@ -280,7 +239,7 @@ export function PoolsTable({ }, } }) ?? [], - [filterString, pools], + [chainId, filterString, pools], ) const showLoadingSkeleton = loading || !!error @@ -292,16 +251,12 @@ export function PoolsTable({ id: 'index', header: () => ( - - # - + # ), cell: (index) => ( - - {index.getValue?.()} - + {index.getValue?.()} ), }) @@ -311,13 +266,13 @@ export function PoolsTable({ id: 'poolDescription', header: () => ( - + - + ), cell: (poolDescription) => ( - + {poolDescription.getValue?.()} ), @@ -327,7 +282,7 @@ export function PoolsTable({ ? columnHelper.accessor((row) => row.txCount, { id: 'transactions', header: () => ( - + ), cell: (txCount) => ( - - + + {formatNumber({ input: txCount.getValue?.(), type: NumberType.NFTCollectionStats })} - + ), }) @@ -358,9 +313,9 @@ export function PoolsTable({ ), cell: (tvl) => ( - + {formatNumber({ input: tvl.getValue?.(), type: NumberType.FiatTokenStats })} - + ), }) @@ -379,9 +334,9 @@ export function PoolsTable({ ), cell: (volume24h) => ( - + {formatNumber({ input: volume24h.getValue?.(), type: NumberType.FiatTokenStats })} - + ), }) @@ -400,9 +355,9 @@ export function PoolsTable({ ), cell: (volumeWeek) => ( - + {formatNumber({ input: volumeWeek.getValue?.(), type: NumberType.FiatTokenStats })} - + ), }) @@ -421,9 +376,7 @@ export function PoolsTable({ ), cell: (oneDayApr) => ( - - {formatPercent(oneDayApr.getValue?.())} - + {formatPercent(oneDayApr.getValue?.())} ), }) @@ -435,7 +388,7 @@ export function PoolsTable({ return ( - .c4 { + .c30 { + height: 16px; + width: 16px; +} + +.c30 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c31 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c4 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c21 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 8px; +} + +.c10 { + color: #7D7D7D; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c25 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c23 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -13,55 +86,230 @@ exports[`PoolTable renders data filled state 1`] = ` left: 0; } -.c4 img { +.c23 img { width: 14px; height: 28px; object-fit: cover; } -.c4 img:first-child { +.c23 img:first-child { border-radius: 14px 0 0 14px; object-position: 0 0; } -.c4 img:last-child { +.c23 img:last-child { border-radius: 0 14px 14px 0; object-position: 100% 0; } -.c5 { +.c24 { width: 14px; height: 28px; border-radius: 50%; } -.c3 { +.c22 { + position: relative; + top: 0; + left: 0; +} + +.c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c13 { + display: inline-block; + height: inherit; +} + +.c2 { + max-width: 1200px; + max-height: px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; -webkit-align-items: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; + margin: 0px auto 24px auto; +} + +.c3 { + width: 100%; position: relative; - top: 0; - left: 0; + position: -webkit-sticky; + position: sticky; + position: -webkit-sticky; + top: 72px; + z-index: 990; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; } -.c0 { - display: inline-block; - height: inherit; +.c3:before { + content: ''; + height: 12px; } -.c2 { +.c18 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c18::-webkit-scrollbar { + display: none; +} + +.c28 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c29 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c6 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c7 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; +} + +.c7::-webkit-scrollbar { + display: none; +} + +.c8 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c8:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c8:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c19 { color: none; -webkit-text-decoration: none; text-decoration: none; cursor: pointer; } -.c1 { +.c14 { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + cursor: pointer; + width: 100%; + gap: 4px; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c14:hover { + opacity: 0.6; +} + +.c14:active { + opacity: 0.4; +} + +.c15 { height: 16px; width: 16px; color: #222222; @@ -70,6 +318,121 @@ exports[`PoolTable renders data filled state 1`] = ` transform: rotate(0deg); } +.c16 { + color: #222222; +} + +.c9 { + min-width: 44px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c11 { + width: 240px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c12 { + min-width: 120px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c17 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c26 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.c0 { + margin: 0 auto; + max-width: 1200px; +} + +.c27 { + padding: 2px 6px; + background: #F9F9F9; + border-radius: 5px; +} + +@media not all and (hover:none) { + .c20:hover { + background: #22222212; + } +} +
-
- # - +
- Pool - +
- Transactions - +
- TVL - +
- 1 day volume - +
- 7 day volume - +
- 1 day APR - +
@@ -271,149 +624,160 @@ exports[`PoolTable renders data filled state 1`] = `
- $300.00 - +
- $400.00 - +
- $500.00 - +
- 6% - +
+
+
+ + + + Loading +
+
@@ -425,23 +789,62 @@ exports[`PoolTable renders data filled state 1`] = ` exports[`PoolTable renders error state 1`] = ` - .c6 { - color: #222222; + .c26 { + height: 16px; + width: 16px; +} + +.c26 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c27 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c4 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c10 { + color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c7 { - color: #7D7D7D; +.c23 { + color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c5 { +.c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -455,7 +858,7 @@ exports[`PoolTable renders error state 1`] = ` justify-content: flex-start; } -.c4 { +.c22 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -485,12 +888,182 @@ exports[`PoolTable renders error state 1`] = ` border-radius: 20px; } -.c0 { +.c13 { display: inline-block; height: inherit; } -.c1 { +.c2 { + max-width: 1200px; + max-height: px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0px auto 24px auto; +} + +.c3 { + width: 100%; + position: relative; + position: -webkit-sticky; + position: sticky; + position: -webkit-sticky; + top: 72px; + z-index: 990; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; +} + +.c3:before { + content: ''; + height: 12px; +} + +.c18 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c18::-webkit-scrollbar { + display: none; +} + +.c24 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c25 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c6 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c7 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; + opacity: 0.4; +} + +.c7::-webkit-scrollbar { + display: none; +} + +.c8 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c8:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c8:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c14 { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + cursor: pointer; + width: 100%; + gap: 4px; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c14:hover { + opacity: 0.6; +} + +.c14:active { + opacity: 0.4; +} + +.c15 { height: 16px; width: 16px; color: #222222; @@ -499,7 +1072,11 @@ exports[`PoolTable renders error state 1`] = ` transform: rotate(0deg); } -.c2 { +.c16 { + color: #222222; +} + +.c20 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -514,11 +1091,110 @@ exports[`PoolTable renders error state 1`] = ` background-size: 400%; } -.c3 { +.c9 { + min-width: 44px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c11 { + width: 240px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c12 { + min-width: 120px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c17 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c21 { width: 75%; height: 16px; } +.c0 { + margin: 0 auto; + max-width: 1200px; +} + +@media not all and (hover:none) { + .c19:hover { + background: #22222212; + } +} +
-
- # - +
- Pool - +
- Transactions - +
- TVL - +
- 1 day volume - +
- 7 day volume - +
- 1 day APR - +
@@ -720,626 +1386,626 @@ exports[`PoolTable renders error state 1`] = `
@@ -1372,21 +2038,44 @@ exports[`PoolTable renders error state 1`] = `
Error loading data
Data is unavailable at the moment; we’re working on a fix
+
+
+ + + + Loading +
+
@@ -1398,12 +2087,242 @@ exports[`PoolTable renders error state 1`] = ` exports[`PoolTable renders loading state 1`] = ` - .c0 { + .c24 { + height: 16px; + width: 16px; +} + +.c24 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c25 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c4 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c10 { + color: #7D7D7D; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c1 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c13 { display: inline-block; height: inherit; } -.c1 { +.c2 { + max-width: 1200px; + max-height: px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0px auto 24px auto; +} + +.c3 { + width: 100%; + position: relative; + position: -webkit-sticky; + position: sticky; + position: -webkit-sticky; + top: 72px; + z-index: 990; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; +} + +.c3:before { + content: ''; + height: 12px; +} + +.c18 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c18::-webkit-scrollbar { + display: none; +} + +.c22 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c23 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c6 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c7 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; +} + +.c7::-webkit-scrollbar { + display: none; +} + +.c8 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c8:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c8:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c14 { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + cursor: pointer; + width: 100%; + gap: 4px; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c14:hover { + opacity: 0.6; +} + +.c14:active { + opacity: 0.4; +} + +.c15 { height: 16px; width: 16px; color: #222222; @@ -1412,7 +2331,11 @@ exports[`PoolTable renders loading state 1`] = ` transform: rotate(0deg); } -.c2 { +.c16 { + color: #222222; +} + +.c20 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -1427,11 +2350,110 @@ exports[`PoolTable renders loading state 1`] = ` background-size: 400%; } -.c3 { +.c9 { + min-width: 44px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c11 { + width: 240px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c12 { + min-width: 120px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c17 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c21 { width: 75%; height: 16px; } +.c0 { + margin: 0 auto; + max-width: 1200px; +} + +@media not all and (hover:none) { + .c19:hover { + background: #22222212; + } +} +
-
- # - +
- Pool - +
- Transactions - +
- TVL - +
- 1 day volume - +
- 7 day volume - +
- 1 day APR - +
@@ -1633,625 +2645,648 @@ exports[`PoolTable renders loading state 1`] = `
+
+
+ + + + Loading +
+
diff --git a/apps/web/src/components/SearchModal/CurrencyList/index.tsx b/apps/web/src/components/SearchModal/CurrencyList/index.tsx index 10980a115b8..689a9be08bd 100644 --- a/apps/web/src/components/SearchModal/CurrencyList/index.tsx +++ b/apps/web/src/components/SearchModal/CurrencyList/index.tsx @@ -9,6 +9,7 @@ import TokenSafetyIcon from 'components/TokenSafety/TokenSafetyIcon' import { MouseoverTooltip, TooltipSize } from 'components/Tooltip' import { useTokenWarning } from 'constants/tokenSafety' import { useTotalBalancesUsdForAnalytics } from 'graphql/data/apollo/TokenBalancesProvider' +import { useIsUserAddedToken } from 'hooks/Tokens' import { useAccount } from 'hooks/useAccount' import { TokenBalances } from 'lib/hooks/useTokenList/sorting' import tryParseCurrencyAmount from 'lib/utils/tryParseCurrencyAmount' @@ -19,7 +20,6 @@ import { ThemedText } from 'theme/components' import { Flex, Text, styled } from 'ui/src' import Trace from 'uniswap/src/features/telemetry/Trace' import { UniswapEventName } from 'uniswap/src/features/telemetry/constants' -import { useDismissedTokenWarnings } from 'uniswap/src/features/tokens/slice/hooks' import { shortenAddress } from 'utilities/src/addresses' import { currencyKey } from 'utils/currencyKey' import { NumberType, useFormatter } from 'utils/formatNumbers' @@ -117,7 +117,7 @@ const getDisplayName = (name: string | undefined) => { } const RowWrapper = styled(Flex, { - row: true, + flexDirection: 'row', height: '$spacing60', }) @@ -148,7 +148,7 @@ export function CurrencyRow({ }) { const account = useAccount() const key = currencyListRowKey(currency) - const { tokenWarningDismissed: customAdded } = useDismissedTokenWarnings(currency) + const customAdded = useIsUserAddedToken(currency) const warning = useTokenWarning(currency?.isNative ? undefined : currency?.address, currency.chainId) const isBlockedToken = !!warning && !warning.canProceed const blockedTokenOpacity = '0.6' diff --git a/apps/web/src/components/SearchModal/CurrencySearch.tsx b/apps/web/src/components/SearchModal/CurrencySearch.tsx index 3ad8ac227d0..2c08339f437 100644 --- a/apps/web/src/components/SearchModal/CurrencySearch.tsx +++ b/apps/web/src/components/SearchModal/CurrencySearch.tsx @@ -1,22 +1,39 @@ import { InterfaceEventName, InterfaceModalName } from '@uniswap/analytics-events' -import { Currency } from '@uniswap/sdk-core' +import { Currency, Token } from '@uniswap/sdk-core' +import { + recentlySearchedAssetsAtom, + useAddRecentlySearchedCurrency, +} from 'components/NavBar/SearchBar/RecentlySearchedAssets' import { useAccount } from 'hooks/useAccount' import { useActiveLocalCurrency } from 'hooks/useActiveLocalCurrency' import { useActiveLocale } from 'hooks/useActiveLocale' +import usePrevious from 'hooks/usePrevious' import useSelectChain from 'hooks/useSelectChain' -import { useShowSwapNetworkNotification } from 'hooks/useShowSwapNetworkNotification' -import { useCallback, useEffect } from 'react' +import { useAtomValue } from 'jotai/utils' +import { useCallback, useEffect, useMemo, useState } from 'react' +import { useAddPopup, useRemovePopup } from 'state/application/hooks' +import { PopupType } from 'state/application/reducer' import { useSwapAndLimitContext } from 'state/swap/useSwapContext' +import { useAddUserToken } from 'state/user/hooks' +import { useAllUserAddedTokens } from 'state/user/userAddedTokens' import { Flex } from 'ui/src' import { TokenSelectorContent, TokenSelectorVariation } from 'uniswap/src/components/TokenSelector/TokenSelector' +import { + useCommonTokensOptions, + useFilterCallbacks, + usePopularTokensOptions, + usePortfolioTokenOptions, + useTokenSectionsForSearchResults, +} from 'uniswap/src/components/TokenSelector/hooks' import { TokenSelectorFlow } from 'uniswap/src/components/TokenSelector/types' +import { TokenSearchResult } from 'uniswap/src/features/search/SearchResult' +import { useHideSmallBalancesSetting, useHideSpamTokensSetting } from 'uniswap/src/features/settings/hooks' import Trace from 'uniswap/src/features/telemetry/Trace' +import { UniverseChainId } from 'uniswap/src/types/chains' import { CurrencyField } from 'uniswap/src/types/currency' import { SwapTab } from 'uniswap/src/types/screens/interface' -// eslint-disable-next-line no-restricted-imports import { formatNumberOrString } from 'utilities/src/format/localeBased' import { NumberType as UtilitiesNumberType } from 'utilities/src/format/types' -import { usePrevious } from 'utilities/src/react/hooks' import { NumberType, useFormatter } from 'utils/formatNumbers' interface CurrencySearchProps { @@ -29,15 +46,34 @@ export function CurrencySearch({ currencyField, onCurrencySelect, onDismiss }: C const account = useAccount() const { chainId, setSelectedChainId, isUserSelectedToken, setIsUserSelectedToken, currentTab, multichainUXEnabled } = useSwapAndLimitContext() + const [filteredChainId, setFilteredChainId] = useState( + isUserSelectedToken ? chainId : undefined, + ) const prevChainId = usePrevious(chainId) const { formatNumber } = useFormatter() - const showSwapNetworkNotification = useShowSwapNetworkNotification() const activeCurrencyCode = useActiveLocalCurrency() const activeLocale = useActiveLocale() + const recentlySearchedAssets = useAtomValue(recentlySearchedAssetsAtom) + const hideSmallBalances = useHideSmallBalancesSetting() + const hideSpamBalances = useHideSpamTokensSetting() + + const addPopup = useAddPopup() + const removePopup = useRemovePopup() const selectChain = useSelectChain() + const searchHistory = useMemo( + () => + recentlySearchedAssets + .slice(0, 4) + .filter((value) => (filteredChainId ? value.chainId === filteredChainId : true)), + [recentlySearchedAssets, filteredChainId], + ) + const addToken = useAddUserToken() + const userAddedTokens = useAllUserAddedTokens() + const addRecentlySearchedCurrency = useAddRecentlySearchedCurrency() + const handleCurrencySelectTokenSelectorCallback = useCallback( async (currency: Currency) => { if (!multichainUXEnabled) { @@ -49,6 +85,7 @@ export function CurrencySearch({ currencyField, onCurrencySelect, onDismiss }: C onCurrencySelect(currency) setSelectedChainId(currency.chainId) + setFilteredChainId(currency.chainId) setIsUserSelectedToken(true) onDismiss() }, @@ -59,9 +96,19 @@ export function CurrencySearch({ currencyField, onCurrencySelect, onDismiss }: C if ((currentTab !== SwapTab.Swap && currentTab !== SwapTab.Send) || !multichainUXEnabled) { return } - - showSwapNetworkNotification(chainId, prevChainId) - }, [currentTab, chainId, prevChainId, multichainUXEnabled, showSwapNetworkNotification]) + if (chainId && prevChainId && chainId !== prevChainId) { + removePopup(`switchNetwork-${prevChainId}`) + addPopup( + { + type: PopupType.SwitchNetwork, + chainId, + action: currentTab, + }, + `switchNetwork-${chainId}`, + 3000, + ) + } + }, [currentTab, chainId, prevChainId, multichainUXEnabled, addPopup, removePopup]) return ( formatNumber({ input: fromAmount as number, @@ -91,12 +147,56 @@ export function CurrencySearch({ currencyField, onCurrencySelect, onDismiss }: C }) } isSurfaceReady={true} + navigateToBuyOrReceiveWithEmptyWalletCallback={() => null} + useCommonTokensOptionsHook={useCommonTokensOptions} + useFavoriteTokensOptionsHook={() => { + return { + data: [], + loading: false, + } + }} + useFilterCallbacksHook={useFilterCallbacks} + usePopularTokensOptionsHook={usePopularTokensOptions} + usePortfolioTokenOptionsHook={usePortfolioTokenOptions} + useTokenSectionsForEmptySearchHook={() => { + return { + data: [], + loading: false, + } + }} + useTokenSectionsForSearchResultsHook={useTokenSectionsForSearchResults} + useTokenWarningDismissedHook={(currencyId) => { + if (!currencyId) { + return { + tokenWarningDismissed: false, + dismissWarningCallback: () => null, + } + } + const [chainId, address] = currencyId.split('-') + // Hardcode 18 decimals because we only check chainId and address + const token = new Token(parseInt(chainId), address, 18) + + return { + tokenWarningDismissed: !!userAddedTokens.find( + (userToken) => userToken.chainId === token.chainId && userToken.address === token.address, + ), + dismissWarningCallback: () => addToken(token), + } + }} variation={ currencyField === CurrencyField.INPUT ? TokenSelectorVariation.BalancesAndPopular : TokenSelectorVariation.SuggestedAndFavoritesAndPopular } - onClose={onDismiss} + onClose={() => { + setFilteredChainId(null) + onDismiss() + }} + onDismiss={() => null} + onPressAnimation={() => null} + onSelectChain={(chainId) => { + setFilteredChainId(chainId) + }} onSelectCurrency={handleCurrencySelectTokenSelectorCallback} /> diff --git a/apps/web/src/components/Settings/MultipleRoutingOptions.test.tsx b/apps/web/src/components/Settings/MultipleRoutingOptions.test.tsx index 910c202983d..9a236d6e9c9 100644 --- a/apps/web/src/components/Settings/MultipleRoutingOptions.test.tsx +++ b/apps/web/src/components/Settings/MultipleRoutingOptions.test.tsx @@ -72,7 +72,7 @@ describe('Multiple routing options', () => { expect(screen.getByTestId('route-preference-toggle-v3')).toHaveAttribute('aria-selected', 'false') expect(screen.getByTestId('route-preference-toggle-v2')).toHaveAttribute('aria-selected', 'true') expect(screen.getByTestId('route-preference-toggle-UniswapX')).toHaveAttribute('aria-selected', 'true') - expect(screen.getByTestId('route-preference-toggle-v2')).toHaveAttribute('aria-disabled', 'true') + expect(screen.getByTestId('route-preference-toggle-v2')).toHaveStyleRule('pointer-events', 'none') const uniswapXToggle = screen.getByTestId('route-preference-toggle-UniswapX') fireEvent.click(uniswapXToggle) @@ -81,7 +81,7 @@ describe('Multiple routing options', () => { expect(screen.getByTestId('route-preference-toggle-v3')).toHaveAttribute('aria-selected', 'false') expect(screen.getByTestId('route-preference-toggle-v2')).toHaveAttribute('aria-selected', 'true') expect(screen.getByTestId('route-preference-toggle-UniswapX')).toHaveAttribute('aria-selected', 'false') - expect(screen.getByTestId('route-preference-toggle-v2')).toHaveAttribute('aria-disabled', 'true') + expect(screen.getByTestId('route-preference-toggle-v2')).toHaveStyleRule('pointer-events', 'none') }) it('does not render uniswapx toggle when uniswapx is not enabled', async () => { diff --git a/apps/web/src/components/Settings/MultipleRoutingOptions.tsx b/apps/web/src/components/Settings/MultipleRoutingOptions.tsx index edc9d8ba926..944f73e8d59 100644 --- a/apps/web/src/components/Settings/MultipleRoutingOptions.tsx +++ b/apps/web/src/components/Settings/MultipleRoutingOptions.tsx @@ -3,13 +3,13 @@ import Column from 'components/Column' import UniswapXBrandMark from 'components/Logo/UniswapXBrandMark' import QuestionHelper from 'components/QuestionHelper' import Row, { RowBetween } from 'components/Row' +import Toggle from 'components/Toggle' import { isUniswapXSupportedChain } from 'constants/chains' import { atom, useAtom } from 'jotai' import styled from 'lib/styled-components' import { ReactNode, useCallback } from 'react' import { RouterPreference } from 'state/routing/types' import { ExternalLink, ThemedText } from 'theme/components' -import { Switch } from 'ui/src' import { uniswapUrls } from 'uniswap/src/constants/urls' import { Trans, t } from 'uniswap/src/i18n' @@ -106,13 +106,7 @@ function RoutePreferenceToggle({ {text && {text}} {subheading && {subheading}} - + ) } diff --git a/apps/web/src/components/Settings/RouterPreferenceSettings/index.tsx b/apps/web/src/components/Settings/RouterPreferenceSettings/index.tsx index d8e22063608..96b344de572 100644 --- a/apps/web/src/components/Settings/RouterPreferenceSettings/index.tsx +++ b/apps/web/src/components/Settings/RouterPreferenceSettings/index.tsx @@ -1,11 +1,11 @@ import Column from 'components/Column' import UniswapXBrandMark from 'components/Logo/UniswapXBrandMark' import { RowBetween, RowFixed } from 'components/Row' +import Toggle from 'components/Toggle' import styled from 'lib/styled-components' import { RouterPreference } from 'state/routing/types' import { useRouterPreference } from 'state/user/hooks' import { ExternalLink, ThemedText } from 'theme/components' -import { Switch } from 'ui/src' import { Trans } from 'uniswap/src/i18n' const InlineLink = styled(ThemedText.BodySmall)` @@ -35,11 +35,10 @@ export default function RouterPreferenceSettings() { - { + { setRouterPreference(routerPreference === RouterPreference.X ? RouterPreference.API : RouterPreference.X) }} /> diff --git a/apps/web/src/components/Table/Cell.test.tsx b/apps/web/src/components/Table/Cell.test.tsx index 59c8d2eee00..0197ac82294 100644 --- a/apps/web/src/components/Table/Cell.test.tsx +++ b/apps/web/src/components/Table/Cell.test.tsx @@ -1,5 +1,5 @@ +import { render, screen } from '@testing-library/react' import { Cell } from 'components/Table/Cell' -import { render, screen } from 'test-utils/render' describe('Table Cell', () => { it('shows loading bubble', () => { diff --git a/apps/web/src/components/Table/Cell.tsx b/apps/web/src/components/Table/Cell.tsx index ba217c6e50f..5d73c2fc913 100644 --- a/apps/web/src/components/Table/Cell.tsx +++ b/apps/web/src/components/Table/Cell.tsx @@ -1,38 +1,57 @@ import { LoadingBubble } from 'components/Tokens/loading' -import deprecatedStyled from 'lib/styled-components' +import styled from 'lib/styled-components' import { PropsWithChildren } from 'react' -import { Flex, FlexProps } from 'ui/src' -const LoadingDataBubble = deprecatedStyled(LoadingBubble)` +const Container = styled.div<{ + $width?: number + $minWidth?: number + $maxWidth?: number + $justifyContent?: string + $grow?: boolean +}>` + ${({ $width }) => $width && `width: ${$width}px`}; + ${({ $minWidth }) => $minWidth && `min-width: ${$minWidth}px`}; + ${({ $maxWidth }) => $maxWidth && `max-width: ${$maxWidth}px`}; + flex: ${({ $grow }) => ($grow ? '1' : '0')}; + display: flex; + justify-content: ${({ $justifyContent }) => $justifyContent ?? 'flex-end'}; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +` +const LoadingDataBubble = styled(LoadingBubble)` width: 75%; height: 16px; ` export function Cell({ loading, + width, + minWidth, + maxWidth, + justifyContent, + grow, children, testId, - ...rest -}: PropsWithChildren< - { - loading?: boolean - testId?: string - } & Partial ->) { +}: PropsWithChildren<{ + loading?: boolean + width?: number + minWidth?: number + maxWidth?: number + grow?: boolean + justifyContent?: string + testId?: string +}>) { return ( - {loading ? : children} - + ) } diff --git a/apps/web/src/components/Table/Filter.tsx b/apps/web/src/components/Table/Filter.tsx index d2f2076bca0..470a7e34844 100644 --- a/apps/web/src/components/Table/Filter.tsx +++ b/apps/web/src/components/Table/Filter.tsx @@ -1,48 +1,49 @@ +import Column from 'components/Column' +import Row from 'components/Row' import { DropdownIcon } from 'components/Table/icons' import { useScreenSize } from 'hooks/screenSize' import { useOnClickOutside } from 'hooks/useOnClickOutside' -import deprecatedStyled from 'lib/styled-components' +import styled from 'lib/styled-components' import { Portal } from 'nft/components/common/Portal' import { Checkbox } from 'nft/components/layout/Checkbox' -import { RefObject, useCallback, useRef, useState } from 'react' +import { Fragment, useCallback, useRef, useState } from 'react' import { ThemedText } from 'theme/components' -import { Flex, styled } from 'ui/src' +import { Z_INDEX } from 'theme/zIndex' -const StyledDropdownIcon = deprecatedStyled(DropdownIcon)` +const StyledDropdownIcon = styled(DropdownIcon)` position: relative; ` -const FilterDropdown = styled(Flex, { - position: 'absolute', - p: '$padding8', - borderRadius: '$rounded12', - backgroundColor: '$surface2', - gap: '$gap8', - width: 240, - borderWidth: 1, - borderColor: '$surface3', - borderStyle: 'solid', - shadowColor: '$shadow', - opacity: 1, - zIndex: '$modal', - $md: { - position: 'fixed' as any, - bottom: 0, - left: 0, - top: 'unset', - width: '100vw', - }, -}) +const FilterDropdown = styled(Column)<{ isSticky?: boolean }>` + position: absolute; + top: ${({ isSticky }) => (isSticky ? 64 : 42)}px; + padding: 8px; + border-radius: 12px; + background: ${({ theme }) => theme.surface2}; + gap: 8px; + width: 240px; + border-radius: 12px; + border: ${({ theme }) => `1px solid ${theme.surface3}`}; + box-shadow: ${({ theme }) => theme.deprecated_deepShadow}; + opacity: 1 !important; + z-index: ${Z_INDEX.modal}; -const FilterRow = styled(Flex, { - row: true, - py: 10, - px: '$padding8', - justifyContent: 'space-between', - borderRadius: '$rounded8', - hoverStyle: { - backgroundColor: '$surface3', - }, -}) + @media only screen and (max-width: ${({ theme }) => `${theme.breakpoint.sm}px`}) { + position: fixed; + bottom: 0; + left: 0; + top: unset; + width: 100vw; + } +` + +const FilterRow = styled(Row)` + padding: 10px 8px; + justify-content: space-between; + border-radius: 8px; + &:hover { + background: ${({ theme }) => theme.surface3}; + } +` interface FilterProps { allFilters: T[] @@ -50,7 +51,7 @@ interface FilterProps { setFilters: (filter: T[]) => void isOpen: boolean toggleFilterModal: () => void - anchorRef: RefObject + isSticky?: boolean } export function Filter({ @@ -59,7 +60,7 @@ export function Filter({ setFilters, isOpen, toggleFilterModal, - anchorRef, + isSticky, }: FilterProps) { const [hoveredRow, setHoveredRow] = useState(-1) const isScreenSize = useScreenSize() @@ -77,21 +78,19 @@ export function Filter({ }, [activeFilter, setFilters], ) + // Need to put the modal in a Portal when on mobile to show over promo banner + const Wrapper = isMobile ? Portal : Fragment return ( <> - {isOpen && anchorRef.current && ( - - + {isOpen && ( + + {allFilters.map((filter, index) => ( { + onClick={(e) => { e.stopPropagation() e.preventDefault() handleFilterOptionClick(filter) @@ -104,7 +103,7 @@ export function Filter({ ))} - + )} ) diff --git a/apps/web/src/components/Table/__snapshots__/styled.test.tsx.snap b/apps/web/src/components/Table/__snapshots__/styled.test.tsx.snap index 15e6723abc3..9300ac70180 100644 --- a/apps/web/src/components/Table/__snapshots__/styled.test.tsx.snap +++ b/apps/web/src/components/Table/__snapshots__/styled.test.tsx.snap @@ -2,7 +2,40 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` - .c2 { + .c1 { + box-sizing: border-box; + margin: 0; + min-width: 0; + max-width: 68px; +} + +.c2 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 4px; +} + +.c7 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c4 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -13,19 +46,19 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` left: 0; } -.c2 img { +.c4 img { width: 16px; height: 16px; border-radius: 50%; } -.c3 { +.c5 { width: 8px; height: 16px; border-radius: 50%; } -.c4 { +.c6 { background-color: #F9F9F9; border-radius: 2px; width: 6px; @@ -48,7 +81,7 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` justify-content: center; } -.c1 { +.c3 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -81,6 +114,12 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` opacity: 0.4; } +.c8 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +
Polygon logo
- USDC - +
@@ -144,7 +182,40 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` exports[`TokenLinkCell renders known token on mainnet 1`] = ` - .c2 { + .c1 { + box-sizing: border-box; + margin: 0; + min-width: 0; + max-width: 68px; +} + +.c2 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 4px; +} + +.c6 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c4 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -155,19 +226,19 @@ exports[`TokenLinkCell renders known token on mainnet 1`] = ` left: 0; } -.c2 img { +.c4 img { width: 16px; height: 16px; border-radius: 50%; } -.c3 { +.c5 { width: 8px; height: 16px; border-radius: 50%; } -.c1 { +.c3 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -200,6 +271,12 @@ exports[`TokenLinkCell renders known token on mainnet 1`] = ` opacity: 0.4; } +.c7 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +
- USDC - +
@@ -251,7 +327,40 @@ exports[`TokenLinkCell renders known token on mainnet 1`] = ` exports[`TokenLinkCell renders unknown token 1`] = ` - .c2 { + .c1 { + box-sizing: border-box; + margin: 0; + min-width: 0; + max-width: 68px; +} + +.c2 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 4px; +} + +.c6 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c4 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -262,19 +371,19 @@ exports[`TokenLinkCell renders unknown token 1`] = ` left: 0; } -.c2 img { +.c4 img { width: 16px; height: 16px; border-radius: 50%; } -.c3 { +.c5 { width: 8px; height: 16px; border-radius: 50%; } -.c1 { +.c3 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -307,6 +416,12 @@ exports[`TokenLinkCell renders unknown token 1`] = ` opacity: 0.4; } +.c7 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +
- UNKNOWN - +
diff --git a/apps/web/src/components/Table/index.tsx b/apps/web/src/components/Table/index.tsx index 6638d31b4fc..4666a9b1ac1 100644 --- a/apps/web/src/components/Table/index.tsx +++ b/apps/web/src/components/Table/index.tsx @@ -45,7 +45,7 @@ function TableBody({ }: { table: TanstackTable loading?: boolean - error?: ApolloError | boolean + error?: ApolloError }) { const analyticsContext = useTrace() @@ -131,7 +131,7 @@ export function Table({ columns: ColumnDef[] data: Data[] loading?: boolean - error?: ApolloError | boolean + error?: ApolloError loadMore?: ({ onComplete }: { onComplete?: () => void }) => void maxWidth?: number maxHeight?: number @@ -209,10 +209,10 @@ export function Table({ return (
- + - + {table.getFlatHeaders().map((header) => ( {flexRender(header.column.columnDef.header, header.getContext())} @@ -222,7 +222,7 @@ export function Table({ {showReturn && ( - + { @@ -242,18 +242,16 @@ export function Table({ )} - + - {loadingMore && ( - - - - - - - )} + + + + + +
diff --git a/apps/web/src/components/Table/styled.tsx b/apps/web/src/components/Table/styled.tsx index db03fbb3ddc..399b69a748f 100644 --- a/apps/web/src/components/Table/styled.tsx +++ b/apps/web/src/components/Table/styled.tsx @@ -1,18 +1,19 @@ import { PortfolioLogo } from 'components/AccountDrawer/MiniPortfolio/PortfolioLogo' import { ButtonLight } from 'components/Button' +import Column from 'components/Column' +import { HideScrollBarStyles } from 'components/Common' +import Row from 'components/Row' import { useAbbreviatedTimeString } from 'components/Table/utils' import { MouseoverTooltip, TooltipSize } from 'components/Tooltip' import { NATIVE_CHAIN_ID } from 'constants/tokens' import { OrderDirection, getTokenDetailsURL, supportedChainIdFromGQLChain, unwrapToken } from 'graphql/data/util' import { useCurrency } from 'hooks/Tokens' import { useActiveLocale } from 'hooks/useActiveLocale' -import deprecatedStyled from 'lib/styled-components' -import { PropsWithChildren } from 'react' +import styled, { css } from 'lib/styled-components' import { ArrowDown, CornerLeftUp, ExternalLink as ExternalLinkIcon } from 'react-feather' import { Link } from 'react-router-dom' -import { ClickableStyle, ClickableTamaguiStyle, EllipsisTamaguiStyle, ThemedText } from 'theme/components' +import { ClickableStyle, EllipsisStyle, ExternalLink, ThemedText } from 'theme/components' import { Z_INDEX } from 'theme/zIndex' -import { Anchor, Flex, Text, View, styled } from 'ui/src' import { Token } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { useTranslation } from 'uniswap/src/i18n' import { UniverseChainId } from 'uniswap/src/types/chains' @@ -20,227 +21,177 @@ import { UniverseChainId } from 'uniswap/src/types/chains' export const SHOW_RETURN_TO_TOP_OFFSET = 500 export const LOAD_MORE_BOTTOM_OFFSET = 50 -export const TableContainer = styled(Flex, { - centered: true, - m: '0 auto 24px auto', - className: 'scrollbar-hidden', -}) +export const TableContainer = styled(Column)<{ $maxWidth?: number; $maxHeight?: number }>` + max-width: ${({ $maxWidth }) => $maxWidth}px; + max-height: ${({ $maxHeight }) => $maxHeight}px; + // Center layout + justify-content: center; + align-items: center; + margin: 0px auto 24px auto; +` +const StickyStyles = css<{ $top: number }>` + position: sticky; + position: -webkit-sticky; + top: ${({ $top }) => $top}px; + z-index: ${Z_INDEX.under_dropdown}; -export const TableHead = (props: PropsWithChildren<{ $isSticky: boolean; $top: number }>): JSX.Element => { - if (props.$isSticky) { - return ( - - {props.$isSticky &&
} - {props.children} - - ) - } else { - return ( - - {props.children} - - ) + :before { + content: ''; + height: 12px; } -} - -export const TableBodyContainer = styled(View, { - width: '100%', - position: 'relative', - className: 'scrollbar-hidden', - justifyContent: 'flex-start', - borderColor: '$surface3', - borderStyle: 'solid', - borderWidth: 1, - borderTopWidth: 0, - borderBottomRightRadius: '$rounded20', - borderBottomLeftRadius: '$rounded20', - '$platform-web': { - overscrollBehaviorX: 'none', - overflowX: 'auto', - overflowY: 'scroll', - }, -}) - -export const ReturnButton = deprecatedStyled(ButtonLight)` +` +export const TableHead = styled.div<{ $isSticky?: boolean; $top: number }>` + width: 100%; + position: relative; + ${({ $isSticky }) => ($isSticky ? StickyStyles : '')} + // Place header at bottom of container (top of container used to add distance from nav / hide rows) + display: flex; + flex-direction: column; + justify-content: flex-end; + // Solid background that matches surface, in order to hide rows as they scroll behind header + background: ${({ theme }) => theme.surface1}; +` +export const TableBodyContainer = styled(Column)` + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid ${({ theme }) => theme.surface3}; + border-bottom: 1px solid ${({ theme }) => theme.surface3}; + border-left: 1px solid ${({ theme }) => theme.surface3}; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + ${HideScrollBarStyles} +` +export const ReturnButton = styled(ButtonLight)` font-size: 16px; border-radius: 900px; width: fit-content; margin-top: 8px; ` - -export const ReturnIcon = deprecatedStyled(CornerLeftUp)` +export const ReturnIcon = styled(CornerLeftUp)` width: 16px; height: 16px; margin-right: 8px; ` +export const ReturnButtonContainer = styled(Row)<{ $top?: number }>` + position: absolute; + justify-content: center; + top: ${({ $top }) => $top}px; + left: 50%; + transform: translateX(-50%); + width: max-content; +` +export const LoadingIndicatorContainer = styled(Row)<{ show: boolean }>` + position: sticky; + justify-content: center; + margin-top: -48px; + visibility: ${({ show }) => (show ? 'visible' : 'hidden')}; +` +export const LoadingIndicator = styled(Row)` + background: ${({ theme }) => theme.accent2}; + border-radius: 8px; + width: fit-content; + padding: 8px; + color: ${({ theme }) => theme.accent1}; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: ${Z_INDEX.under_dropdown}; +` -export const ReturnButtonContainer = styled(Flex, { - position: 'absolute', - justifyContent: 'center', - left: '50%', - transform: 'translateX(-50%)', - width: 'max-content', -}) - -export const LoadingIndicatorContainer = styled(Flex, { - row: true, - alignItems: 'center', - justifyContent: 'center', - mt: -48, - '$platform-web': { - position: 'sticky', - }, -}) - -export const LoadingIndicator = styled(Flex, { - row: true, - backgroundColor: '$accent2', - borderRadius: '$rounded8', - width: 'fit-content', - p: '$padding8', - gap: '$gap8', - height: 34, - zIndex: Z_INDEX.under_dropdown, -}) - -const TableRow = styled(Flex, { - row: true, - alignItems: 'center', - px: '$padding12', - width: 'fit-content', - minWidth: '100%', - minHeight: 64, -}) - -export const DataRow = styled(TableRow, { - hoverStyle: { - backgroundColor: '$surface3', - }, -}) - -export const NoDataFoundTableRow = styled(TableRow, { - justifyContent: 'center', -}) +const TableRow = styled(Row)` + padding: 0px 12px; + width: fit-content; + min-width: 100%; + display: flex; + min-height: 64px; +` +export const DataRow = styled(TableRow)` + @media not all and (hover: none) { + :hover { + background: ${({ theme }) => theme.surface3}; + } + } +` +export const NoDataFoundTableRow = styled(TableRow)` + justify-content: center; +` -export const HeaderRow = styled(TableRow, { - borderWidth: 1, - borderStyle: 'solid', - borderColor: '$surface3', - borderTopRightRadius: '$rounded20', - borderTopLeftRadius: '$rounded20', - width: 'unset', - minHeight: 52, - backgroundColor: '$surface2', - scrollbarWidth: 'none', - className: 'scrollbar-hidden', +export const HeaderRow = styled(TableRow)<{ $dimmed?: boolean }>` + border: 1px solid ${({ theme }) => theme.surface3}; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: ${({ theme }) => theme.surface2}; + ${HideScrollBarStyles} + overscroll-behavior: none; - '$platform-web': { - overscrollBehavior: 'none', - overflow: 'auto', - }, - variants: { - dimmed: { - true: { - opacity: 0.4, - }, - }, - } as const, -}) + ${({ $dimmed }) => $dimmed && 'opacity: 0.4;'} +` +export const CellContainer = styled.div` + display: flex; + flex-grow: 1; -export const CellContainer = styled(Flex, { - grow: true, - className: 'first-child-flex-grow-0 last-child-justify-end', -}) + &:last-child { + justify-content: flex-end; + } -export const StyledExternalLink = styled(Anchor, { - textDecorationLine: 'none', - ...ClickableTamaguiStyle, - color: '$neutral1', - target: '_blank', - rel: 'noopener noreferrer', -}) -const StyledInternalLink = deprecatedStyled(Link)` + &:first-child { + flex-grow: 0; + } +` +export const StyledExternalLink = styled(ExternalLink)` + text-decoration: none; + ${ClickableStyle} + color: ${({ theme }) => theme.neutral1}; +` +const StyledInternalLink = styled(Link)` text-decoration: none; ${ClickableStyle} color: ${({ theme }) => theme.neutral1}; ` -export const TableRowLink = deprecatedStyled(Link)` +export const TableRowLink = styled(Link)` color: none; text-decoration: none; cursor: pointer; ` -export const ClickableHeaderRow = styled(Flex, { - row: true, - alignItems: 'center', - justifyContent: 'flex-end', - width: '100%', - gap: '$gap4', - - ...ClickableTamaguiStyle, -}) - -export const HeaderArrow = deprecatedStyled(ArrowDown)<{ direction: OrderDirection }>` +export const ClickableHeaderRow = styled(Row)<{ $justify?: string }>` + justify-content: ${({ $justify }) => $justify ?? 'flex-end'}; + cursor: pointer; + width: 100%; + gap: 4px; + ${ClickableStyle} +` +export const HeaderArrow = styled(ArrowDown)<{ direction: OrderDirection }>` height: 16px; width: 16px; color: ${({ theme }) => theme.neutral1}; transform: ${({ direction }) => (direction === 'asc' ? 'rotate(180deg)' : 'rotate(0deg)')}; ` +export const HeaderSortText = styled(ThemedText.BodySecondary)<{ $active?: boolean }>` + ${({ $active, theme }) => $active && `color: ${theme.neutral1};`} +` -export const HeaderSortText = styled(Text, { - variant: 'body2', - color: '$neutral2', - - variants: { - active: { - true: { - color: '$neutral1', - }, - }, - } as const, -}) - -export const FilterHeaderRow = styled(Flex, { - row: true, - alignItems: 'center', - userSelect: 'none', - gap: '$gap4', - animation: 'fast', - - ...ClickableTamaguiStyle, - - variants: { - clickable: { - true: ClickableTamaguiStyle, - }, - } as const, -}) - -const StyledTimestampRow = deprecatedStyled(StyledExternalLink)` +export const FilterHeaderRow = styled(Row)<{ modalOpen?: boolean }>` + ${({ modalOpen }) => !modalOpen && ClickableStyle} + cursor: pointer; + user-select: none; + gap: 4px; +` +const StyledTimestampRow = styled(StyledExternalLink)` display: flex; flex-direction: row; align-items: center; gap: 8px; width: 100%; ` -const StyledExternalLinkIcon = deprecatedStyled(ExternalLinkIcon)` +const StyledExternalLinkIcon = styled(ExternalLinkIcon)` display: none; height: 16px; width: 16px; @@ -285,12 +236,9 @@ export const TimestampCell = ({ timestamp, link }: { timestamp: number; link: st ) } -const TokenSymbolText = styled(Text, { - variant: 'body2', - color: '$neutral1', - ...EllipsisTamaguiStyle, -}) - +const TokenSymbolText = styled(ThemedText.BodyPrimary)` + ${EllipsisStyle} +` /** * Given a token displays the Token's Logo and Symbol with a link to its TDP * @param token @@ -309,7 +257,7 @@ export const TokenLinkCell = ({ token }: { token: Token }) => { chain: token.chain, })} > - + { currencies={isNative ? [nativeCurrency] : undefined} /> {unwrappedToken?.symbol ?? t('common.unknown').toUpperCase()} - + ) } diff --git a/apps/web/src/components/Toggle/index.tsx b/apps/web/src/components/Toggle/index.tsx new file mode 100644 index 00000000000..527c8e55261 --- /dev/null +++ b/apps/web/src/components/Toggle/index.tsx @@ -0,0 +1,98 @@ +import styled, { keyframes } from 'lib/styled-components' +import { darken } from 'polished' +import { useState } from 'react' + +const Wrapper = styled.button<{ isActive?: boolean; activeElement?: boolean; $disabled?: boolean }>` + align-items: center; + background: ${({ isActive, theme }) => (isActive ? theme.accent2 : 'transparent')}; + border: ${({ theme, isActive }) => (isActive ? '1px solid transparent' : `1px solid ${theme.surface3}`)}; + border-radius: 20px; + cursor: pointer; + display: flex; + outline: none; + padding: 4px; + width: fit-content; + pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')}; + ${({ $disabled }) => $disabled && 'opacity: 0.6;'} +` + +const turnOnToggle = keyframes` + from { + margin-left: 0em; + margin-right: 2.2em; + } + to { + margin-left: 2.2em; + margin-right: 0em; + } +` + +const turnOffToggle = keyframes` + from { + margin-left: 2.2em; + margin-right: 0em; + } + to { + margin-left: 0em; + margin-right: 2.2em; + } +` + +const ToggleElementHoverStyle = (hasBgColor: boolean, theme: any, isActive?: boolean) => + hasBgColor + ? { + opacity: '0.8', + } + : { + background: isActive ? darken(0.05, theme.accent1) : darken(0.05, theme.surface3), + color: isActive ? theme.white : theme.neutral3, + } + +const ToggleElement = styled.span<{ isActive?: boolean; bgColor?: string; isInitialToggleLoad?: boolean }>` + animation: 0.1s + ${({ isActive, isInitialToggleLoad }) => (isInitialToggleLoad ? 'none' : isActive ? turnOnToggle : turnOffToggle)} + ease-in; + background: ${({ theme, bgColor, isActive }) => + isActive ? bgColor ?? theme.accent1 : bgColor ? theme.surface3 : theme.neutral3}; + border-radius: 50%; + height: 24px; + :hover { + ${({ bgColor, theme, isActive }) => ToggleElementHoverStyle(!!bgColor, theme, isActive)} + } + margin-left: ${({ isActive }) => isActive && '2.2em'}; + margin-right: ${({ isActive }) => !isActive && '2.2em'}; + width: 24px; +` + +interface ToggleProps { + id?: string + bgColor?: string + isActive: boolean + disabled?: boolean + toggle: () => void +} + +export default function Toggle({ id, bgColor, isActive, disabled, toggle }: ToggleProps) { + const [isInitialToggleLoad, setIsInitialToggleLoad] = useState(true) + + const switchToggle = () => { + toggle() + if (isInitialToggleLoad) { + setIsInitialToggleLoad(false) + } + } + + return ( + + + + ) +} diff --git a/apps/web/src/components/TokenSafety/index.tsx b/apps/web/src/components/TokenSafety/index.tsx index 9ca98bd23f9..e4f95c48fc2 100644 --- a/apps/web/src/components/TokenSafety/index.tsx +++ b/apps/web/src/components/TokenSafety/index.tsx @@ -14,8 +14,8 @@ import { import styled from 'lib/styled-components' import { ExternalLink as LinkIconFeather } from 'react-feather' import { Text } from 'rebass' +import { useAddUserToken } from 'state/user/hooks' import { ButtonText, CopyLinkIcon, ExternalLink } from 'theme/components' -import { useDismissedTokenWarnings } from 'uniswap/src/features/tokens/slice/hooks' import { Trans } from 'uniswap/src/i18n' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' @@ -234,12 +234,15 @@ export default function TokenSafety({ token0, token1, onContinue, onCancel, onBl displayWarning = token1Warning } - // dismiss token warnings on acknowledgement - const { onDismissTokenWarning: onDismissToken0 } = useDismissedTokenWarnings(token0) - const { onDismissTokenWarning: onDismissToken1 } = useDismissedTokenWarnings(token1) + // If a warning is acknowledged, import these tokens + const addToken = useAddUserToken() const acknowledge = () => { - onDismissToken0() - onDismissToken1() + if (token0) { + addToken(token0) + } + if (token1) { + addToken(token1) + } onContinue() } diff --git a/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx b/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx index 5494a45b981..0eebc47f627 100644 --- a/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx @@ -1,21 +1,22 @@ +import Row from 'components/Row' import { TokenDetailsPoolsTable } from 'components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable' import { TransactionsTable } from 'components/Tokens/TokenDetails/tables/TransactionsTable' +import styled from 'lib/styled-components' import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { useState } from 'react' -import { ClickableTamaguiStyle } from 'theme/components' -import { Flex, styled, Text } from 'ui/src' +import { ClickableStyle, ThemedText } from 'theme/components' import { Trans } from 'uniswap/src/i18n' -const Container = styled(Flex, { - width: '100%', -}) - -const Tab = styled(Text, { - color: '$neutral1', - variant: 'heading3', - ...ClickableTamaguiStyle, -}) - +const Container = styled.div` + width: 100%; + display: flex; + flex-direction: column; +` +const Tab = styled(ThemedText.HeadlineMedium)<{ isActive?: boolean }>` + cursor: pointer; + color: ${({ isActive, theme }) => (isActive ? theme.neutral1 : theme.neutral2)}; + ${ClickableStyle}; +` enum ActivityTab { Txs, Pools, @@ -30,20 +31,14 @@ export function ActivitySection() { } return ( - - setActivityInView(ActivityTab.Txs)} - > + + setActivityInView(ActivityTab.Txs)}> - setActivityInView(ActivityTab.Pools)} - > + setActivityInView(ActivityTab.Pools)}> - + {activityInView === ActivityTab.Txs && } {activityInView === ActivityTab.Pools && ( diff --git a/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx b/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx index 92432d66ae0..5b3a12aa191 100644 --- a/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/ChartSection/index.tsx @@ -22,9 +22,9 @@ import { } from 'components/Tokens/TokenTable/TimeSelector' import { TimePeriod, toHistoryDuration } from 'graphql/data/util' import { useAtomValue } from 'jotai/utils' +import styled from 'lib/styled-components' import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { useMemo, useState } from 'react' -import { Flex, styled } from 'ui/src' import { Chain } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { Trans } from 'uniswap/src/i18n' @@ -36,17 +36,34 @@ export const DEFAULT_PILL_TIME_SELECTOR_OPTIONS = ORDERED_TIMES.map((time: TimeP value: DISPLAYS[time], })) as PillMultiToggleOption[] -export const ChartActionsContainer = styled(Flex, { - flexDirection: 'row-reverse', - width: '100%', - justifyContent: 'space-between', - alignItems: 'center', - mt: 12, - $md: { - flexDirection: 'column', - gap: 16, - }, -}) +export const ChartActionsContainer = styled.div` + display: flex; + flex-direction: row-reverse; + width: 100%; + justify-content: space-between; + align-items: center; + margin-top: 12px; + + @media only screen and (max-width: ${({ theme }) => theme.breakpoint.sm}px) { + flex-direction: column; + gap: 16px; + } +` +const TimePeriodSelectorContainer = styled.div` + @media only screen and (max-width: ${({ theme }) => theme.breakpoint.sm}px) { + width: 100%; + } +` + +const ChartTypeSelectorContainer = styled.div` + display: flex; + gap: 8px; + @media only screen and (max-width: ${({ theme }) => theme.breakpoint.sm}px) { + width: 100%; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); + } +` /** Represents a variety of query result shapes, discriminated via additional `chartType` field. */ type ActiveQuery = @@ -161,15 +178,7 @@ function ChartControls() { return ( - + {activeQuery.chartType === ChartType.PRICE && (
)} - { - setChartType(c) - if (c === ChartType.PRICE) { - setPriceChartType(PriceChartType.LINE) - } - }} - /> -
- +
+ { + setChartType(c) + if (c === ChartType.PRICE) { + setPriceChartType(PriceChartType.LINE) + } + }} + /> +
+ + -
+
) } diff --git a/apps/web/src/components/Tokens/TokenDetails/Skeleton.tsx b/apps/web/src/components/Tokens/TokenDetails/Skeleton.tsx index 6ee0ffbd0f8..8c73d332f4e 100644 --- a/apps/web/src/components/Tokens/TokenDetails/Skeleton.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/Skeleton.tsx @@ -2,6 +2,7 @@ import { Currency } from '@uniswap/sdk-core' import { BreadcrumbNavContainer, BreadcrumbNavLink } from 'components/BreadcrumbNav' import { ChartSkeleton } from 'components/Charts/LoadingState' import { ChartType } from 'components/Charts/utils' +import Row from 'components/Row' import { AboutContainer, AboutHeader } from 'components/Tokens/TokenDetails/About' import { TDP_CHART_HEIGHT_PX } from 'components/Tokens/TokenDetails/ChartSection' import { StatPair, StatWrapper, StatsWrapper } from 'components/Tokens/TokenDetails/StatsSection' @@ -12,186 +13,168 @@ import { useChainFromUrlParam } from 'constants/chains' import { NATIVE_CHAIN_ID } from 'constants/tokens' import { getSupportedGraphQlChain } from 'graphql/data/util' import { useCurrency } from 'hooks/Tokens' -import deprecatedStyled from 'lib/styled-components' +import styled, { css } from 'lib/styled-components' import { ReactNode } from 'react' import { ChevronRight } from 'react-feather' import { useParams } from 'react-router-dom' -import { ClickableTamaguiStyle } from 'theme/components' +import { BREAKPOINTS } from 'theme' +import { ClickableStyle } from 'theme/components' +import { textFadeIn } from 'theme/styles' import { capitalize } from 'tsafe' -import { Anchor, Flex, Text, TextProps, styled } from 'ui/src' import { Trans } from 'uniswap/src/i18n' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' const SWAP_COMPONENT_WIDTH = 360 -export const TokenDetailsLayout = styled(Flex, { - row: true, - justifyContent: 'center', - width: '100%', - gap: 40, - py: '$spacing48', - px: '$padding20', - - $lg: { - pt: 0, - px: '$padding16', - pb: 52, - }, - $xl: { - flexDirection: 'column', - alignItems: 'center', - }, - $xxl: { - gap: 60, - }, -}) - -export const LeftPanel = styled(Flex, { - maxWidth: 780, - overflow: 'hidden', - width: '100%', - flexGrow: 1, - flexShrink: 1, -}) - -export const RightPanel = styled(Flex, { - pt: 53, - gap: 40, - width: SWAP_COMPONENT_WIDTH, +export const TokenDetailsLayout = styled.div` + display: flex; + padding: 0 16px 52px; + justify-content: center; + width: 100%; + gap: 40px; - $xl: { - width: '100%', - maxWidth: 780, - }, -}) + @media screen and (min-width: ${({ theme }) => theme.breakpoint.md}px) { + padding: 48px 20px; + } + @media screen and (max-width: ${({ theme }) => theme.breakpoint.lg}px) { + flex-direction: column; + align-items: center; + } + @media screen and (min-width: ${({ theme }) => theme.breakpoint.xl}px) { + gap: 60px; + } +` -export const TokenInfoContainer = styled(Flex, { - row: true, - justifyContent: 'space-between', - alignItems: 'center', - gap: '$gap20', - pt: '$padding8', - mb: '$spacing20', - animation: 'quick', - zIndex: '$default', -}) +export const LeftPanel = styled.div` + flex: 1; + max-width: 780px; + overflow: hidden; + width: 100%; +` +export const RightPanel = styled.div` + display: flex; + padding-top: 53px; + flex-direction: column; + gap: 40px; + width: ${SWAP_COMPONENT_WIDTH}px; -export const TokenNameCell = styled(Flex, { - row: true, - gap: '$gap12', - alignItems: 'center', - pt: '$spacing4', - minWidth: 32, - $md: { - flexDirection: 'column', - alignItems: 'flex-start', - }, -}) + @media screen and (max-width: ${({ theme }) => theme.breakpoint.lg}px) { + width: 100%; + max-width: 780px; + } +` +export const TokenInfoContainer = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 8px; + margin-bottom: 20px; + gap: 20px; + ${textFadeIn}; + animation-duration: ${({ theme }) => theme.transition.duration.medium}; +` +export const TokenNameCell = styled.div` + display: flex; + gap: 12px; + font-size: 20px; + line-height: 28px; + align-items: center; + padding-top: 4px; + min-width: 32px; + @media screen and (max-width: ${({ theme }) => theme.breakpoint.sm}px) { + flex-direction: column; + align-items: flex-start; + } +` /* Loading state bubbles */ -const DetailBubble = deprecatedStyled(LoadingBubble)` +const DetailBubble = styled(LoadingBubble)` height: 16px; width: 180px; ` - -const SquaredBubble = deprecatedStyled(DetailBubble)` +const SquaredBubble = styled(DetailBubble)` height: 32px; border-radius: 8px; ` - -const NavBubble = deprecatedStyled(DetailBubble)` +const NavBubble = styled(DetailBubble)` width: 169px; ` - -const TokenLogoBubble = deprecatedStyled(DetailBubble)` +const TokenLogoBubble = styled(DetailBubble)` width: 32px; height: 32px; border-radius: 50%; ` -const TitleBubble = deprecatedStyled(DetailBubble)` +const TitleBubble = styled(DetailBubble)` height: 36px; width: 136px; ` -const SectionBubble = deprecatedStyled(SquaredBubble)` +const SectionBubble = styled(SquaredBubble)` width: 120px; ` -const StatTitleBubble = deprecatedStyled(DetailBubble)` +const StatTitleBubble = styled(DetailBubble)` width: 80px; margin-bottom: 4px; ` - -const StatBubble = deprecatedStyled(SquaredBubble)` +const StatBubble = styled(SquaredBubble)` width: 116px; ` -const WideBubble = deprecatedStyled(DetailBubble)` +const WideBubble = styled(DetailBubble)` margin-bottom: 6px; width: 100%; ` -const ThinTitleBubble = deprecatedStyled(WideBubble)` +const ThinTitleBubble = styled(WideBubble)` width: 120px; ` -const HalfWideBubble = deprecatedStyled(WideBubble)` +const HalfWideBubble = styled(WideBubble)` width: 50%; ` -const StatsLoadingContainer = styled(Flex, { - row: true, - flexWrap: 'wrap', - width: '100%', -}) +const StatsLoadingContainer = styled.div` + width: 100%; + display: flex; + flex-wrap: wrap; +` + +const ExtraDetailsContainer = styled.div` + padding-top: 24px; +` -const ExtraDetailsContainer = styled(Flex, { - row: true, - pt: '$spacing24', -}) +const Space = styled.div<{ heightSize: number }>` + height: ${({ heightSize }) => `${heightSize}px`}; +` -const loadingFooterTextStyle = { - color: '$neutral3', - fontSize: 12, - fontWeight: '500', - lineHeight: 16, - '$platform-web': { - textDecoration: 'none', - }, -} satisfies TextProps +const loadingFooterTextCss = css` + color: ${({ theme }) => theme.neutral3}; + font-size: 12px; + font-weight: 500; + line-height: 16px; + text-decoration: none; +` -const LoadingFooterHeaderContainer = styled(Flex, { - row: true, - alignItems: 'center', - pt: '$padding16', - pr: 90, - pb: '$padding8', - pl: 0, - bottom: 0, - right: 0, - justifyContent: 'flex-end', - ...loadingFooterTextStyle, +const LoadingFooterHeaderContainer = styled(Row)` + align-items: center; + ${loadingFooterTextCss} - '$platform-web': { - position: 'fixed', - }, - $lg: { - p: 'unset', - position: 'unset', - bottom: 'unset', - right: 'unset', - justifyContent: 'unset', - }, -}) + @media screen and (min-width: ${BREAKPOINTS.md}px) { + padding: 16px 90px 8px 0; + position: fixed; + bottom: 0; + right: 0; + justify-content: flex-end; + } +` -const LoadingFooterHeader = styled(Text, { - variant: 'heading1', - ...loadingFooterTextStyle, -}) +const LoadingFooterHeader = styled.h1` + ${loadingFooterTextCss} +` -const LoadingFooterLink = styled(Anchor, { - fontFamily: '$body', - ...loadingFooterTextStyle, - ...ClickableTamaguiStyle, -}) +const LoadingFooterLink = styled.a` + ${loadingFooterTextCss} + ${ClickableStyle} +` // exported for testing export function getLoadingTitle( @@ -291,7 +274,7 @@ function TokenDetailsSkeleton() { - +
diff --git a/apps/web/src/components/Tokens/TokenDetails/TokenDescription.test.tsx b/apps/web/src/components/Tokens/TokenDetails/TokenDescription.test.tsx index 361c6ca6fc2..09b3ced1ed2 100644 --- a/apps/web/src/components/Tokens/TokenDetails/TokenDescription.test.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/TokenDescription.test.tsx @@ -50,12 +50,12 @@ describe('TokenDescription', () => { const truncatedDescription = screen.getByTestId('token-description-truncated') const fullDescription = screen.getByTestId('token-description-full') - expect(truncatedDescription).toHaveClass('_display-inline') - expect(fullDescription).toHaveClass('_display-none') + expect(truncatedDescription).toHaveStyleRule('display', 'inline') + expect(fullDescription).toHaveStyleRule('display', 'none') await act(() => userEvent.click(screen.getByText('Show more'))) - expect(truncatedDescription).toHaveClass('_display-none') - expect(fullDescription).toHaveClass('_display-inline') + expect(truncatedDescription).toHaveStyleRule('display', 'none') + expect(fullDescription).toHaveStyleRule('display', 'inline') expect(screen.getByText('Hide')).toBeVisible() }) diff --git a/apps/web/src/components/Tokens/TokenDetails/TokenDescription.tsx b/apps/web/src/components/Tokens/TokenDetails/TokenDescription.tsx index c8c2b774ed9..33295772833 100644 --- a/apps/web/src/components/Tokens/TokenDetails/TokenDescription.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/TokenDescription.tsx @@ -1,82 +1,73 @@ +import Column from 'components/Column' import { EtherscanLogo } from 'components/Icons/Etherscan' import { Globe } from 'components/Icons/Globe' import { TwitterXLogo } from 'components/Icons/TwitterX' +import Row from 'components/Row' import { FOTTooltipContent } from 'components/swap/SwapLineItem' import { NoInfoAvailable, truncateDescription, TruncateDescriptionButton } from 'components/Tokens/TokenDetails/shared' import Tooltip, { MouseoverTooltip, TooltipSize } from 'components/Tooltip' import useCopyClipboard from 'hooks/useCopyClipboard' import { useSwapTaxes } from 'hooks/useSwapTaxes' -import { useTheme } from 'lib/styled-components' +import styled, { useTheme } from 'lib/styled-components' import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { useCallback, useReducer } from 'react' import { Copy } from 'react-feather' -import { ClickableTamaguiStyle, EllipsisTamaguiStyle, ExternalLink, ThemedText } from 'theme/components' -import { Flex, Paragraph, styled, Text } from 'ui/src' +import { ClickableStyle, EllipsisStyle, ExternalLink, ThemedText } from 'theme/components' import { t, Trans } from 'uniswap/src/i18n' import { UniverseChainId } from 'uniswap/src/types/chains' import { shortenAddress } from 'utilities/src/addresses' import { useFormatter } from 'utils/formatNumbers' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -const TokenInfoSection = styled(Flex, { - gap: '$gap16', - width: '100%', - $xl: { - gap: 24, - }, -}) +const TokenInfoSection = styled(Column)` + gap: 16px; + width: 100%; -const InfoSectionHeader = styled(Text, { - variant: 'subheading1', -}) + @media screen and (max-width: ${({ theme }) => theme.breakpoint.lg}px) { + gap: 24px; + } +` + +const InfoSectionHeader = styled(ThemedText.HeadlineSmall)` + @media screen and (max-width: ${({ theme }) => theme.breakpoint.lg}px) { + font-size: 28px !important; + line-height: 36px !important; + } +` -const TokenNameRow = styled(Flex, { - row: true, - gap: '$gap8', - width: '100%', -}) +const TokenNameRow = styled(Row)` + gap: 8px; + width: 100%; +` -const TokenButtonRow = styled(TokenNameRow, { - flexWrap: 'wrap', -}) +const TokenButtonRow = styled(TokenNameRow)` + flex-wrap: wrap; +` -const TokenInfoButton = styled(Text, { - variant: 'buttonLabel3', - display: 'flex', - flexDirection: 'row', - gap: '$gap8', - py: '$padding8', - px: '$padding12', - borderRadius: '$rounded20', - backgroundColor: '$surface2', - width: 'max-content', - ...ClickableTamaguiStyle, - color: '$neutral1', -}) +const TokenInfoButton = styled(Row)` + gap: 8px; + padding: 8px 12px; + border-radius: 20px; + color: ${({ theme }) => theme.neutral1}; + background-color: ${({ theme }) => theme.surface2}; + font-size: 14px; + font-weight: 535; + line-height: 16px; + width: max-content; + ${ClickableStyle} +` -const TokenDescriptionContainer = styled(Text, { - variant: 'body1', - color: '$neutral1', - maxWidth: '100%', - maxHeight: 'fit-content', - ...EllipsisTamaguiStyle, - whiteSpace: 'pre-wrap', - lineHeight: 24, -}) +const TokenDescriptionContainer = styled(ThemedText.BodyPrimary)` + ${EllipsisStyle} + max-width: 100%; + // max-height: fit-content; + line-height: 24px; + white-space: pre-wrap; +` -const DescriptionVisibilityWrapper = styled(Paragraph, { - fontWeight: '$book', - variants: { - visible: { - true: { - display: 'inline', - }, - false: { - display: 'none', - }, - }, - } as const, -}) +const DescriptionVisibilityWrapper = styled.p<{ $visible: boolean }>` + display: ${({ $visible }) => ($visible ? 'inline' : 'none')}; +` const TRUNCATE_CHARACTER_COUNT = 200 @@ -117,7 +108,7 @@ export function TokenDescription() { {!currency.isNative && ( - + {shortenAddress(currency.address)} @@ -158,10 +149,10 @@ export function TokenDescription() { )} {description && ( <> - + {description} - + {truncatedDescription} @@ -189,7 +180,7 @@ export function TokenDescription() { } > - + {sameFee ? ( {currency.symbol}  @@ -210,7 +201,7 @@ export function TokenDescription() { {' '} )} - + )} diff --git a/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx b/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx index da8cebc75e1..b4791e45733 100644 --- a/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/TokenDetailsHeader.tsx @@ -13,7 +13,7 @@ import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { useMemo, useState } from 'react' import { Link, MoreHorizontal } from 'react-feather' import { useSearchParams } from 'react-router-dom' -import { EllipsisTamaguiStyle } from 'theme/components' +import { TamaguiEllipsisStyle } from 'theme/components' import { Flex, Text, WebBottomSheet, useMedia, useSporeColors } from 'ui/src' import { Check } from 'ui/src/components/icons' import { iconSizes } from 'ui/src/theme' @@ -115,7 +115,7 @@ export const TokenDetailsHeader = () => { - + {currency.name ?? t('tdp.nameNotFound')} diff --git a/apps/web/src/components/Tokens/TokenDetails/__snapshots__/Skeleton.test.tsx.snap b/apps/web/src/components/Tokens/TokenDetails/__snapshots__/Skeleton.test.tsx.snap index 58b5e6c5ac3..a03c80ebb89 100644 --- a/apps/web/src/components/Tokens/TokenDetails/__snapshots__/Skeleton.test.tsx.snap +++ b/apps/web/src/components/Tokens/TokenDetails/__snapshots__/Skeleton.test.tsx.snap @@ -2,13 +2,13 @@ exports[`TDP Skeleton should render correctly 1`] = ` - .c7 { + .c11 { box-sizing: border-box; margin: 0; min-width: 0; } -.c8 { +.c12 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -25,7 +25,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` justify-content: flex-start; } -.c18 { +.c24 { color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -33,7 +33,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` letter-spacing: -0.01em; } -.c0 { +.c2 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -52,7 +52,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` width: fit-content; } -.c1 { +.c3 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -68,22 +68,22 @@ exports[`TDP Skeleton should render correctly 1`] = ` text-decoration: none; } -.c1:hover { +.c3:hover { color: #CECECE; } -.c17 { +.c23 { gap: 16px; padding: 24px 0px; -webkit-animation: iAjNNh 125ms ease-in; animation: iAjNNh 125ms ease-in; } -.c19 { +.c25 { font-size: 28px !important; } -.c2 { +.c4 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -98,7 +98,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` background-size: 400%; } -.c13 { +.c19 { color: #7D7D7D; font-size: 14px; min-width: 121px; @@ -109,7 +109,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` padding-bottom: 0px; } -.c12 { +.c18 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -122,19 +122,19 @@ exports[`TDP Skeleton should render correctly 1`] = ` flex-wrap: wrap; } -.c9 { +.c14 { gap: 16px; -webkit-animation: iAjNNh 125ms ease-in; animation: iAjNNh 125ms ease-in; } -.c16 { +.c22 { background-color: #22222212; border: none; height: 0.5px; } -.c31 { +.c39 { border-radius: 12px; height: 40px; width: 40px; @@ -149,7 +149,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` z-index: 2; } -.c33 { +.c41 { display: -webkit-inline-box; display: -webkit-inline-flex; display: -ms-inline-flexbox; @@ -166,7 +166,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` height: 100%; } -.c32 { +.c40 { position: absolute; left: 50%; -webkit-transform: translate(-50%,-50%); @@ -175,7 +175,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` margin: 0; } -.c23 { +.c31 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -194,37 +194,37 @@ exports[`TDP Skeleton should render correctly 1`] = ` background-color: #FFFFFF; } -.c27 { +.c35 { background-color: #F9F9F9; border-radius: 4px; height: 56px; width: 60px; } -.c29 { +.c37 { background-color: #F9F9F9; border-radius: 16px; height: 56px; width: 100px; } -.c34 { +.c42 { background-color: #F9F9F9; border-radius: 16px; height: 56px; width: 100%; } -.c28 { +.c36 { background-color: #22222212; height: 36px; } -.c24 { +.c32 { padding: 8px; } -.c26 { +.c34 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -239,7 +239,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` justify-content: space-between; } -.c25 { +.c33 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -257,67 +257,203 @@ exports[`TDP Skeleton should render correctly 1`] = ` padding: 48px 12px; } -.c30 { +.c38 { position: relative; } -.c3 { +.c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0 16px 52px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + width: 100%; + gap: 40px; +} + +.c1 { + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + max-width: 780px; + overflow: hidden; + width: 100%; +} + +.c30 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding-top: 53px; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + gap: 40px; + width: 360px; +} + +.c7 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding-top: 8px; + margin-bottom: 20px; + gap: 20px; + -webkit-animation: iAjNNh 125ms ease-in; + animation: iAjNNh 125ms ease-in; + -webkit-animation-duration: 250ms; + animation-duration: 250ms; +} + +.c8 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + gap: 12px; + font-size: 20px; + line-height: 28px; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding-top: 4px; + min-width: 32px; +} + +.c5 { height: 16px; width: 180px; } -.c10 { +.c15 { height: 32px; border-radius: 8px; } -.c4 { +.c6 { width: 169px; } -.c5 { +.c9 { width: 32px; height: 32px; border-radius: 50%; } -.c6 { +.c10 { height: 36px; width: 136px; } -.c11 { +.c16 { width: 120px; } -.c14 { +.c20 { width: 80px; margin-bottom: 4px; } -.c15 { +.c21 { width: 116px; } -.c20 { +.c26 { margin-bottom: 6px; width: 100%; } -.c22 { +.c29 { width: 120px; } -.c21 { +.c27 { width: 50%; } +.c17 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.c28 { + padding-top: 24px; +} + +.c13 { + height: 4px; +} + @media screen and (max-width:640px) { - .c13 { + .c19 { min-width: 168px; } } +@media screen and (min-width:768px) { + .c0 { + padding: 48px 20px; + } +} + +@media screen and (max-width:1024px) { + .c0 { + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + } +} + +@media screen and (min-width:1280px) { + .c0 { + gap: 60px; + } +} + +@media screen and (max-width:1024px) { + .c30 { + width: 100%; + max-width: 780px; + } +} + +@media screen and (max-width:640px) { + .c8 { + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-align-items: flex-start; + -webkit-box-align: flex-start; + -ms-flex-align: flex-start; + align-items: flex-start; + } +} +

Swap
@@ -765,7 +900,7 @@ exports[`TDP Skeleton should render correctly 1`] = `
@@ -779,7 +914,29 @@ exports[`TDP Skeleton should render correctly 1`] = ` exports[`getLoadingTitle should return correct title 1`] = ` - @@ -791,11 +948,9 @@ exports[`getLoadingTitle should return correct title 1`] = ` > token data for USD//C (USDC) diff --git a/apps/web/src/components/Tokens/TokenDetails/__snapshots__/TokenDescription.test.tsx.snap b/apps/web/src/components/Tokens/TokenDetails/__snapshots__/TokenDescription.test.tsx.snap index 8706d70fdcd..b8eed37d75c 100644 --- a/apps/web/src/components/Tokens/TokenDetails/__snapshots__/TokenDescription.test.tsx.snap +++ b/apps/web/src/components/Tokens/TokenDetails/__snapshots__/TokenDescription.test.tsx.snap @@ -2,7 +2,52 @@ exports[`TokenDescription no description or social buttons shown when not available 1`] = ` - .c1 { + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c4 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c2 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c10 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -13,25 +58,90 @@ exports[`TokenDescription no description or social buttons shown when not availa font-weight: 500; } -.c1:hover { +.c10:hover { opacity: 0.6; } -.c1:active { +.c10:active { opacity: 0.4; } -.c0 { +.c8 { display: inline-block; height: inherit; } -.c2 { +.c12 { color: #CECECE; font-weight: 485; font-size: 16px; } +.c1 { + gap: 16px; + width: 100%; +} + +.c6 { + gap: 8px; + width: 100%; +} + +.c7 { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.c9 { + gap: 8px; + padding: 8px 12px; + border-radius: 20px; + color: #222222; + background-color: #F9F9F9; + font-size: 14px; + font-weight: 535; + line-height: 16px; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c9:hover { + opacity: 0.6; +} + +.c9:active { + opacity: 0.4; +} + +.c11 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + line-height: 24px; + white-space: pre-wrap; +} + +@media screen and (max-width:1024px) { + .c1 { + gap: 24px; + } +} + +@media screen and (max-width:1024px) { + .c3 { + font-size: 28px !important; + line-height: 36px !important; + } +} +
- Info - +
- 0xA0b8...eB48 - +
- Etherscan - +
-

No token information available

-
+
@@ -139,7 +245,52 @@ exports[`TokenDescription no description or social buttons shown when not availa exports[`TokenDescription renders token information correctly with defaults 1`] = ` - .c1 { + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c4 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c2 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c10 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -150,32 +301,105 @@ exports[`TokenDescription renders token information correctly with defaults 1`] font-weight: 500; } -.c1:hover { +.c10:hover { opacity: 0.6; } -.c1:active { +.c10:active { opacity: 0.4; } -.c0 { +.c8 { display: inline-block; height: inherit; } -.c2 { +.c14 { color: #7D7D7D; font-weight: 485; font-size: 0.85em; padding-top: 0.5em; } -.c2:hover, -.c2:focus { +.c14:hover, +.c14:focus { color: #636363; cursor: pointer; } +.c1 { + gap: 16px; + width: 100%; +} + +.c6 { + gap: 8px; + width: 100%; +} + +.c7 { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.c9 { + gap: 8px; + padding: 8px 12px; + border-radius: 20px; + color: #222222; + background-color: #F9F9F9; + font-size: 14px; + font-weight: 535; + line-height: 16px; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c9:hover { + opacity: 0.6; +} + +.c9:active { + opacity: 0.4; +} + +.c11 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + line-height: 24px; + white-space: pre-wrap; +} + +.c12 { + display: none; +} + +.c13 { + display: inline; +} + +@media screen and (max-width:1024px) { + .c1 { + gap: 24px; + } +} + +@media screen and (max-width:1024px) { + .c3 { + font-size: 28px !important; + line-height: 36px !important; + } +} +
- Info - +
- 0xA0b8...eB48 - +
- Etherscan - +
- Website - +
- Twitter - +
-

USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.

USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value...

Show more
-
+
@@ -348,7 +566,52 @@ exports[`TokenDescription renders token information correctly with defaults 1`] exports[`TokenDescription truncates description and shows more 1`] = ` - .c1 { + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c4 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c2 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c10 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -359,32 +622,105 @@ exports[`TokenDescription truncates description and shows more 1`] = ` font-weight: 500; } -.c1:hover { +.c10:hover { opacity: 0.6; } -.c1:active { +.c10:active { opacity: 0.4; } -.c0 { +.c8 { display: inline-block; height: inherit; } -.c2 { +.c14 { color: #7D7D7D; font-weight: 485; font-size: 0.85em; padding-top: 0.5em; } -.c2:hover, -.c2:focus { +.c14:hover, +.c14:focus { color: #636363; cursor: pointer; } +.c1 { + gap: 16px; + width: 100%; +} + +.c6 { + gap: 8px; + width: 100%; +} + +.c7 { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.c9 { + gap: 8px; + padding: 8px 12px; + border-radius: 20px; + color: #222222; + background-color: #F9F9F9; + font-size: 14px; + font-weight: 535; + line-height: 16px; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c9:hover { + opacity: 0.6; +} + +.c9:active { + opacity: 0.4; +} + +.c11 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + line-height: 24px; + white-space: pre-wrap; +} + +.c12 { + display: none; +} + +.c13 { + display: inline; +} + +@media screen and (max-width:1024px) { + .c1 { + gap: 24px; + } +} + +@media screen and (max-width:1024px) { + .c3 { + font-size: 28px !important; + line-height: 36px !important; + } +} +
- Info - +
- 0xA0b8...eB48 - +
- Etherscan - +
- Website - +
- Twitter - +
-

USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value between people, businesses and financial institutions just like email between mail services and texts between SMS providers. We believe by removing artificial economic borders, we can create a more inclusive global economy.

USDC is a fully collateralized US dollar stablecoin. USDC is the bridge between dollars and trading on cryptocurrency exchanges. The technology behind CENTRE makes it possible to exchange value...

Show more
-
+
diff --git a/apps/web/src/components/Tokens/TokenDetails/index.tsx b/apps/web/src/components/Tokens/TokenDetails/index.tsx index 00568479fec..02d6c7bca49 100644 --- a/apps/web/src/components/Tokens/TokenDetails/index.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/index.tsx @@ -20,20 +20,20 @@ import { useScreenSize } from 'hooks/screenSize' import { useAccount } from 'hooks/useAccount' import useParsedQueryString from 'hooks/useParsedQueryString' import { ScrollDirection, useScroll } from 'hooks/useScroll' -import deprecatedStyled from 'lib/styled-components' +import styled from 'lib/styled-components' import { Swap } from 'pages/Swap' import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { PropsWithChildren, useCallback, useMemo, useState } from 'react' import { ChevronRight } from 'react-feather' import { useNavigate } from 'react-router-dom' import { CurrencyState } from 'state/swap/types' -import { Flex, useIsTouchDevice } from 'ui/src' +import { useIsTouchDevice } from 'ui/src' import Trace from 'uniswap/src/features/telemetry/Trace' import { Trans } from 'uniswap/src/i18n' import { addressesAreEquivalent } from 'utils/addressesAreEquivalent' import { getInitialLogoUrl } from 'utils/getInitialLogoURL' -const DividerLine = deprecatedStyled(Hr)` +const DividerLine = styled(Hr)` margin-top: 40px; margin-bottom: 40px; @media screen and (max-width: ${({ theme }) => theme.breakpoint.sm}px) { @@ -41,6 +41,9 @@ const DividerLine = deprecatedStyled(Hr)` margin-bottom: 0; } ` +const BalanceSummaryContainer = styled.div` + margin-top: 40px; +` function TDPBreadcrumb() { const { address, currency, currencyChain } = useTDPContext() @@ -206,9 +209,9 @@ export default function TokenDetails() { {!showRightPanel && !!pageChainBalance && ( - + - + )} @@ -223,12 +226,11 @@ export default function TokenDetails() { )} - - {/* TODO(WEB-4800): data-testid is not passed to ui/src elements when animation is set */} - {/* Remove this extra div when WEB-4800 is fixed */} -
- -
+ + diff --git a/apps/web/src/components/Tokens/TokenDetails/shared.ts b/apps/web/src/components/Tokens/TokenDetails/shared.ts index 44ebc73fc38..54e795a6c71 100644 --- a/apps/web/src/components/Tokens/TokenDetails/shared.ts +++ b/apps/web/src/components/Tokens/TokenDetails/shared.ts @@ -1,4 +1,4 @@ -import deprecatedStyled from 'lib/styled-components' +import styled from 'lib/styled-components' import { darken } from 'polished' import { TamaguiClickableStyle } from 'theme/components' import { FlexProps, TextProps } from 'ui/src' @@ -29,19 +29,19 @@ export const ActionMenuFlyoutStyle = { right: 0, } satisfies FlexProps -export const Hr = deprecatedStyled.hr` +export const Hr = styled.hr` background-color: ${({ theme }) => theme.surface3}; border: none; height: 0.5px; ` -export const NoInfoAvailable = deprecatedStyled.p` +export const NoInfoAvailable = styled.p` color: ${({ theme }) => theme.neutral3}; font-weight: 485; font-size: 16px; ` -export const TruncateDescriptionButton = deprecatedStyled.div` +export const TruncateDescriptionButton = styled.div` color: ${({ theme }) => theme.neutral2}; font-weight: 485; font-size: 0.85em; diff --git a/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx b/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx index 150fdd7fc32..bffdee4498d 100644 --- a/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx @@ -50,6 +50,7 @@ export function TokenDetailsPoolsTable({ pools={pools} loading={allDataStillLoading} error={combinedError} + chainId={chainId} maxHeight={600} hiddenColumns={HIDDEN_COLUMNS} loadMore={loadMore} diff --git a/apps/web/src/components/Tokens/TokenDetails/tables/TransactionsTable.tsx b/apps/web/src/components/Tokens/TokenDetails/tables/TransactionsTable.tsx index 6b68277d0ca..0219d4ad54c 100644 --- a/apps/web/src/components/Tokens/TokenDetails/tables/TransactionsTable.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/tables/TransactionsTable.tsx @@ -1,6 +1,7 @@ import { ApolloError } from '@apollo/client' import { createColumnHelper } from '@tanstack/react-table' import { Token } from '@uniswap/sdk-core' +import Row from 'components/Row' import { Table } from 'components/Table' import { Cell } from 'components/Table/Cell' import { Filter } from 'components/Table/Filter' @@ -17,28 +18,24 @@ import { useUpdateManualOutage } from 'featureFlags/flags/outageBanner' import { TokenTransactionType, useTokenTransactions } from 'graphql/data/useTokenTransactions' import { OrderDirection, unwrapToken } from 'graphql/data/util' import { useActiveLocalCurrency } from 'hooks/useActiveLocalCurrency' -import { useMemo, useReducer, useRef, useState } from 'react' -import { EllipsisTamaguiStyle } from 'theme/components' -import { Flex, Text, styled } from 'ui/src' +import styled from 'lib/styled-components' +import { useMemo, useReducer, useState } from 'react' +import { EllipsisStyle, ThemedText } from 'theme/components' import { Token as GQLToken } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { Trans } from 'uniswap/src/i18n' import { shortenAddress } from 'utilities/src/addresses' import { useFormatter } from 'utils/formatNumbers' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -const StyledSwapAmount = styled(Text, { - display: 'inline-block' as any, - maxWidth: 75, - variant: 'body2', - color: '$neutral1', - ...EllipsisTamaguiStyle, -}) - -const TableWrapper = styled(Flex, { - position: 'relative', - minHeight: 158, -}) +const StyledSwapAmount = styled(ThemedText.BodyPrimary)` + display: inline-block; + ${EllipsisStyle} + max-width: 75px; +` +const TableWrapper = styled.div` + min-height: 158px; +` interface SwapTransaction { hash: string timestamp: number @@ -65,7 +62,6 @@ export function TransactionsTable({ const activeLocalCurrency = useActiveLocalCurrency() const { formatNumber, formatFiatPrice } = useFormatter() const [filterModalIsOpen, toggleFilterModal] = useReducer((s) => !s, false) - const filterAnchorRef = useRef(null) const [filter, setFilters] = useState([TokenTransactionType.BUY, TokenTransactionType.SELL]) const { transactions, loading, loadMore, errorV2, errorV3 } = useTokenTransactions( referenceToken.address, @@ -119,12 +115,12 @@ export function TransactionsTable({ id: 'timestamp', header: () => ( - + - + - + ), cell: (row) => ( @@ -140,23 +136,17 @@ export function TransactionsTable({ id: 'swap-type', header: () => ( - + - + - + ), @@ -164,9 +154,9 @@ export function TransactionsTable({ const isBuy = String(outputTokenAddress.getValue?.()).toLowerCase() === referenceToken.address.toLowerCase() return ( - + {isBuy ? : } - + ) }, @@ -180,18 +170,16 @@ export function TransactionsTable({ id: 'reference-amount', header: () => ( - - ${unwrappedReferenceToken.symbol} - + ${unwrappedReferenceToken.symbol} ), cell: (inputTokenAmount) => ( - + {formatNumber({ input: Math.abs(inputTokenAmount.getValue?.()) || 0, })} - + ), }, @@ -201,23 +189,23 @@ export function TransactionsTable({ const nonReferenceSwapLeg = row.input.address?.toLowerCase() === referenceToken.address.toLowerCase() ? row.output : row.input return ( - + {formatNumber({ input: Math.abs(nonReferenceSwapLeg.amount) || 0, })} - + ) }, { id: 'non-reference-amount', header: () => ( - + - + ), cell: (swapOutput) => ( @@ -231,16 +219,14 @@ export function TransactionsTable({ id: 'fiat-value', header: () => ( - + {activeLocalCurrency} - + ), cell: (fiat) => ( - - {formatFiatPrice({ price: fiat.getValue?.() })} - + {formatFiatPrice({ price: fiat.getValue?.() })} ), }), @@ -248,9 +234,9 @@ export function TransactionsTable({ id: 'maker-address', header: () => ( - + - + ), cell: (makerAddress) => ( diff --git a/apps/web/src/components/Tokens/TokenDetails/tables/__snapshots__/TokenDetailsPoolsTable.test.tsx.snap b/apps/web/src/components/Tokens/TokenDetails/tables/__snapshots__/TokenDetailsPoolsTable.test.tsx.snap index 9258001945f..034f81dcbc4 100644 --- a/apps/web/src/components/Tokens/TokenDetails/tables/__snapshots__/TokenDetailsPoolsTable.test.tsx.snap +++ b/apps/web/src/components/Tokens/TokenDetails/tables/__snapshots__/TokenDetailsPoolsTable.test.tsx.snap @@ -2,7 +2,80 @@ exports[`TDPPoolTable renders data filled state 1`] = ` - .c4 { + .c29 { + height: 16px; + width: 16px; +} + +.c29 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c30 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c3 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c4 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c20 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 8px; +} + +.c9 { + color: #7D7D7D; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c24 { + color: #222222; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c22 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -13,55 +86,220 @@ exports[`TDPPoolTable renders data filled state 1`] = ` left: 0; } -.c4 img { +.c22 img { width: 14px; height: 28px; object-fit: cover; } -.c4 img:first-child { +.c22 img:first-child { border-radius: 14px 0 0 14px; object-position: 0 0; } -.c4 img:last-child { +.c22 img:last-child { border-radius: 0 14px 14px 0; object-position: 100% 0; } -.c5 { +.c23 { width: 14px; height: 28px; border-radius: 50%; } -.c3 { +.c21 { + position: relative; + top: 0; + left: 0; +} + +.c0 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c12 { + display: inline-block; + height: inherit; +} + +.c1 { + max-width: px; + max-height: 600px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; -webkit-align-items: center; -webkit-box-align: center; -ms-flex-align: center; align-items: center; + margin: 0px auto 24px auto; +} + +.c2 { + width: 100%; position: relative; - top: 0; - left: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; } -.c0 { - display: inline-block; - height: inherit; +.c17 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; } -.c2 { +.c17::-webkit-scrollbar { + display: none; +} + +.c27 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c28 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c5 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c6 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; +} + +.c6::-webkit-scrollbar { + display: none; +} + +.c7 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c7:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c7:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c18 { color: none; -webkit-text-decoration: none; text-decoration: none; cursor: pointer; } -.c1 { +.c13 { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + cursor: pointer; + width: 100%; + gap: 4px; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c13:hover { + opacity: 0.6; +} + +.c13:active { + opacity: 0.4; +} + +.c14 { height: 16px; width: 16px; color: #222222; @@ -70,6 +308,116 @@ exports[`TDPPoolTable renders data filled state 1`] = ` transform: rotate(0deg); } +.c15 { + color: #222222; +} + +.c8 { + min-width: 44px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c10 { + width: 240px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c11 { + min-width: 120px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c16 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c25 { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.c26 { + padding: 2px 6px; + background: #F9F9F9; + border-radius: 5px; +} + +@media not all and (hover:none) { + .c19:hover { + background: #22222212; + } +} +
- # - +
- Pool - +
- TVL - +
- 1 day volume - +
- 7 day volume - +
- 1 day APR - +
@@ -243,135 +585,147 @@ exports[`TDPPoolTable renders data filled state 1`] = `
- $400.00 - +
- $500.00 - +
- 6% - +
+
+
+ + + + Loading +
+
@@ -383,23 +737,62 @@ exports[`TDPPoolTable renders data filled state 1`] = ` exports[`TDPPoolTable renders error state 1`] = ` - .c6 { - color: #222222; + .c25 { + height: 16px; + width: 16px; +} + +.c25 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c26 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c3 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c4 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c9 { + color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c7 { - color: #7D7D7D; +.c22 { + color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c5 { +.c0 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -413,7 +806,7 @@ exports[`TDPPoolTable renders error state 1`] = ` justify-content: flex-start; } -.c4 { +.c21 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -443,12 +836,172 @@ exports[`TDPPoolTable renders error state 1`] = ` border-radius: 20px; } -.c0 { - display: inline-block; - height: inherit; +.c12 { + display: inline-block; + height: inherit; +} + +.c1 { + max-width: px; + max-height: 600px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0px auto 24px auto; +} + +.c2 { + width: 100%; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; +} + +.c17 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c17::-webkit-scrollbar { + display: none; +} + +.c23 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c24 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c5 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c6 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; + opacity: 0.4; +} + +.c6::-webkit-scrollbar { + display: none; +} + +.c7 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c7:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c7:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c13 { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + cursor: pointer; + width: 100%; + gap: 4px; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; } -.c1 { +.c13:hover { + opacity: 0.6; +} + +.c13:active { + opacity: 0.4; +} + +.c14 { height: 16px; width: 16px; color: #222222; @@ -457,7 +1010,11 @@ exports[`TDPPoolTable renders error state 1`] = ` transform: rotate(0deg); } -.c2 { +.c15 { + color: #222222; +} + +.c19 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -472,11 +1029,105 @@ exports[`TDPPoolTable renders error state 1`] = ` background-size: 400%; } -.c3 { +.c8 { + min-width: 44px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c10 { + width: 240px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c11 { + min-width: 120px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c16 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c20 { width: 75%; height: 16px; } +@media not all and (hover:none) { + .c18:hover { + background: #22222212; + } +} +
- # - +
- Pool - +
- TVL - +
- 1 day volume - +
- 7 day volume - +
- 1 day APR - +
@@ -650,542 +1295,542 @@ exports[`TDPPoolTable renders error state 1`] = `
@@ -1218,21 +1863,44 @@ exports[`TDPPoolTable renders error state 1`] = `
Error loading data
Data is unavailable at the moment; we’re working on a fix
+
+
+ + + + Loading +
+
@@ -1244,12 +1912,232 @@ exports[`TDPPoolTable renders error state 1`] = ` exports[`TDPPoolTable renders loading state 1`] = ` - .c0 { + .c23 { + height: 16px; + width: 16px; +} + +.c23 path { + stroke: #FC72FF; + background: #7D7D7D; + fill: none; +} + +.c24 { + -webkit-animation: 2s fvtopB linear infinite; + animation: 2s fvtopB linear infinite; +} + +.c3 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c4 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c9 { + color: #7D7D7D; + -webkit-letter-spacing: -0.01em; + -moz-letter-spacing: -0.01em; + -ms-letter-spacing: -0.01em; + letter-spacing: -0.01em; +} + +.c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c12 { display: inline-block; height: inherit; } .c1 { + max-width: px; + max-height: 600px; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0px auto 24px auto; +} + +.c2 { + width: 100%; + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + background: #FFFFFF; +} + +.c17 { + width: 100%; + position: relative; + overflow-x: auto; + overscroll-behavior-x: none; + border-right: 1px solid #22222212; + border-bottom: 1px solid #22222212; + border-left: 1px solid #22222212; + border-bottom-right-radius: 20px; + border-bottom-left-radius: 20px; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; +} + +.c17::-webkit-scrollbar { + display: none; +} + +.c21 { + position: -webkit-sticky; + position: sticky; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: -48px; + visibility: hidden; +} + +.c22 { + background: #FFEFFF; + border-radius: 8px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + padding: 8px; + color: #FC72FF; + font-size: 16px; + font-weight: 535; + gap: 8px; + height: 34px; + z-index: 990; +} + +.c5 { + padding: 0px 12px; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + min-width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 64px; +} + +.c6 { + border: 1px solid #22222212; + border-top-right-radius: 20px; + border-top-left-radius: 20px; + overflow: auto; + width: unset; + min-height: 52px; + background: #F9F9F9; + -ms-overflow-style: none; + -webkit-scrollbar-width: none; + -moz-scrollbar-width: none; + -ms-scrollbar-width: none; + scrollbar-width: none; + overscroll-behavior: none; +} + +.c6::-webkit-scrollbar { + display: none; +} + +.c7 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.c7:last-child { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.c7:first-child { + -webkit-box-flex: 0; + -webkit-flex-grow: 0; + -ms-flex-positive: 0; + flex-grow: 0; +} + +.c13 { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + cursor: pointer; + width: 100%; + gap: 4px; + -webkit-text-decoration: none; + text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 125ms; + transition-duration: 125ms; +} + +.c13:hover { + opacity: 0.6; +} + +.c13:active { + opacity: 0.4; +} + +.c14 { height: 16px; width: 16px; color: #222222; @@ -1258,7 +2146,11 @@ exports[`TDPPoolTable renders loading state 1`] = ` transform: rotate(0deg); } -.c2 { +.c15 { + color: #222222; +} + +.c19 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -1273,11 +2165,105 @@ exports[`TDPPoolTable renders loading state 1`] = ` background-size: 400%; } -.c3 { +.c8 { + min-width: 44px; + -webkit-flex: 0; + -ms-flex: 0; + flex: 0; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c10 { + width: 240px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c11 { + min-width: 120px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c16 { + min-width: 100px; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-variant-numeric: lining-nums tabular-nums; + overflow: hidden; + padding: 12px 8px; +} + +.c20 { width: 75%; height: 16px; } +@media not all and (hover:none) { + .c18:hover { + background: #22222212; + } +} +
- # - +
- Pool - +
- TVL - +
- 1 day volume - +
- 7 day volume - +
- 1 day APR - +
@@ -1451,541 +2431,564 @@ exports[`TDPPoolTable renders loading state 1`] = `
+
+
+ + + + Loading +
+
diff --git a/apps/web/src/components/Tokens/TokenTable/NetworkFilter.tsx b/apps/web/src/components/Tokens/TokenTable/NetworkFilter.tsx index 64906a38e53..65a2fa80b78 100644 --- a/apps/web/src/components/Tokens/TokenTable/NetworkFilter.tsx +++ b/apps/web/src/components/Tokens/TokenTable/NetworkFilter.tsx @@ -1,4 +1,3 @@ -import { InterfaceEventName, InterfacePageName } from '@uniswap/analytics-events' import Badge from 'components/Badge' import { DropdownSelector, InternalMenuItem } from 'components/DropdownSelector' import { ChainLogo } from 'components/Logo/ChainLogo' @@ -6,7 +5,6 @@ import { AllNetworksIcon } from 'components/Tokens/TokenTable/icons' import { BACKEND_NOT_YET_SUPPORTED_CHAIN_IDS, BACKEND_SUPPORTED_CHAINS, - InterfaceGqlChain, useChainFromUrlParam, useIsSupportedChainIdCallback, } from 'constants/chains' @@ -14,18 +12,15 @@ import { getSupportedGraphQlChain, supportedChainIdFromGQLChain } from 'graphql/ import deprecatedStyled, { useTheme } from 'lib/styled-components' import { ExploreTab } from 'pages/Explore' import { useExploreParams } from 'pages/Explore/redirects' -import { Dispatch, SetStateAction, memo, useState } from 'react' +import { useState } from 'react' import { Check } from 'react-feather' import { useNavigate } from 'react-router-dom' -import { EllipsisTamaguiStyle } from 'theme/components' +import { TamaguiEllipsisStyle } from 'theme/components' import { Flex, FlexProps, ScrollView, Text, styled } from 'ui/src' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' -import Trace from 'uniswap/src/features/telemetry/Trace' -import { ModalName } from 'uniswap/src/features/telemetry/constants' import { useTranslation } from 'uniswap/src/i18n' -import { UniverseChainId, UniverseChainInfo } from 'uniswap/src/types/chains' const NetworkLabel = styled(Flex, { flexDirection: 'row', @@ -45,135 +40,103 @@ const StyledDropdown = { minWidth: 256, right: 0, px: 0, - $lg: { + $xl: { left: 0, right: undefined, }, } satisfies FlexProps export default function TableNetworkFilter() { + const { t } = useTranslation() + const theme = useTheme() + const navigate = useNavigate() const [isMenuOpen, toggleMenu] = useState(false) const isSupportedChainCallback = useIsSupportedChainIdCallback() const isMultichainExploreEnabled = useFeatureFlag(FeatureFlags.MultichainExplore) const exploreParams = useExploreParams() - const currentChain = getSupportedGraphQlChain(useChainFromUrlParam(), { - fallbackToEthereum: !isMultichainExploreEnabled, - }) + const currentChain = getSupportedGraphQlChain(useChainFromUrlParam(), { fallbackToEthereum: true }) const tab = exploreParams.tab return (
- - - {!currentChain ? ( - - ) : ( - - )} - - } - internalMenuItems={ - - {isMultichainExploreEnabled && ( - - )} - {BACKEND_SUPPORTED_CHAINS.map((network) => { - const chainId = supportedChainIdFromGQLChain(network) - const isSupportedChain = isSupportedChainCallback(chainId) - const chainInfo = isSupportedChain ? UNIVERSE_CHAIN_INFO[chainId] : undefined - return ( - - ) - })} - {BACKEND_NOT_YET_SUPPORTED_CHAIN_IDS.map((network) => { - const isSupportedChain = isSupportedChainCallback(network) - const chainInfo = isSupportedChain ? UNIVERSE_CHAIN_INFO[network] : undefined - return chainInfo ? ( - - ) : null - })} - - } - buttonStyle={{ height: 40 }} - dropdownStyle={StyledDropdown} - /> - + + {!exploreParams.chainName && isMultichainExploreEnabled ? ( + + ) : ( + + )} + + } + internalMenuItems={ + + {isMultichainExploreEnabled && ( + { + navigate(`/explore/${tab ?? ExploreTab.Tokens}`) + toggleMenu(false) + }} + > + + {' '} + + {t('transaction.network.all')} + + + {!exploreParams.chainName && } + + )} + {BACKEND_SUPPORTED_CHAINS.map((network) => { + const chainId = supportedChainIdFromGQLChain(network) + const isSupportedChain = isSupportedChainCallback(chainId) + const chainInfo = isSupportedChain ? UNIVERSE_CHAIN_INFO[chainId] : undefined + return ( + { + navigate(`/explore/${tab ?? ExploreTab.Tokens}/${network.toLowerCase()}`) + toggleMenu(false) + }} + > + + {' '} + + {chainInfo?.label} + + + {network === currentChain.backendChain.chain && exploreParams.chainName && ( + + )} + + ) + })} + {BACKEND_NOT_YET_SUPPORTED_CHAIN_IDS.map((network) => { + const isSupportedChain = isSupportedChainCallback(network) + const chainInfo = isSupportedChain ? UNIVERSE_CHAIN_INFO[network] : undefined + return chainInfo ? ( + + + {' '} + + {chainInfo.label} + + + Coming soon + + ) : null + })} + + } + buttonStyle={{ height: 40 }} + dropdownStyle={StyledDropdown} + />
) } - -const TableNetworkItem = memo(function TableNetworkItem({ - display, - chainInfo, - toggleMenu, - tab, - unsupported, -}: { - display: 'All networks' | InterfaceGqlChain - chainInfo?: UniverseChainInfo - toggleMenu: Dispatch> - tab?: ExploreTab - unsupported?: boolean -}) { - const navigate = useNavigate() - const theme = useTheme() - const { t } = useTranslation() - const isMultichainExploreEnabled = useFeatureFlag(FeatureFlags.MultichainExplore) - const chainId = chainInfo?.id - const exploreParams = useExploreParams() - const currentChain = getSupportedGraphQlChain( - useChainFromUrlParam(), - isMultichainExploreEnabled ? undefined : { fallbackToEthereum: true }, - ) - const isAllNetworks = display === 'All networks' && isMultichainExploreEnabled - const isCurrentChain = isAllNetworks - ? !currentChain - : currentChain?.backendChain.chain === display && exploreParams.chainName - return ( - - { - !unsupported && - navigate(`/explore/${tab ?? ExploreTab.Tokens}${!isAllNetworks ? `/${display.toLowerCase()}` : ''}`) - toggleMenu(false) - }} - > - - {isAllNetworks ? : }{' '} - - {!isAllNetworks ? chainInfo?.label : t('transaction.network.all')} - - - {unsupported ? ( - {t('settings.setting.beta.tooltip')} - ) : isCurrentChain ? ( - - ) : null} - - - ) -}) diff --git a/apps/web/src/components/Tokens/TokenTable/index.tsx b/apps/web/src/components/Tokens/TokenTable/index.tsx index 5dc9fbd4cc5..cf03b40f247 100644 --- a/apps/web/src/components/Tokens/TokenTable/index.tsx +++ b/apps/web/src/components/Tokens/TokenTable/index.tsx @@ -4,6 +4,7 @@ import { InterfaceElementName } from '@uniswap/analytics-events' import { ParentSize } from '@visx/responsive' import SparklineChart from 'components/Charts/SparklineChart' import QueryTokenLogo from 'components/Logo/QueryTokenLogo' +import Row from 'components/Row' import { Table } from 'components/Table' import { Cell } from 'components/Table/Cell' import { ClickableHeaderRow, HeaderArrow, HeaderSortText } from 'components/Table/styled' @@ -18,44 +19,33 @@ import { useSetSortMethod, } from 'components/Tokens/state' import { MouseoverTooltip } from 'components/Tooltip' -import { chainIdToBackendChain, getChainFromChainUrlParam, useChainFromUrlParam } from 'constants/chains' +import { SupportedInterfaceChainId, chainIdToBackendChain, useChainFromUrlParam } from 'constants/chains' import { NATIVE_CHAIN_ID } from 'constants/tokens' import { SparklineMap, TopToken, useTopTokens } from 'graphql/data/TopTokens' -import { OrderDirection, getSupportedGraphQlChain, getTokenDetailsURL, unwrapToken } from 'graphql/data/util' +import { OrderDirection, getSupportedGraphQlChain, getTokenDetailsURL } from 'graphql/data/util' import { useAtomValue } from 'jotai/utils' +import styled from 'lib/styled-components' import { ReactElement, ReactNode, useMemo } from 'react' -import { giveExploreStatDefaultValue } from 'state/explore' -import { useTopTokens as useRestTopTokens } from 'state/explore/topTokens' -import { TokenStat } from 'state/explore/types' -import { Flex, Text, styled } from 'ui/src' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' +import { EllipsisStyle, ThemedText } from 'theme/components' import { Trans } from 'uniswap/src/i18n' import { NumberType, useFormatter } from 'utils/formatNumbers' -const TableWrapper = styled(Flex, { - m: '0 auto', - maxWidth: MAX_WIDTH_MEDIA_BREAKPOINT, -}) +const TableWrapper = styled.div` + margin: 0 auto; + max-width: ${MAX_WIDTH_MEDIA_BREAKPOINT}; +` -export const EllipsisText = styled(Text, { - variant: 'body2', - color: '$neutral1', - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', -}) +export const NameText = styled(ThemedText.BodyPrimary)` + ${EllipsisStyle} +` +const ValueText = styled(ThemedText.BodyPrimary)` + ${EllipsisStyle} +` -const SparklineContainer = styled(Flex, { - width: '124px', - height: '$spacing40', -}) - -const TokenTableText = styled(Text, { - variant: 'body2', - color: '$neutral2', - maxWidth: '100%', -}) +const SparklineContainer = styled.div` + width: 124px; + height: 40px; +` interface TokenTableValue { index: number @@ -71,69 +61,19 @@ interface TokenTableValue { linkState: { preloadedLogoSrc?: string } } -function TokenDescription({ token }: { token: TopToken | TokenStat }) { +function TokenDescription({ token }: { token: TopToken }) { return ( - + - {token?.project?.name ?? token?.name} - - {token?.symbol} - - + {token?.project?.name ?? token?.name} + {token?.symbol} + ) } export function TopTokensTable() { const chain = getSupportedGraphQlChain(useChainFromUrlParam(), { fallbackToEthereum: true }) - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) - const { - tokens: gqlTokens, - tokenSortRank: gqlTokenSortRank, - loadingTokens: gqlLoadingTokens, - sparklines: gqlSparklines, - error: gqlError, - } = useTopTokens(chain.backendChain.chain, isRestExploreEnabled /* skip */) - const { - topTokens: restTopTokens, - tokenSortRank: restTokenSortRank, - isLoading: restIsLoading, - sparklines: restSparklines, - isError: restError, - } = useRestTopTokens() - - const { tokens, tokenSortRank, sparklines, loading, error } = useMemo(() => { - return isRestExploreEnabled - ? { - tokens: restTopTokens, - tokenSortRank: restTokenSortRank, - loading: restIsLoading, - sparklines: restSparklines, - error: restError, - } - : { - tokens: gqlTokens, - tokenSortRank: gqlTokenSortRank, - loading: gqlLoadingTokens, - sparklines: gqlSparklines, - error: gqlError, - } - }, [ - isRestExploreEnabled, - restTopTokens, - restTokenSortRank, - restIsLoading, - restSparklines, - restError, - gqlTokens, - gqlTokenSortRank, - gqlLoadingTokens, - gqlSparklines, - gqlError, - ]) + const { tokens, tokenSortRank, loadingTokens, sparklines, error } = useTopTokens(chain.backendChain.chain) return ( @@ -141,8 +81,9 @@ export function TopTokensTable() { tokens={tokens} tokenSortRank={tokenSortRank} sparklines={sparklines} - loading={loading} + loading={loadingTokens} error={error} + chainId={chain.id} /> ) @@ -177,9 +118,9 @@ function TokenTableHeader({ return ( - + {isCurrentSortMethod && } - {HEADER_TEXT[category]} + {HEADER_TEXT[category]} ) @@ -192,13 +133,15 @@ function TokenTable({ loading, error, loadMore, + chainId, }: { - tokens?: readonly TopToken[] | TokenStat[] + tokens?: readonly TopToken[] tokenSortRank: Record sparklines: SparklineMap loading: boolean - error?: ApolloError | boolean + error?: ApolloError loadMore?: ({ onComplete }: { onComplete?: () => void }) => void + chainId: SupportedInterfaceChainId }) { const { formatFiatPrice, formatNumber, formatDelta } = useFormatter() const sortAscending = useAtomValue(sortAscendingAtom) @@ -210,19 +153,14 @@ function TokenTable({ const tokenTableValues: TokenTableValue[] | undefined = useMemo( () => tokens?.map((token, i) => { - const isGqlToken = !!token && 'id' in token - const delta1hr = isGqlToken - ? token?.market?.pricePercentChange1Hour?.value - : token?.pricePercentChange1Hour?.value - const delta1d = isGqlToken ? token?.market?.pricePercentChange1Day?.value : token?.pricePercentChange1Day?.value + const delta1hr = token?.market?.pricePercentChange1Hour?.value + const delta1d = token?.market?.pricePercentChange1Day?.value const tokenSortIndex = tokenSortRank[token?.address ?? NATIVE_CHAIN_ID] - const chainId = getChainFromChainUrlParam(token?.chain.toLowerCase())?.id - const unwrappedToken = chainId ? unwrapToken(chainId, token) : token return { index: tokenSortIndex, - tokenDescription: , - price: isGqlToken ? token?.market?.price?.value ?? 0 : giveExploreStatDefaultValue(token?.price?.value), + tokenDescription: , + price: token?.market?.price?.value ?? 0, testId: `token-table-row-${token?.address}`, percentChange1hr: ( <> @@ -236,10 +174,8 @@ function TokenTable({ {formatDelta(delta1d)} ), - fdv: isGqlToken - ? token?.project?.markets?.[0]?.fullyDilutedValuation?.value ?? 0 - : giveExploreStatDefaultValue(token?.fullyDilutedValuation?.value), - volume: isGqlToken ? token?.market?.volume?.value ?? 0 : giveExploreStatDefaultValue(token?.volume?.value), + fdv: token?.project?.markets?.[0]?.fullyDilutedValuation?.value ?? 0, + volume: token?.market?.volume?.value ?? 0, sparkline: ( @@ -249,9 +185,7 @@ function TokenTable({ width={width} height={height} tokenData={token} - pricePercentChange={ - isGqlToken ? token?.market?.pricePercentChange?.value : token?.pricePercentChange1Day?.value - } + pricePercentChange={token?.market?.pricePercentChange?.value} sparklineMap={sparklines} /> ) @@ -260,7 +194,7 @@ function TokenTable({ ), link: getTokenDetailsURL({ - address: unwrappedToken?.address, + address: token?.address, chain: chainIdToBackendChain({ chainId, withFallback: true }), }), analytics: { @@ -276,10 +210,10 @@ function TokenTable({ search_token_address_input: filterString, }, }, - linkState: { preloadedLogoSrc: isGqlToken ? token?.project?.logoUrl : token?.logo }, + linkState: { preloadedLogoSrc: token?.project?.logoUrl }, } }) ?? [], - [filterString, formatDelta, sparklines, timePeriod, tokenSortRank, tokens], + [chainId, filterString, formatDelta, sparklines, timePeriod, tokenSortRank, tokens], ) const showLoadingSkeleton = loading || !!error @@ -290,12 +224,12 @@ function TokenTable({ id: 'index', header: () => ( - # + # ), cell: (index) => ( - {index.getValue?.()} + {index.getValue?.()} ), }), @@ -303,14 +237,14 @@ function TokenTable({ id: 'tokenDescription', header: () => ( - + - + ), cell: (tokenDescription) => ( - {tokenDescription.getValue?.()} + {tokenDescription.getValue?.()} ), }), @@ -327,12 +261,12 @@ function TokenTable({ ), cell: (price) => ( - + {/* A simple 0 price indicates the price is not currently available from the api */} {price.getValue?.() === 0 ? '-' : formatFiatPrice({ price: price.getValue?.(), type: NumberType.FiatTokenPrice })} - + ), }), @@ -383,7 +317,7 @@ function TokenTable({ ), cell: (fdv) => ( - {formatNumber({ input: fdv.getValue?.(), type: NumberType.FiatTokenStats })} + {formatNumber({ input: fdv.getValue?.(), type: NumberType.FiatTokenStats })} ), }), @@ -400,7 +334,7 @@ function TokenTable({ ), cell: (volume) => ( - {formatNumber({ input: volume.getValue?.(), type: NumberType.FiatTokenStats })} + {formatNumber({ input: volume.getValue?.(), type: NumberType.FiatTokenStats })} ), }), diff --git a/apps/web/src/components/Tokens/loading.tsx b/apps/web/src/components/Tokens/loading.tsx index 64f3bc94cd0..bfcc25cc316 100644 --- a/apps/web/src/components/Tokens/loading.tsx +++ b/apps/web/src/components/Tokens/loading.tsx @@ -1,9 +1,9 @@ import { loadingAnimation } from 'components/Loader/styled' -import deprecatedStyled from 'lib/styled-components' +import styled from 'lib/styled-components' import { lighten } from 'polished' /* Loading state bubbles (animation style from: src/components/Loader/styled.tsx) */ -export const LoadingBubble = deprecatedStyled.div<{ +export const LoadingBubble = styled.div<{ height?: string width?: string round?: boolean diff --git a/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx b/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx index 84b7cb11363..8382ad8a671 100644 --- a/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx +++ b/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx @@ -11,8 +11,7 @@ import { hideMobileAppPromoBannerAtom } from 'state/application/atoms' import { BREAKPOINTS } from 'theme' import { ThemedText } from 'theme/components' import { Z_INDEX } from 'theme/zIndex' -import { Text } from 'ui/src' -import { Trans, useTranslation } from 'uniswap/src/i18n' +import { Trans } from 'uniswap/src/i18n' import { isWebAndroid, isWebIOS } from 'utilities/src/platform' import { getWalletMeta } from 'utils/walletMeta' @@ -85,7 +84,6 @@ function getDownloadLink(userAgent: string, peerWalletAgent?: string): string { } export function MobileAppPromoBanner() { - const { t } = useTranslation() const [isVisible, setIsVisible] = useState(true) const theme = useTheme() const mobileAppPromoBannerEligible = useMobileAppPromoBannerEligible() @@ -122,9 +120,9 @@ export function MobileAppPromoBanner() { - - {t('common.getApp')} - + + + ) diff --git a/apps/web/src/components/TopLevelModals/index.tsx b/apps/web/src/components/TopLevelModals/index.tsx index c5ec5581467..59f16ea4118 100644 --- a/apps/web/src/components/TopLevelModals/index.tsx +++ b/apps/web/src/components/TopLevelModals/index.tsx @@ -18,6 +18,8 @@ import Bag from 'nft/components/bag/Bag' import TransactionCompleteModal from 'nft/components/collection/TransactionCompleteModal' import { useModalIsOpen, useToggleModal } from 'state/application/hooks' import { ApplicationModal } from 'state/application/reducer' +import { FeatureFlags } from 'uniswap/src/features/gating/flags' +import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { isBetaEnv, isDevEnv } from 'utilities/src/environment' export default function TopLevelModals() { @@ -28,6 +30,7 @@ export default function TopLevelModals() { useAccountRiskCheck(account.address) const accountBlocked = Boolean(blockedAccountModalOpen && account.isConnected) const shouldShowDevFlags = isDevEnv() || isBetaEnv() + const extensionIsLaunched = useFeatureFlag(FeatureFlags.ExtensionLaunch) return ( <> @@ -48,7 +51,7 @@ export default function TopLevelModals() { {shouldShowDevFlags && } - + {extensionIsLaunched && } ) } diff --git a/apps/web/src/components/WalletModal/DownloadWalletOption.tsx b/apps/web/src/components/WalletModal/DownloadWalletOption.tsx index df9f2b6cb24..719aaac5384 100644 --- a/apps/web/src/components/WalletModal/DownloadWalletOption.tsx +++ b/apps/web/src/components/WalletModal/DownloadWalletOption.tsx @@ -54,7 +54,7 @@ export const DownloadWalletOption = () => { - + diff --git a/apps/web/src/components/WalletModal/UniswapWalletOptions.test.tsx b/apps/web/src/components/WalletModal/UniswapWalletOptions.test.tsx index b320a086b13..c79da6a7080 100644 --- a/apps/web/src/components/WalletModal/UniswapWalletOptions.test.tsx +++ b/apps/web/src/components/WalletModal/UniswapWalletOptions.test.tsx @@ -20,7 +20,7 @@ describe('UniswapWalletOptions Test', () => { id === CONNECTION.WALLET_CONNECT_CONNECTOR_ID ? WALLET_CONNECT_CONNECTOR : undefined, ) }) - it('Download wallet option should be visible if extension is not detected', () => { + it('Download wallet option should be visible if extension is not detected and launch flag is true', () => { mocked(useConnectorWithId).mockImplementation((id) => id === CONNECTION.UNISWAP_EXTENSION_RDNS ? undefined : WALLET_CONNECT_CONNECTOR, ) @@ -30,6 +30,16 @@ describe('UniswapWalletOptions Test', () => { const downloadOption = screen.getByTestId('download-uniswap-wallet') expect(downloadOption).toBeInTheDocument() }) + it('Download wallet option should not be visible if extension is not detected and launch flag is false', () => { + mocked(useConnectorWithId).mockImplementation((id) => + id === CONNECTION.UNISWAP_EXTENSION_RDNS ? undefined : WALLET_CONNECT_CONNECTOR, + ) + mocked(useFeatureFlag).mockReturnValue(false) + const { asFragment } = render() + expect(asFragment()).toMatchSnapshot() + const downloadOption = screen.queryByTestId('download-uniswap-wallet') + expect(downloadOption).not.toBeInTheDocument() + }) it('Extension connecter should be shown if detected', () => { mocked(useConnectorWithId).mockImplementation((id) => id === CONNECTION.UNISWAP_EXTENSION_RDNS ? UNISWAP_EXTENSION_CONNECTOR : WALLET_CONNECT_CONNECTOR, diff --git a/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx b/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx index 8f2581b36a2..f2d5f54983f 100644 --- a/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx +++ b/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx @@ -1,6 +1,4 @@ -import { InterfaceElementName } from '@uniswap/analytics-events' import Column from 'components/Column' -import { GooglePlayStoreLogo } from 'components/Icons/GooglePlayStoreLogo' import Row from 'components/Row' import { DownloadWalletOption } from 'components/WalletModal/DownloadWalletOption' import { DetectedBadge } from 'components/WalletModal/shared' @@ -9,13 +7,13 @@ import { CONNECTION } from 'components/Web3Provider/constants' import { useConnect } from 'hooks/useConnect' import styled from 'lib/styled-components' import { Z_INDEX } from 'theme/zIndex' -import { Flex, Image, Text } from 'ui/src' +import { Image, Text } from 'ui/src' import { UNISWAP_LOGO } from 'ui/src/assets' -import { AppStoreLogo, PhoneDownload, ScanQr } from 'ui/src/components/icons' +import { ScanQr } from 'ui/src/components/icons/ScanQr' import { iconSizes } from 'ui/src/theme' +import { FeatureFlags } from 'uniswap/src/features/gating/flags' +import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { Trans } from 'uniswap/src/i18n' -import { isMobileWeb, isWebIOS } from 'utilities/src/platform' -import { openDownloadApp } from 'utils/openDownloadApp' export const OptionContainer = styled(Row)` padding: 16px; @@ -46,6 +44,7 @@ export function UniswapWalletOptions() { const uniswapWalletConnectConnector = useConnectorWithId(CONNECTION.UNISWAP_WALLET_CONNECT_CONNECTOR_ID, { shouldThrow: true, }) + const extensionIsLaunched = useFeatureFlag(FeatureFlags.ExtensionLaunch) const { connect } = useConnect() @@ -60,21 +59,21 @@ export function UniswapWalletOptions() { > - + - ) : // If not on a mobile web browser show the download wallet modal (includes link to download extension) - !isMobileWeb ? ( + ) : // If the extension is not detected, show the option to download the app + extensionIsLaunched ? ( ) : null} connect({ connector: uniswapWalletConnectConnector })}> - + @@ -83,35 +82,6 @@ export function UniswapWalletOptions() { - {isMobileWeb && ( - // If on a mobile web browser show the relevant app store download link - openDownloadApp({ element: InterfaceElementName.UNISWAP_WALLET_MODAL_DOWNLOAD_BUTTON })} - > - - - - - - - - {isWebIOS ? ( - - ) : ( - - )} - - - {isWebIOS ? ( - - ) : ( - - - - )} - - - )} ) diff --git a/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap b/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap index bbb30d2bf95..0f748b7ee0d 100644 --- a/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap +++ b/apps/web/src/components/WalletModal/__snapshots__/UniswapWalletOptions.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UniswapWalletOptions Test Download wallet option should be visible if extension is not detected 1`] = ` +exports[`UniswapWalletOptions Test Download wallet option should be visible if extension is not detected and launch flag is true 1`] = ` .c0 { display: -webkit-box; @@ -197,7 +197,7 @@ exports[`UniswapWalletOptions Test Download wallet option should be visible if e class="c9" > Get Uniswap Wallet @@ -236,7 +236,177 @@ exports[`UniswapWalletOptions Test Download wallet option should be visible if e class="c9" > + Uniswap Mobile + + + Scan QR code to connect + +
+
+
+
+
+ + + + +`; + +exports[`UniswapWalletOptions Test Download wallet option should not be visible if extension is not detected and launch flag is false 1`] = ` + + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 16px; +} + +.c1 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 12px; +} + +.c6 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.c2 { + box-sizing: border-box; + margin: 0; + min-width: 0; +} + +.c3 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 12px; +} + +.c5 { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding: 0; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; + gap: 4px; +} + +.c4 { + padding: 16px; + gap: 12px; + border-radius: 16px; + border: 1px solid #22222212; + overflow: hidden; + max-height: 72px; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + cursor: pointer; + position: relative; + z-index: 1; +} + +.c4:hover { + background: #22222212; +} + + + + +
+
+
+ + + +
+
+ Uniswap Mobile @@ -422,7 +592,7 @@ exports[`UniswapWalletOptions Test Extension connecter should be shown if detect class="c2 c5" > Uniswap Extension @@ -463,7 +633,7 @@ exports[`UniswapWalletOptions Test Extension connecter should be shown if detect class="c7" > Uniswap Mobile diff --git a/apps/web/src/components/WalletModal/index.tsx b/apps/web/src/components/WalletModal/index.tsx index 4176c38da72..3bff6131427 100644 --- a/apps/web/src/components/WalletModal/index.tsx +++ b/apps/web/src/components/WalletModal/index.tsx @@ -2,22 +2,19 @@ import { useShowMoonpayText } from 'components/AccountDrawer/MiniPortfolio/hooks import Column from 'components/Column' import { CollapsedIcon } from 'components/Icons/Collapse' import { ExpandIcon } from 'components/Icons/Expand' -import { AccountCTAsExperimentGroup } from 'components/NavBar' import Row, { AutoRow } from 'components/Row' import ConnectionErrorView from 'components/WalletModal/ConnectionErrorView' import { Option } from 'components/WalletModal/Option' import PrivacyPolicyNotice from 'components/WalletModal/PrivacyPolicyNotice' import { UniswapWalletOptions } from 'components/WalletModal/UniswapWalletOptions' import { useOrderedConnections } from 'components/WalletModal/useOrderedConnections' -import { useIsUniExtensionAvailable } from 'hooks/useUniswapWalletOptions' +import { useIsUniExtensionAvailable, useUniswapWalletOptions } from 'hooks/useUniswapWalletOptions' import styled, { css } from 'lib/styled-components' import { useReducer } from 'react' import { ClickableStyle, ThemedText } from 'theme/components' import { flexColumnNoWrap } from 'theme/styles' import { Text } from 'ui/src' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks' -import { Trans, useTranslation } from 'uniswap/src/i18n' +import { Trans } from 'uniswap/src/i18n' const Wrapper = styled.div<{ isUniExtensionAvailable?: boolean }>` ${flexColumnNoWrap}; @@ -72,39 +69,40 @@ const StyledCollapsedIcon = styled(CollapsedIcon)` ` export default function WalletModal() { - const { t } = useTranslation() const showMoonpayText = useShowMoonpayText() - const connectors = useOrderedConnections(true /** exclude uniswap connectors since they're shown separately */) + const showUniswapWalletOptions = useUniswapWalletOptions() + const connectors = useOrderedConnections(showUniswapWalletOptions) const isUniExtensionAvailable = useIsUniExtensionAvailable() const [showOtherWallets, toggleShowOtherWallets] = useReducer((s) => !s, true) - const isSignIn = useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.SignInSignUp - const isLogIn = useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.LogInCreateAccount - return ( - - {isSignIn ? t('nav.signIn.button') : isLogIn ? t('nav.logIn.button') : t('common.connectAWallet.button')} - + + + - - isUniExtensionAvailable && toggleShowOtherWallets()} - > - - - - - - {isUniExtensionAvailable ? showOtherWallets ? : : null} - - - + {showUniswapWalletOptions && ( + <> + + isUniExtensionAvailable && toggleShowOtherWallets()} + > + + + + + + {isUniExtensionAvailable ? showOtherWallets ? : : null} + + + + + )} diff --git a/apps/web/src/components/Web3Provider/WebUniswapContext.tsx b/apps/web/src/components/Web3Provider/WebUniswapContext.tsx index ca0d15d628a..183a7897f4f 100644 --- a/apps/web/src/components/Web3Provider/WebUniswapContext.tsx +++ b/apps/web/src/components/Web3Provider/WebUniswapContext.tsx @@ -1,24 +1,27 @@ import { useAccount } from 'hooks/useAccount' import { useEthersProvider } from 'hooks/useEthersProvider' import { useEthersSigner } from 'hooks/useEthersSigner' -import { useShowSwapNetworkNotification } from 'hooks/useShowSwapNetworkNotification' import { PropsWithChildren, useMemo } from 'react' import { UniswapProvider } from 'uniswap/src/contexts/UniswapContext' import { AccountMeta, AccountType } from 'uniswap/src/features/accounts/types' +import { FeatureFlags } from 'uniswap/src/features/gating/flags' +import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' // Adapts useEthersProvider to fit uniswap context hook shape function useWebProvider(chainId: number) { return useEthersProvider({ chainId }) } -function useWagmiAccount(): AccountMeta | undefined { +function useWagmiAccount(): AccountMeta { const account = useAccount() - return useMemo(() => { + // TODO(WEB-4736): remove this default account stub once swap flow supports unconnected state. if (!account.address) { - return undefined + return { + address: '0x67d615D6bccAA1562B1cca9786384b4840597ecD', + type: AccountType.Readonly, + } } - return { address: account.address, type: AccountType.SignerMnemonic, @@ -30,15 +33,11 @@ function useWagmiAccount(): AccountMeta | undefined { export function WebUniswapProvider({ children }: PropsWithChildren) { const account = useWagmiAccount() const signer = useEthersSigner() - const showSwapNetworkNotification = useShowSwapNetworkNotification() + + const sharedSwapEnabled = useFeatureFlag(FeatureFlags.UniversalSwap) return ( - + {children} ) diff --git a/apps/web/src/components/Web3Status/index.tsx b/apps/web/src/components/Web3Status/index.tsx index f5d3bbf4900..09a12f0227f 100644 --- a/apps/web/src/components/Web3Status/index.tsx +++ b/apps/web/src/components/Web3Status/index.tsx @@ -5,7 +5,6 @@ import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import { ButtonSecondary } from 'components/Button' import Loader, { LoaderV3 } from 'components/Icons/LoadingSpinner' import StatusIcon, { IconWrapper } from 'components/Identicon/StatusIcon' -import { AccountCTAsExperimentGroup } from 'components/NavBar' import { RowBetween } from 'components/Row' import { useAccountIdentifier } from 'components/Web3Status/useAccountIdentifier' import { PrefetchBalancesWrapper } from 'graphql/data/apollo/TokenBalancesProvider' @@ -18,13 +17,10 @@ import { darken } from 'polished' import { RefObject, useCallback, useEffect, useRef } from 'react' import { useAppSelector } from 'state/hooks' import { flexRowNoWrap } from 'theme/styles' -import { Text } from 'ui/src' import { Unitag } from 'ui/src/components/icons/Unitag' -import { Experiments } from 'uniswap/src/features/gating/experiments' -import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks' import Trace from 'uniswap/src/features/telemetry/Trace' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { Trans, useTranslation } from 'uniswap/src/i18n' +import { Trans } from 'uniswap/src/i18n' import { isIFramed } from 'utils/isIFramed' // https://stackoverflow.com/a/31617326 @@ -110,7 +106,7 @@ const AddressAndChevronContainer = styled.div<{ $loading?: boolean }>` } ` -const StyledText = styled.span` +const Text = styled.span` flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; @@ -133,20 +129,6 @@ const StyledConnectButton = styled.button` color: inherit; ` -function ExistingUserCTAButton() { - const { t } = useTranslation() - const isSignIn = useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.SignInSignUp - const isLogIn = useExperimentGroupName(Experiments.AccountCTAs) === AccountCTAsExperimentGroup.LogInCreateAccount - - return ( - - - {isSignIn ? t('nav.signIn.button') : isLogIn ? t('nav.logIn.button') : t('common.connect.button')} - - - ) -} - export const Web3StatusRef = atom | undefined>(undefined) function Web3StatusInner() { @@ -177,7 +159,7 @@ function Web3StatusInner() { - {accountIdentifier} + {accountIdentifier} {hasUnitag && } @@ -197,14 +179,14 @@ function Web3StatusInner() { {!hasPendingActivity && } {hasPendingActivity ? ( - + - {' '} + {' '} ) : ( - {accountIdentifier} + {accountIdentifier} {hasUnitag && } )} @@ -224,7 +206,9 @@ function Web3StatusInner() { onClick={handleWalletDropdownClick} ref={ref} > - + + + ) diff --git a/apps/web/src/components/addLiquidity/PoolWarning.tsx b/apps/web/src/components/addLiquidity/PoolWarning.tsx index 1e1b6a37901..c32e3556bfe 100644 --- a/apps/web/src/components/addLiquidity/PoolWarning.tsx +++ b/apps/web/src/components/addLiquidity/PoolWarning.tsx @@ -4,7 +4,7 @@ import styled from 'lib/styled-components' import { ReactNode } from 'react' import { ExternalLink } from 'theme/components' import { Text } from 'ui/src' -import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled' +import { AlertTriangle } from 'ui/src/components/icons/AlertTriangle' import { iconSizes } from 'ui/src/theme' import { Trans } from 'uniswap/src/i18n' @@ -41,7 +41,7 @@ export function PoolWarning({ title, subtitle, link }: PoolWarningProps) { - + @@ -52,7 +52,7 @@ export function PoolWarning({ title, subtitle, link }: PoolWarningProps) { {subtitle} - + diff --git a/apps/web/src/components/swap/PriceImpactModal.tsx b/apps/web/src/components/swap/PriceImpactModal.tsx index 47e0305cf86..afe31970910 100644 --- a/apps/web/src/components/swap/PriceImpactModal.tsx +++ b/apps/web/src/components/swap/PriceImpactModal.tsx @@ -2,7 +2,7 @@ import { Percent } from '@uniswap/sdk-core' import Modal from 'components/Modal' import { GetHelpHeader } from 'components/Modal/GetHelpHeader' import { Button, Flex, Text } from 'ui/src' -import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled' +import { AlertTriangle } from 'ui/src/components/icons/AlertTriangle' import { Trans } from 'uniswap/src/i18n' import { useFormatter } from 'utils/formatNumbers' @@ -22,7 +22,7 @@ export default function PriceImpactModal({ priceImpact, onDismiss, onContinue }: - + @@ -59,7 +59,7 @@ export default function PriceImpactModal({ priceImpact, onDismiss, onContinue }: backgroundColor: '$surface3', }} > - + @@ -73,7 +73,7 @@ export default function PriceImpactModal({ priceImpact, onDismiss, onContinue }: hoverStyle={{ opacity: 0.9, backgroundColor: '$statusCritical' }} pressStyle={{ opacity: 0.7, backgroundColor: '$statusCritical' }} > - + diff --git a/apps/web/src/constants/chains.test.ts b/apps/web/src/constants/chains.test.ts index 39a57200c15..1f79d191616 100644 --- a/apps/web/src/constants/chains.test.ts +++ b/apps/web/src/constants/chains.test.ts @@ -199,7 +199,6 @@ const backendSupportedChains = [ Chain.Celo, Chain.Blast, Chain.Avalanche, - Chain.Zksync, ] as const test.each(backendSupportedChains)( @@ -210,7 +209,7 @@ test.each(backendSupportedChains)( }, ) -const backendNotyetSupportedChainIds = [UniverseChainId.Zora] as const +const backendNotyetSupportedChainIds = [UniverseChainId.Zora, UniverseChainId.Zksync] as const test.each(backendNotyetSupportedChainIds)( 'BACKEND_SUPPORTED_CHAINS generates the correct chains', diff --git a/apps/web/src/constants/lists.ts b/apps/web/src/constants/lists.ts index 48dc9e00204..895fdd3ee9f 100644 --- a/apps/web/src/constants/lists.ts +++ b/apps/web/src/constants/lists.ts @@ -1,4 +1,6 @@ // Lists we use as fallbacks on chains that our backend doesn't support const COINGECKO_AVAX_LIST = 'https://tokens.coingecko.com/avalanche/all.json' +const COINGECKO_ZKSYNC_LIST = 'https://tokens.coingecko.com/zksync/all.json' +const COINGECKO_ZORA_LIST = 'https://tokens.coingecko.com/zora-network/all.json' -export const DEFAULT_INACTIVE_LIST_URLS: string[] = [COINGECKO_AVAX_LIST] +export const DEFAULT_INACTIVE_LIST_URLS: string[] = [COINGECKO_AVAX_LIST, COINGECKO_ZKSYNC_LIST, COINGECKO_ZORA_LIST] diff --git a/apps/web/src/global.css b/apps/web/src/global.css index 52899c09fbe..9e68ce9192a 100644 --- a/apps/web/src/global.css +++ b/apps/web/src/global.css @@ -39,21 +39,3 @@ transform: rotate(22deg); } } - -.scrollbar-hidden { - ::-webkit-scrollbar { - display: none; - } - -ms-overflow-style: none; - scrollbar-width: none; -} -.last-child-flex-end { - &:last-child { - justify-content: flex-end; - } -} -.first-child-flex-grow-0 { - &:first-child { - flex-grow: 0; - } -} diff --git a/apps/web/src/graphql/data/SearchTokens.ts b/apps/web/src/graphql/data/SearchTokens.ts index 5ff779402d4..de10c574d4c 100644 --- a/apps/web/src/graphql/data/SearchTokens.ts +++ b/apps/web/src/graphql/data/SearchTokens.ts @@ -8,11 +8,12 @@ import { Token, useSearchTokensWebQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' +import { SearchResultType, TokenSearchResult } from 'uniswap/src/features/search/SearchResult' const ARB_ADDRESS = ARB.address.toLowerCase() /* Returns the more relevant cross-chain token based on native status and search chain */ -function dedupeCrosschainTokens(current: GqlSearchToken, existing: GqlSearchToken | undefined, searchChain: Chain) { +function dedupeCrosschainTokens(current: SearchToken, existing: SearchToken | undefined, searchChain: Chain) { if (!existing) { return current } @@ -46,8 +47,8 @@ function dedupeCrosschainTokens(current: GqlSearchToken, existing: GqlSearchToke function searchTokenSortFunction( searchChain: Chain, wrappedNativeAddress: string | undefined, - a: GqlSearchToken, - b: GqlSearchToken, + a: SearchToken, + b: SearchToken, ) { if (a.standard === NATIVE_CHAIN_ID) { if (b.standard === NATIVE_CHAIN_ID) { @@ -83,7 +84,7 @@ export function useSearchTokens(searchQuery: string | undefined, chainId: Suppor const sortedTokens = useMemo(() => { const searchChain = chainIdToBackendChain({ chainId, withFallback: true }) // Stores results, allowing overwriting cross-chain tokens w/ more 'relevant token' - const selectionMap: { [projectId: string]: GqlSearchToken } = {} + const selectionMap: { [projectId: string]: SearchToken } = {} const filteredTokens = data?.searchTokens?.filter( (token): token is Token => token !== undefined && (BACKEND_SUPPORTED_CHAINS as ReadonlyArray).includes(token.chain), @@ -106,4 +107,13 @@ export function useSearchTokens(searchQuery: string | undefined, chainId: Suppor } } -export type GqlSearchToken = NonNullable[number]> +export type TokenSearchResultWeb = Omit & { + type: SearchResultType.Token | SearchResultType.NFTCollection + address: string + chain: Chain + isNft?: boolean + isToken?: boolean + isNative?: boolean +} + +export type SearchToken = NonNullable[number]> diff --git a/apps/web/src/graphql/data/TopTokens.ts b/apps/web/src/graphql/data/TopTokens.ts index 68a41be69b2..9cb5fb3267e 100644 --- a/apps/web/src/graphql/data/TopTokens.ts +++ b/apps/web/src/graphql/data/TopTokens.ts @@ -92,7 +92,7 @@ interface UseTopTokensReturnValue { error?: ApolloError } -export function useTopTokens(chain: Chain, skip?: boolean): UseTopTokensReturnValue { +export function useTopTokens(chain: Chain): UseTopTokensReturnValue { const chainId = supportedChainIdFromGQLChain(chain) const duration = toHistoryDuration(useAtomValue(filterTimeAtom)) const isWindowVisible = useIsWindowVisible() @@ -100,7 +100,7 @@ export function useTopTokens(chain: Chain, skip?: boolean): UseTopTokensReturnVa const { data: sparklineQuery } = usePollQueryWhileMounted( useTopTokensSparklineQuery({ variables: { duration, chain }, - skip: !isWindowVisible || skip, + skip: !isWindowVisible, }), PollingInterval.Slow, ) @@ -123,7 +123,7 @@ export function useTopTokens(chain: Chain, skip?: boolean): UseTopTokensReturnVa } = usePollQueryWhileMounted( useTopTokens100Query({ variables: { duration, chain }, - skip: !isWindowVisible || skip, + skip: !isWindowVisible, }), PollingInterval.Fast, ) diff --git a/apps/web/src/graphql/data/apollo/TokenBalancesProvider.tsx b/apps/web/src/graphql/data/apollo/TokenBalancesProvider.tsx index 684907de9cc..64d0247bf8d 100644 --- a/apps/web/src/graphql/data/apollo/TokenBalancesProvider.tsx +++ b/apps/web/src/graphql/data/apollo/TokenBalancesProvider.tsx @@ -85,7 +85,7 @@ function usePortfolioValueModifiers(): { } export function TokenBalancesProvider({ children }: PropsWithChildren) { - const [lazyFetch, query] = usePortfolioBalancesWebLazyQuery({ errorPolicy: 'all' }) + const [lazyFetch, query] = usePortfolioBalancesWebLazyQuery() const account = useAccount() const hasAccountUpdate = useHasAccountUpdate() const valueModifiers = usePortfolioValueModifiers() diff --git a/apps/web/src/graphql/data/nft/NftBalance.ts b/apps/web/src/graphql/data/nft/NftBalance.ts index 0bfec4bba49..26f0480905b 100644 --- a/apps/web/src/graphql/data/nft/NftBalance.ts +++ b/apps/web/src/graphql/data/nft/NftBalance.ts @@ -8,7 +8,6 @@ import { NftAsset, useNftBalanceQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { useHideSpamTokensSetting } from 'uniswap/src/features/settings/hooks' type UseNftBalanceParams = { ownerAddress: string @@ -52,7 +51,6 @@ export function useNftBalance({ }, skip, }) - const hideSpam = useHideSpamTokensSetting() const hasNext = data?.nftBalances?.pageInfo?.hasNextPage const loadMore = useCallback( @@ -65,12 +63,7 @@ export function useNftBalance({ [data?.nftBalances?.pageInfo?.endCursor, fetchMore], ) - // If hideSpam is true, filter out spam NFTs - const filteredQueryAssets = hideSpam - ? data?.nftBalances?.edges?.filter((queryAsset) => !(queryAsset?.node.ownedAsset as NonNullable).isSpam) - : data?.nftBalances?.edges - - const walletAssets: WalletAsset[] | undefined = filteredQueryAssets?.map((queryAsset) => { + const walletAssets: WalletAsset[] | undefined = data?.nftBalances?.edges?.map((queryAsset) => { const asset = queryAsset?.node.ownedAsset as NonNullable const ethPrice = parseEther(wrapScientificNotation(asset?.listings?.edges[0]?.node.price.value ?? 0)).toString() return { diff --git a/apps/web/src/graphql/data/pools/useTopPools.ts b/apps/web/src/graphql/data/pools/useTopPools.ts index a1d58221504..285a0562035 100644 --- a/apps/web/src/graphql/data/pools/useTopPools.ts +++ b/apps/web/src/graphql/data/pools/useTopPools.ts @@ -12,8 +12,6 @@ import { useTopV2PairsQuery, useTopV3PoolsQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' export function sortPools(pools: TablePool[], sortState: PoolTableSortState) { return pools.sort((a, b) => { @@ -112,14 +110,13 @@ function useFilteredPools(pools: TablePool[]) { export function useTopPools(sortState: PoolTableSortState, chainId?: SupportedInterfaceChainId) { const isWindowVisible = useIsWindowVisible() - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) const { loading: loadingV3, error: errorV3, data: dataV3, } = useTopV3PoolsQuery({ variables: { first: 100, chain: chainIdToBackendChain({ chainId, withFallback: true }) }, - skip: !isWindowVisible || isRestExploreEnabled, + skip: !isWindowVisible, }) const { loading: loadingV2, @@ -127,7 +124,7 @@ export function useTopPools(sortState: PoolTableSortState, chainId?: SupportedIn data: dataV2, } = useTopV2PairsQuery({ variables: { first: 100, chain: chainIdToBackendChain({ chainId, withFallback: true }) }, - skip: !isWindowVisible || !chainId || isRestExploreEnabled, + skip: !isWindowVisible || !chainId, }) const loading = loadingV3 || loadingV2 diff --git a/apps/web/src/graphql/data/protocolStats.ts b/apps/web/src/graphql/data/protocolStats.ts index b70b113c011..61748e8f84e 100644 --- a/apps/web/src/graphql/data/protocolStats.ts +++ b/apps/web/src/graphql/data/protocolStats.ts @@ -14,8 +14,6 @@ import { useDailyProtocolTvlQuery, useHistoricalProtocolVolumeQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' function mapDataByTimestamp( v2Data?: readonly TimestampedAmount[], @@ -42,10 +40,9 @@ export function useHistoricalProtocolVolume( duration: HistoryDuration, ): ChartQueryResult { const isWindowVisible = useIsWindowVisible() - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) const { data: queryData, loading } = useHistoricalProtocolVolumeQuery({ variables: { chain, duration }, - skip: !isWindowVisible || isRestExploreEnabled, + skip: !isWindowVisible, }) return useMemo(() => { @@ -69,10 +66,9 @@ export function useHistoricalProtocolVolume( export function useDailyProtocolTVL(chain: Chain): ChartQueryResult { const isWindowVisible = useIsWindowVisible() - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) const { data: queryData, loading } = useDailyProtocolTvlQuery({ variables: { chain }, - skip: !isWindowVisible || isRestExploreEnabled, + skip: !isWindowVisible, }) return useMemo(() => { diff --git a/apps/web/src/graphql/data/util.tsx b/apps/web/src/graphql/data/util.tsx index 2121e0ab786..a652f031d7c 100644 --- a/apps/web/src/graphql/data/util.tsx +++ b/apps/web/src/graphql/data/util.tsx @@ -11,7 +11,6 @@ import { SupportedInterfaceChainId, UX_SUPPORTED_GQL_CHAINS, chainIdToBackendChain, - getChainFromChainUrlParam, isSupportedChainId, } from 'constants/chains' import { NATIVE_CHAIN_ID, WRAPPED_NATIVE_CURRENCY, nativeOnChain } from 'constants/tokens' @@ -19,7 +18,6 @@ import { DefaultTheme } from 'lib/styled-components' import ms from 'ms' import { ExploreTab } from 'pages/Explore' import { useEffect } from 'react' -import { TokenStat } from 'state/explore/types' import { ThemeColors } from 'theme/colors' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { @@ -97,11 +95,11 @@ export function toContractInput(currency: Currency): ContractInput { return { chain, address: currency.isToken ? currency.address : getNativeTokenDBAddress(chain) } } -export function gqlToCurrency(token: DeepPartial): Currency | undefined { +export function gqlToCurrency(token: DeepPartial): Currency | undefined { if (!token.chain) { return undefined } - const chainId = getChainFromChainUrlParam(token.chain.toLowerCase())?.id + const chainId = supportedChainIdFromGQLChain(token.chain) if (!chainId) { return undefined } @@ -134,12 +132,12 @@ export function fiatOnRampToCurrency(forCurrency: FORSupportedToken): Currency | export function getSupportedGraphQlChain( chain: UniverseChainInfo | undefined, - options: { fallbackToEthereum: true }, -): UniverseChainInfo + options?: undefined, +): UniverseChainInfo | undefined export function getSupportedGraphQlChain( chain: UniverseChainInfo | undefined, - options?: { fallbackToEthereum?: boolean }, -): UniverseChainInfo | undefined + options: { fallbackToEthereum: true }, +): UniverseChainInfo export function getSupportedGraphQlChain( chain: UniverseChainInfo | undefined, options?: { fallbackToEthereum?: boolean }, @@ -220,18 +218,10 @@ export function unwrapToken< } } -type ProtocolMeta = { name: string; color: keyof ThemeColors; gradient: { start: string; end: string } } +type ProtocolMeta = { name: string; color: keyof ThemeColors } const PROTOCOL_META: { [source in PriceSource]: ProtocolMeta } = { - [PriceSource.SubgraphV2]: { - name: 'v2', - color: 'accent3', - gradient: { start: 'rgba(96, 123, 238, 0.20)', end: 'rgba(55, 70, 136, 0.00)' }, - }, - [PriceSource.SubgraphV3]: { - name: 'v3', - color: 'accent1', - gradient: { start: 'rgba(252, 116, 254, 0.20)', end: 'rgba(252, 116, 254, 0.00)' }, - }, + [PriceSource.SubgraphV2]: { name: 'v2', color: 'accent3' }, + [PriceSource.SubgraphV3]: { name: 'v3', color: 'accent1' }, /* [PriceSource.UniswapX]: { name: 'UniswapX', color: purple } */ } @@ -242,9 +232,6 @@ export function getProtocolColor(priceSource: PriceSource, theme: DefaultTheme): export function getProtocolName(priceSource: PriceSource): string { return PROTOCOL_META[priceSource].name } -export function getProtocolGradient(priceSource: PriceSource): { start: string; end: string } { - return PROTOCOL_META[priceSource].gradient -} export enum OrderDirection { Asc = 'asc', diff --git a/apps/web/src/hooks/Tokens.test.ts b/apps/web/src/hooks/Tokens.test.ts index 40c07eaec27..c79438d9531 100644 --- a/apps/web/src/hooks/Tokens.test.ts +++ b/apps/web/src/hooks/Tokens.test.ts @@ -1,7 +1,6 @@ import { Token } from '@uniswap/sdk-core' import { DAI, NATIVE_CHAIN_ID } from 'constants/tokens' import { useCurrencyInfo } from 'hooks/Tokens' -import { TEST_TOKEN_1 } from 'test-utils/constants' import { renderHook } from 'test-utils/render' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency' @@ -19,8 +18,8 @@ describe('useCurrencyInfo', () => { expect(result.current).toBeUndefined() }) - it('returns undefined if skip is true and no common base is found', () => { - const { result } = renderHook(() => useCurrencyInfo(TEST_TOKEN_1.address, UniverseChainId.Mainnet, true)) + it('returns undefined if skip is true', () => { + const { result } = renderHook(() => useCurrencyInfo(DAI.address, UniverseChainId.Mainnet, true)) expect(result.current).toBeUndefined() }) @@ -29,18 +28,14 @@ describe('useCurrencyInfo', () => { it('calls useUniswapCurrencyInfo with the correct arguments', () => { renderHook(() => useCurrencyInfo(DAI.address, UniverseChainId.Mainnet)) - expect(useUniswapCurrencyInfo).toHaveBeenCalledWith(`${UniverseChainId.Mainnet}-${DAI.address}`, { - skip: undefined, - }) + expect(useUniswapCurrencyInfo).toHaveBeenCalledWith(`${UniverseChainId.Mainnet}-${DAI.address}`) }) it('calls useUniswapCurrencyInfo with the correct arguments when Currency is provided', () => { const currency = new Token(UniverseChainId.Mainnet, DAI.address, 18, DAI.symbol, DAI.name) renderHook(() => useCurrencyInfo(currency)) - expect(useUniswapCurrencyInfo).toHaveBeenCalledWith(`${UniverseChainId.Mainnet}-${DAI.address}`, { - skip: undefined, - }) + expect(useUniswapCurrencyInfo).toHaveBeenCalledWith(`${UniverseChainId.Mainnet}-${DAI.address}`) }) }) @@ -50,7 +45,6 @@ describe('useCurrencyInfo', () => { expect(useUniswapCurrencyInfo).toHaveBeenCalledWith( `${UniverseChainId.Mainnet}-${UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet].nativeCurrency.address}`, - { skip: undefined }, ) }) @@ -59,7 +53,6 @@ describe('useCurrencyInfo', () => { expect(useUniswapCurrencyInfo).toHaveBeenCalledWith( `${UniverseChainId.Mainnet}-${UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet].nativeCurrency.address}`, - { skip: undefined }, ) }) @@ -69,7 +62,6 @@ describe('useCurrencyInfo', () => { expect(useUniswapCurrencyInfo).toHaveBeenCalledWith( `${UniverseChainId.Mainnet}-${UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet].nativeCurrency.address}`, - { skip: undefined }, ) }) }) diff --git a/apps/web/src/hooks/Tokens.ts b/apps/web/src/hooks/Tokens.ts index 2dbfd20a440..7e382238df9 100644 --- a/apps/web/src/hooks/Tokens.ts +++ b/apps/web/src/hooks/Tokens.ts @@ -1,6 +1,5 @@ import { Currency, Token } from '@uniswap/sdk-core' import { SupportedInterfaceChainId, useSupportedChainId } from 'constants/chains' -import { COMMON_BASES } from 'constants/routing' import { NATIVE_CHAIN_ID } from 'constants/tokens' import { useAccount } from 'hooks/useAccount' import { TokenAddressMap } from 'lib/hooks/useTokenList/utils' @@ -14,7 +13,7 @@ import { CurrencyInfo } from 'uniswap/src/features/dataApi/types' import { useCurrencyInfo as useUniswapCurrencyInfo } from 'uniswap/src/features/tokens/useCurrencyInfo' import { InterfaceChainId, UniverseChainId } from 'uniswap/src/types/chains' import { buildCurrencyId } from 'uniswap/src/utils/currencyId' -import { isAddress, isSameAddress } from 'utilities/src/addresses' +import { isAddress } from 'utilities/src/addresses' type Maybe = T | undefined @@ -58,6 +57,17 @@ export function useFallbackListTokens(chainId: Maybe): { [addr }, [tokensFromMap, userAddedTokens]) } +// Check if currency is included in custom list from user storage +export function useIsUserAddedToken(currency: Currency | undefined | null): boolean { + const userAddedTokens = useUserAddedTokens() + + if (!currency) { + return false + } + + return !!userAddedTokens.find((token) => currency.equals(token)) +} + export function useCurrency(address?: string, chainId?: InterfaceChainId, skip?: boolean): Maybe { const currencyInfo = useCurrencyInfo(address, chainId, skip) return currencyInfo?.currency @@ -66,7 +76,7 @@ export function useCurrency(address?: string, chainId?: InterfaceChainId, skip?: /** * Returns a CurrencyInfo from the tokenAddress+chainId pair. */ -export function useCurrencyInfo(currency?: Currency, chainId?: InterfaceChainId, skip?: boolean): Maybe +export function useCurrencyInfo(currency?: Currency): Maybe export function useCurrencyInfo(address?: string, chainId?: InterfaceChainId, skip?: boolean): Maybe export function useCurrencyInfo( addressOrCurrency?: string | Currency, @@ -80,72 +90,30 @@ export function useCurrencyInfo( UNIVERSE_CHAIN_INFO[chainIdWithFallback as UniverseChainId]?.nativeCurrency.address ?? UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet]?.nativeCurrency.address - const isNative = useMemo(() => checkIsNative(addressOrCurrency), [addressOrCurrency]) - const address = useMemo( - () => getAddress(isNative, nativeAddressWithFallback, addressOrCurrency), - [isNative, nativeAddressWithFallback, addressOrCurrency], - ) + const address = + typeof addressOrCurrency === 'string' + ? addressOrCurrency === 'ETH' + ? nativeAddressWithFallback + : addressOrCurrency + : addressOrCurrency?.isNative + ? nativeAddressWithFallback + : addressOrCurrency?.address const supportedChainId = useSupportedChainId(chainIdWithFallback) - const addressWithFallback = isNative || !address ? nativeAddressWithFallback : address + const addressWithFallback = + address === NATIVE_CHAIN_ID || address === 'ETH' || !address ? nativeAddressWithFallback : address const currencyId = buildCurrencyId(supportedChainId ?? UniverseChainId.Mainnet, addressWithFallback) - const currencyInfo = useUniswapCurrencyInfo(currencyId, { skip }) + const currencyInfo = useUniswapCurrencyInfo(currencyId) return useMemo(() => { - const commonBase = getCommonBase(chainIdWithFallback, isNative, address) - - if (commonBase) { - return commonBase - } - if (!currencyInfo || !addressOrCurrency || skip) { return undefined } return currencyInfo - }, [addressOrCurrency, currencyInfo, chainIdWithFallback, isNative, address, skip]) -} - -const checkIsNative = (addressOrCurrency?: string | Currency): boolean => { - return typeof addressOrCurrency === 'string' - ? [NATIVE_CHAIN_ID, 'native', 'eth'].includes(addressOrCurrency.toLowerCase()) - : addressOrCurrency?.isNative ?? false -} - -const getCommonBase = (chainId?: number, isNative?: boolean, address?: string): CurrencyInfo | undefined => { - if (!address || !chainId) { - return undefined - } - return COMMON_BASES[chainId]?.find( - (base) => - (base.currency.isNative && isNative) || (base.currency.isToken && isSameAddress(base.currency.address, address)), - ) -} - -const getAddress = ( - isNative: boolean, - nativeAddressWithFallback: string, - addressOrCurrency?: string | Currency, -): string | undefined => { - if (typeof addressOrCurrency === 'string') { - if (isNative) { - return nativeAddressWithFallback - } else { - return addressOrCurrency - } - } - - if (addressOrCurrency) { - if (addressOrCurrency.isNative) { - return nativeAddressWithFallback - } else if (addressOrCurrency) { - return addressOrCurrency.address - } - } - - return undefined + }, [addressOrCurrency, currencyInfo, skip]) } export function useToken(tokenAddress?: string, chainId?: SupportedInterfaceChainId): Maybe { diff --git a/apps/web/src/hooks/useAccountRiskCheck.test.ts b/apps/web/src/hooks/useAccountRiskCheck.test.ts index d7cec5bf55f..ed63e54ff87 100644 --- a/apps/web/src/hooks/useAccountRiskCheck.test.ts +++ b/apps/web/src/hooks/useAccountRiskCheck.test.ts @@ -1,8 +1,6 @@ import useAccountRiskCheck from 'hooks/useAccountRiskCheck' import { ApplicationModal, setOpenModal } from 'state/application/reducer' -import { mocked } from 'test-utils/mocked' -import { renderHook } from 'test-utils/render' -import { useIsBlocked } from 'uniswap/src/features/trm/hooks' +import { renderHook, waitFor } from 'test-utils/render' // Mock the useAppDispatch hook const dispatchMock = jest.fn() @@ -11,22 +9,48 @@ jest.mock('state/hooks', () => ({ useAppDispatch: () => dispatchMock, })) -jest.mock('uniswap/src/features/trm/hooks', () => ({ - useIsBlocked: jest.fn(), -})) - describe('useAccountRiskCheck', () => { it('should handle blocked account', async () => { const account = 'blocked-account' - mocked(useIsBlocked).mockReturnValue({ isBlocked: true, isBlockedLoading: false }) + const mockResponse = { block: true } + const fetchMock = jest.spyOn(window, 'fetch').mockResolvedValueOnce({ + json: jest.fn().mockResolvedValueOnce(mockResponse), + } as any) + renderHook(() => useAccountRiskCheck(account)) - expect(dispatchMock).toHaveBeenCalledWith(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) + + await waitFor(() => { + expect(fetchMock).toHaveBeenCalledWith('https://interface.gateway.uniswap.org/v1/screen', { + method: 'POST', + headers: new Headers({ + 'Content-Type': 'application/json', + }), + body: JSON.stringify({ address: account }), + }) + + expect(dispatchMock).toHaveBeenCalledWith(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) + }) }) it('should handle non-blocked account', async () => { const account = 'non-blocked-account' - mocked(useIsBlocked).mockReturnValue({ isBlocked: false, isBlockedLoading: false }) + const mockResponse = { block: false } + const fetchMock = jest.spyOn(window, 'fetch').mockResolvedValueOnce({ + json: jest.fn().mockResolvedValueOnce(mockResponse), + } as any) + renderHook(() => useAccountRiskCheck(account)) - expect(dispatchMock).not.toHaveBeenCalledWith(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) + + await waitFor(() => { + expect(fetchMock).toHaveBeenCalledWith('https://interface.gateway.uniswap.org/v1/screen', { + method: 'POST', + headers: new Headers({ + 'Content-Type': 'application/json', + }), + body: JSON.stringify({ address: account }), + }) + + expect(dispatchMock).not.toHaveBeenCalledWith(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) + }) }) }) diff --git a/apps/web/src/hooks/useAccountRiskCheck.ts b/apps/web/src/hooks/useAccountRiskCheck.ts index a7d6e96da52..8e006872683 100644 --- a/apps/web/src/hooks/useAccountRiskCheck.ts +++ b/apps/web/src/hooks/useAccountRiskCheck.ts @@ -1,23 +1,30 @@ import { useEffect } from 'react' import { ApplicationModal, setOpenModal } from 'state/application/reducer' import { useAppDispatch } from 'state/hooks' -import { useIsBlocked } from 'uniswap/src/features/trm/hooks' export default function useAccountRiskCheck(account: string | null | undefined) { const dispatch = useAppDispatch() - const { isBlocked, isBlockedLoading } = useIsBlocked(account || undefined) useEffect(() => { if (!account) { return } - if (isBlockedLoading) { - return - } - - if (isBlocked) { - dispatch(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) - } - }, [account, isBlockedLoading, isBlocked, dispatch]) + // TODO: add back local browser cacheing (revisit 11/13/2023) + const headers = new Headers({ 'Content-Type': 'application/json' }) + fetch('https://interface.gateway.uniswap.org/v1/screen', { + method: 'POST', + headers, + body: JSON.stringify({ address: account }), + }) + .then((res) => res.json()) + .then((data) => { + if (data.block) { + dispatch(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) + } + }) + .catch(() => { + dispatch(setOpenModal(null)) + }) + }, [account, dispatch]) } diff --git a/apps/web/src/hooks/useIsExplorePage.ts b/apps/web/src/hooks/useIsExplorePage.ts deleted file mode 100644 index ba2ff4b3f81..00000000000 --- a/apps/web/src/hooks/useIsExplorePage.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useLocation } from 'react-router-dom' -export function useIsExplorePage() { - const { pathname } = useLocation() - return pathname.includes('/explore') -} diff --git a/apps/web/src/hooks/useShowSwapNetworkNotification.ts b/apps/web/src/hooks/useShowSwapNetworkNotification.ts deleted file mode 100644 index 8b33a8e882e..00000000000 --- a/apps/web/src/hooks/useShowSwapNetworkNotification.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { useCallback } from 'react' -import { useAddPopup, useRemovePopup } from 'state/application/hooks' -import { PopupType } from 'state/application/reducer' -import { SwapTab } from 'uniswap/src/types/screens/interface' - -export function useShowSwapNetworkNotification() { - const addPopup = useAddPopup() - const removePopup = useRemovePopup() - - return useCallback( - (chainId?: number, prevChainId?: number) => { - if (!chainId || !prevChainId || chainId === prevChainId) { - return - } - removePopup(`switchNetwork-${prevChainId}`) - addPopup( - { - type: PopupType.SwitchNetwork, - chainId, - action: SwapTab.Swap, - }, - `switchNetwork-${chainId}`, - 3000, - ) - }, - [addPopup, removePopup], - ) -} diff --git a/apps/web/src/hooks/useSwitchChain.ts b/apps/web/src/hooks/useSwitchChain.ts index 64e28b880e1..3d2553afa17 100644 --- a/apps/web/src/hooks/useSwitchChain.ts +++ b/apps/web/src/hooks/useSwitchChain.ts @@ -18,7 +18,7 @@ export function useSwitchChain() { const isSupportedChainCallback = useIsSupportedChainIdCallback() const multichainUXEnabled = useFeatureFlag(FeatureFlags.MultichainUX) const { switchChain } = useSwitchChainWagmi() - const account = useAccount() + const { connector } = useAccount() const [searchParams, setSearchParams] = useSearchParams() const { pathname } = useLocation() @@ -28,11 +28,7 @@ export function useSwitchChain() { (chainId: InterfaceChainId) => { const isSupportedChain = isSupportedChainCallback(chainId) if (!isSupportedChain) { - throw new Error(`Chain ${chainId} not supported for connector (${account.connector?.name})`) - } - if (account.chainId === chainId) { - // some wallets (e.g. SafeWallet) only support single-chain & will throw error on `switchChain` even if already on the correct chain - return + throw new Error(`Chain ${chainId} not supported for connector (${connector?.name})`) } return trace( { name: 'Switch chain', op: 'wallet.switch_chain' }, @@ -71,8 +67,7 @@ export function useSwitchChain() { }, [ isSupportedChainCallback, - account.chainId, - account.connector?.name, + connector?.name, dispatch, switchChain, multichainUXEnabled, diff --git a/apps/web/src/hooks/useUniswapWalletOptions.ts b/apps/web/src/hooks/useUniswapWalletOptions.ts index b58e0709ba8..6ea04ed7436 100644 --- a/apps/web/src/hooks/useUniswapWalletOptions.ts +++ b/apps/web/src/hooks/useUniswapWalletOptions.ts @@ -1,18 +1,30 @@ +import { useConnectorWithId } from 'components/WalletModal/useOrderedConnections' import { CONNECTION } from 'components/Web3Provider/constants' import { useAccount } from 'hooks/useAccount' +import { FeatureFlags } from 'uniswap/src/features/gating/flags' +import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' -// -// Checks if the user is connected to the uniswap extension. -// -// This hook returns `true` under the following conditions: -// -// - The user has not connected to a different wallet -// -// @returns {boolean} True if the user is not connected a different wallet; otherwise, false. -// +export function useUniswapWalletOptions() { + const isGALive = useFeatureFlag(FeatureFlags.ExtensionLaunch) + + const isExtensionInstalled = Boolean(useConnectorWithId(CONNECTION.UNISWAP_EXTENSION_RDNS)) + + return isExtensionInstalled || isGALive +} + +/** + * Checks if the `extension_launch` feature flag is enabled and if the user is not connected a different wallet. + * + * This hook returns `true` under the following conditions: + * - The `extension_launch` feature flag is set to `true`. + * - The user has not connected to a different wallet + * + * @returns {boolean} True if the extension launch feature is enabled and the user is not connected a different wallet; otherwise, false. + */ export function useIsUniExtensionAvailable() { + const isGALive = useFeatureFlag(FeatureFlags.ExtensionLaunch) const currentConnector = useAccount().connector const currentConnectIsNotUniExtension = currentConnector && currentConnector.id !== CONNECTION.UNISWAP_EXTENSION_RDNS - return !currentConnectIsNotUniExtension + return isGALive && !currentConnectIsNotUniExtension } diff --git a/apps/web/src/lib/utils/searchBar.test.ts b/apps/web/src/lib/utils/searchBar.test.ts deleted file mode 100644 index db0a3f92784..00000000000 --- a/apps/web/src/lib/utils/searchBar.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { NATIVE_CHAIN_ID } from 'constants/tokens' -import { searchTokenToTokenSearchResult } from 'lib/utils/searchBar' -import { getNativeAddress } from 'uniswap/src/constants/addresses' -import { - Chain, - SafetyLevel, - TokenStandard, -} from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { SearchResultType } from 'uniswap/src/features/search/SearchResult' -import { UniverseChainId } from 'uniswap/src/types/chains' - -describe('searchBar', () => { - describe('searchTokenToTokenSearchResult', () => { - describe(`${NATIVE_CHAIN_ID}`, () => { - it('accepts a searchToken and returns a TokenSearchResult', () => { - const ethSearchResult = { - type: SearchResultType.Token, - chainId: UniverseChainId.Mainnet, - address: null, - logoUrl: 'eth-logo.png', - symbol: 'ETH', - name: 'Ethereum', - safetyLevel: SafetyLevel.Verified, - } - - expect( - searchTokenToTokenSearchResult({ - decimals: 18, - name: 'Ethereum', - chain: Chain.Ethereum, - // This is not a mistake, sometimes the standard for ETH is ERC20 - // in search results. - standard: TokenStandard.Erc20, - address: NATIVE_CHAIN_ID, - symbol: 'ETH', - chainId: UniverseChainId.Mainnet, - // @ts-ignore - project: { - logoUrl: 'eth-logo.png', - safetyLevel: SafetyLevel.Verified, - }, - }), - ).toEqual(ethSearchResult) - - expect( - searchTokenToTokenSearchResult({ - decimals: 18, - name: 'Ethereum', - chain: Chain.Ethereum, - // This is not a mistake, sometimes the standard for ETH is ERC20 - // in search results. - standard: TokenStandard.Erc20, - address: NATIVE_CHAIN_ID, - symbol: 'ETH', - chainId: UniverseChainId.Mainnet, - // @ts-ignore - project: { - logoUrl: 'eth-logo.png', - safetyLevel: SafetyLevel.Verified, - }, - }), - ).toEqual(ethSearchResult) - - expect( - searchTokenToTokenSearchResult({ - decimals: 18, - name: 'Polygon', - chain: Chain.Polygon, - standard: TokenStandard.Erc20, - address: NATIVE_CHAIN_ID, - symbol: 'MATIC', - chainId: UniverseChainId.Polygon, - // @ts-ignore - project: { - logoUrl: 'matic-logo.png', - safetyLevel: SafetyLevel.Verified, - }, - }), - ).toEqual({ - type: SearchResultType.Token, - chainId: UniverseChainId.Polygon, - address: getNativeAddress(UniverseChainId.Polygon), - logoUrl: 'matic-logo.png', - symbol: 'MATIC', - name: 'Polygon', - safetyLevel: SafetyLevel.Verified, - }) - }) - }) - describe(`${TokenStandard.Erc20}`, () => { - it('accepts a searchToken and returns a TokenSearchResult', () => { - const tokenSearchResult = { - type: SearchResultType.Token, - chainId: 1, - address: '0x123', - logoUrl: 'token-logo.png', - symbol: 'ABC', - name: 'ABC Token', - safetyLevel: SafetyLevel.Verified, - } - - expect( - searchTokenToTokenSearchResult({ - decimals: 18, - name: 'ABC Token', - chain: Chain.Ethereum, - standard: TokenStandard.Erc20, - address: '0x123', - symbol: 'ABC', - chainId: 1, - // @ts-ignore - project: { - logoUrl: 'token-logo.png', - safetyLevel: SafetyLevel.Verified, - }, - }), - ).toEqual(tokenSearchResult) - }) - }) - }) -}) diff --git a/apps/web/src/lib/utils/searchBar.ts b/apps/web/src/lib/utils/searchBar.ts index 16cc51a8bf7..8adcdf81f07 100644 --- a/apps/web/src/lib/utils/searchBar.ts +++ b/apps/web/src/lib/utils/searchBar.ts @@ -1,11 +1,7 @@ -import { GqlSearchToken } from 'graphql/data/SearchTokens' +import { SearchToken, TokenSearchResultWeb } from 'graphql/data/SearchTokens' import { GenieCollection } from 'nft/types' -import { - NFTCollectionSearchResult, - SearchResultType, - TokenSearchResult, -} from 'uniswap/src/features/search/SearchResult' -import { tokenAddressOrNativeAddress } from 'uniswap/src/features/search/utils' +import { Chain } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' +import { SearchResultType } from 'uniswap/src/features/search/SearchResult' import { UniverseChainId } from 'uniswap/src/types/chains' /** @@ -18,9 +14,9 @@ import { UniverseChainId } from 'uniswap/src/types/chains' */ export function organizeSearchResults( isNFTPage: boolean, - tokenResults: GqlSearchToken[], + tokenResults: SearchToken[], collectionResults: GenieCollection[], -): [GqlSearchToken[], GenieCollection[]] { +): [SearchToken[], GenieCollection[]] { const reducedTokens = tokenResults?.slice(0, isNFTPage ? 3 : collectionResults.length < 3 ? 8 - collectionResults.length : 5) ?? [] const reducedCollections = collectionResults.slice(0, 8 - reducedTokens.length) @@ -28,26 +24,32 @@ export function organizeSearchResults( } export const searchTokenToTokenSearchResult = ( - searchToken: GqlSearchToken & { chainId: UniverseChainId; address: string }, -): TokenSearchResult => { + searchToken: SearchToken & { chainId: UniverseChainId; address: string; isToken: boolean; isNative: boolean }, +): TokenSearchResultWeb => { return { type: SearchResultType.Token, + chain: searchToken.chain, chainId: searchToken.chainId, symbol: searchToken.symbol ?? '', - address: tokenAddressOrNativeAddress(searchToken.address, searchToken.chainId), + address: searchToken.address, name: searchToken.name ?? null, + isToken: searchToken.isToken, + isNative: searchToken.isNative, logoUrl: searchToken.project?.logoUrl ?? null, safetyLevel: searchToken.project?.safetyLevel ?? null, } } -export const searchGenieCollectionToTokenSearchResult = (searchToken: GenieCollection): NFTCollectionSearchResult => { +export const searchGenieCollectionToTokenSearchResult = (searchToken: GenieCollection): TokenSearchResultWeb => { return { type: SearchResultType.NFTCollection, + chain: Chain.Ethereum, chainId: UniverseChainId.Mainnet, + symbol: '', address: searchToken.address ?? '', - name: searchToken.name ?? '', - imageUrl: searchToken.imageUrl, - isVerified: searchToken.isVerified ?? false, + name: searchToken.name ?? null, + logoUrl: searchToken.imageUrl, + safetyLevel: null, + isNft: true, } } diff --git a/apps/web/src/pages/AddLiquidity/index.tsx b/apps/web/src/pages/AddLiquidity/index.tsx index d2552b244cb..2db735958db 100644 --- a/apps/web/src/pages/AddLiquidity/index.tsx +++ b/apps/web/src/pages/AddLiquidity/index.tsx @@ -622,9 +622,7 @@ function AddLiquidity() { } error={!isValid && !!parsedAmounts[Field.CURRENCY_A] && !!parsedAmounts[Field.CURRENCY_B]} > - - {errorMessage ? errorMessage : } - + {errorMessage ? errorMessage : } ) @@ -702,7 +700,7 @@ function AddLiquidity() { )} bottomContent={() => ( - + diff --git a/apps/web/src/pages/Explore/charts/ExploreChartsSection.tsx b/apps/web/src/pages/Explore/charts/ExploreChartsSection.tsx index 4499e8211bb..641115b6852 100644 --- a/apps/web/src/pages/Explore/charts/ExploreChartsSection.tsx +++ b/apps/web/src/pages/Explore/charts/ExploreChartsSection.tsx @@ -8,23 +8,18 @@ import { CustomVolumeChartModel } from 'components/Charts/VolumeChart/CustomVolu import { StackedHistogramData } from 'components/Charts/VolumeChart/renderer' import { getCumulativeSum, getCumulativeVolume, getVolumeProtocolInfo } from 'components/Charts/VolumeChart/utils' import { ChartType } from 'components/Charts/utils' +import Column from 'components/Column' +import { RowBetween } from 'components/Row' import { DataQuality } from 'components/Tokens/TokenDetails/ChartSection/util' import { MAX_WIDTH_MEDIA_BREAKPOINT } from 'components/Tokens/constants' import { SupportedInterfaceChainId, chainIdToBackendChain, useChainFromUrlParam } from 'constants/chains' import { useDailyProtocolTVL, useHistoricalProtocolVolume } from 'graphql/data/protocolStats' -import { TimePeriod, getProtocolColor, getProtocolGradient, getSupportedGraphQlChain } from 'graphql/data/util' +import { TimePeriod, getProtocolColor, getSupportedGraphQlChain } from 'graphql/data/util' import { useScreenSize } from 'hooks/screenSize' -import { useTheme } from 'lib/styled-components' +import styled, { useTheme } from 'lib/styled-components' import { ReactNode, useMemo, useState } from 'react' -import { - useDailyProtocolTVL as useRestDailyProtocolTVL, - useHistoricalProtocolVolume as useRestHistoricalProtocolVolume, -} from 'state/explore/protocolStats' -import { EllipsisTamaguiStyle } from 'theme/components' -import { Flex, Text, styled } from 'ui/src' +import { EllipsisStyle, ThemedText } from 'theme/components' import { HistoryDuration, PriceSource } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag, useFeatureFlagWithLoading } from 'uniswap/src/features/gating/hooks' import { Trans } from 'uniswap/src/i18n' import { NumberType, useFormatter } from 'utils/formatNumbers' @@ -37,50 +32,54 @@ const TIME_SELECTOR_OPTIONS = [ { time: TimePeriod.MONTH, display: 'M' }, ] -const ChartsContainer = styled(Flex, { - row: true, - justifyContent: 'space-between', - maxWidth: MAX_WIDTH_MEDIA_BREAKPOINT, - width: '100%', - ml: 'auto', - mr: 'auto', - pb: 56, -}) - +const StyledTimePeriodSelector = styled(TimePeriodSelector)` + & > button { + padding: 4px 8px; + margin: 4px 0px; + font-size: 14px; + } +` +const ChartsContainer = styled(RowBetween)` + max-width: ${MAX_WIDTH_MEDIA_BREAKPOINT}; + width: 100%; + margin-left: auto; + margin-right: auto; + padding-bottom: 56px; +` // a 6% gap is achieved using two 47% width containers, as a parent gap causes an autosizing error with side-by-side lightweight-charts -const SectionContainer = styled(Flex, { - position: 'relative', - width: '47%', - gap: '$gap4', - ...EllipsisTamaguiStyle, - $md: { - backgroundColor: '$surface2', - borderRadius: '$rounded20', - height: 120, - p: '$padding20', - }, - $xs: { - height: 112, - p: '$padding16', - }, -}) +const SectionContainer = styled(Column)` + position: relative; + width: 47%; + gap: 4px; + + > * { + ${EllipsisStyle} + } -const SectionTitle = styled(Text, { - name: 'SectionTitle', - fontWeight: '300', - whiteSpace: 'nowrap', - color: '$neutral2', - lineHeight: 24, -}) + @media only screen and (max-width: ${({ theme }) => `${theme.breakpoint.sm}px`}) { + background-color: ${({ theme }) => theme.surface2}; + border-radius: 20px; + height: 120px; + padding: 20px; + } + + @media only screen and (max-width: ${({ theme }) => `${theme.breakpoint.xs}px`}) { + height: 112px; + padding: 16px; + } +` +const SectionTitle = styled(ThemedText.SubHeader)` + color: ${({ theme }) => theme.neutral2}; + white-space: nowrap; +` +const StyledChart: typeof Chart = styled(Chart)` + height: ${EXPLORE_CHART_HEIGHT_PX}px; +` function VolumeChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) { const [timePeriod, setTimePeriod] = useState(TimePeriod.DAY) const theme = useTheme() const isSmallScreen = !useScreenSize()['sm'] - const { value: isMultichainExploreEnabledLoaded, isLoading: isMultichainExploreLoading } = useFeatureFlagWithLoading( - FeatureFlags.MultichainExplore, - ) - const isMultichainExploreEnabled = isMultichainExploreEnabledLoaded || isMultichainExploreLoading function timeGranularityToHistoryDuration(timePeriod: TimePeriod): HistoryDuration { // note: timePeriod on the Explore Page represents the GRANULARITY, not the timespan of data shown. @@ -96,43 +95,19 @@ function VolumeChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) } } - const { - entries: gqlEntries, - loading: gqlLoading, - dataQuality: gqlDataQuality, - } = useHistoricalProtocolVolume( + const { entries, loading, dataQuality } = useHistoricalProtocolVolume( chainIdToBackendChain({ chainId, withFallback: true }), isSmallScreen ? HistoryDuration.Month : timeGranularityToHistoryDuration(timePeriod), ) - const { - entries: restEntries, - loading: restLoading, - dataQuality: restDataQuality, - } = useRestHistoricalProtocolVolume( - isSmallScreen ? HistoryDuration.Month : timeGranularityToHistoryDuration(timePeriod), - ) - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) - const { entries, loading, dataQuality } = isRestExploreEnabled - ? { entries: restEntries, loading: restLoading, dataQuality: restDataQuality } - : { entries: gqlEntries, loading: gqlLoading, dataQuality: gqlDataQuality } - const params = useMemo<{ - data: StackedHistogramData[] - colors: [string, string] - useThinCrosshair: boolean - headerHeight: number - isMultichainExploreEnabled: boolean - background: string - }>( + + const params = useMemo<{ data: StackedHistogramData[]; colors: [string, string]; headerHeight: number }>( () => ({ data: entries, colors: [theme.accent1, theme.accent3], - headerHeight: isMultichainExploreEnabled ? 0 : 80, + headerHeight: 85, stale: dataQuality === DataQuality.STALE, - useThinCrosshair: isMultichainExploreEnabled, - isMultichainExploreEnabled, - background: theme.background, }), - [entries, theme.accent1, theme.accent3, theme.background, isMultichainExploreEnabled, dataQuality], + [entries, dataQuality, theme.accent1, theme.accent3], ) const cumulativeVolume = useMemo(() => getCumulativeVolume(entries), [entries]) @@ -148,16 +123,18 @@ function VolumeChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) return ( - + - - +
+ +
+ {(() => { if (dataQuality === DataQuality.INVALID) { const errorText = loading ? undefined : @@ -166,14 +143,7 @@ function VolumeChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) ) } return ( - } - params={params} - height={EXPLORE_CHART_HEIGHT_PX} - > + } params={params}> {(crosshairData) => ( )} - + ) })()}
@@ -191,28 +161,15 @@ function VolumeChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) function TVLChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) { const theme = useTheme() - const isMultichainExploreEnabled = useFeatureFlag(FeatureFlags.MultichainExplore) - const { - entries: gqlEntries, - loading: gqlLoading, - dataQuality: gqlDataQuality, - } = useDailyProtocolTVL(chainIdToBackendChain({ chainId })) - const { entries: restEntries, loading: restLoading, dataQuality: restDataQuality } = useRestDailyProtocolTVL() - const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) - const { entries, loading, dataQuality } = isRestExploreEnabled - ? { entries: restEntries, loading: restLoading, dataQuality: restDataQuality } - : { entries: gqlEntries, loading: gqlLoading, dataQuality: gqlDataQuality } + const { entries, loading, dataQuality } = useDailyProtocolTVL(chainIdToBackendChain({ chainId })) const lastEntry = entries[entries.length - 1] const params = useMemo( () => ({ data: entries, colors: EXPLORE_PRICE_SOURCES?.map((source) => getProtocolColor(source, theme)) ?? [theme.accent1], - gradients: isMultichainExploreEnabled - ? EXPLORE_PRICE_SOURCES?.map((source) => getProtocolGradient(source)) - : undefined, }), - [entries, isMultichainExploreEnabled, theme], + [entries, theme], ) const isSmallScreen = !useScreenSize()['sm'] @@ -223,7 +180,7 @@ function TVLChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) { return ( - + {(() => { @@ -233,7 +190,7 @@ function TVLChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) { } return ( - + {(crosshairData) => ( (sum += v), 0)} @@ -244,7 +201,7 @@ function TVLChartSection({ chainId }: { chainId: SupportedInterfaceChainId }) { }))} /> )} - + ) })()} @@ -256,13 +213,11 @@ function MinimalStatDisplay({ title, value, time }: { title: ReactNode; value: n return ( - {title} - {formatFiatPrice({ price: value, type: NumberType.ChartFiatValue })} - {time && ( - - {time} - - )} + {title} + + {formatFiatPrice({ price: value, type: NumberType.ChartFiatValue })} + + {time && {time}} ) } diff --git a/apps/web/src/pages/Explore/index.tsx b/apps/web/src/pages/Explore/index.tsx index 8b8e3508e4f..61c266bdde5 100644 --- a/apps/web/src/pages/Explore/index.tsx +++ b/apps/web/src/pages/Explore/index.tsx @@ -1,5 +1,6 @@ import { InterfaceElementName, InterfacePageName, SharedEventName } from '@uniswap/analytics-events' import { TopPoolTable } from 'components/Pools/PoolTable/PoolTable' +import { AutoRow } from 'components/Row' import { TopTokensTable } from 'components/Tokens/TokenTable' import TableNetworkFilter from 'components/Tokens/TokenTable/NetworkFilter' import SearchBar from 'components/Tokens/TokenTable/SearchBar' @@ -10,21 +11,66 @@ import { manualChainOutageAtom } from 'featureFlags/flags/outageBanner' import { getTokenExploreURL, isBackendSupportedChain } from 'graphql/data/util' import { useOnGlobalChainSwitch } from 'hooks/useGlobalChainSwitch' import { useResetAtom } from 'jotai/utils' +import styled from 'lib/styled-components' import { ExploreChartsSection } from 'pages/Explore/charts/ExploreChartsSection' import { useExploreParams } from 'pages/Explore/redirects' import RecentTransactions from 'pages/Explore/tables/RecentTransactions' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' -import { ExploreContextProvider } from 'state/explore' -import { StyledInternalLink } from 'theme/components' -import { Flex, Text } from 'ui/src' +import { StyledInternalLink, ThemedText } from 'theme/components' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' -import { FeatureFlags } from 'uniswap/src/features/gating/flags' -import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import Trace from 'uniswap/src/features/telemetry/Trace' import { Trans } from 'uniswap/src/i18n' import { UniverseChainId } from 'uniswap/src/types/chains' +const ExploreContainer = styled.div` + width: 100%; + min-width: 320px; + padding: 48px 40px 0px; + + @media only screen and (max-width: ${({ theme }) => `${theme.breakpoint.sm}px`}) { + padding: 16px; + padding-bottom: 0px; + } +` + +const NavWrapper = styled.div` + display: flex; + max-width: ${MAX_WIDTH_MEDIA_BREAKPOINT}; + margin: 0 auto; + margin-bottom: 4px; + color: ${({ theme }) => theme.neutral3}; + flex-direction: row; + justify-content: space-between; + @media screen and (max-width: ${({ theme }) => `${theme.breakpoint.lg}px`}) { + flex-direction: column; + gap: 16px; + } +` +const TabBar = styled(AutoRow)` + gap: 24px; + @media screen and (max-width: ${({ theme }) => theme.breakpoint.md}px) { + gap: 16px; + } +` +const TabItem = styled(ThemedText.HeadlineMedium)<{ active?: boolean }>` + align-items: center; + color: ${({ theme, active }) => (active ? theme.neutral1 : theme.neutral2)}; + cursor: pointer; + transition: ${({ theme }) => `${theme.transition.duration.medium} ${theme.transition.timing.ease} color`}; + + @media screen and (max-width: ${({ theme }) => theme.breakpoint.md}px) { + font-size: 24px !important; + line-height: 32px !important; + } +` +const FiltersContainer = styled.div` + display: flex; + gap: 8px; + height: 40px; + justify-content: flex-start; +` + export enum ExploreTab { Tokens = 'tokens', Pools = 'pools', @@ -62,7 +108,6 @@ const Pages: Array = [ const Explore = ({ initialTab }: { initialTab?: ExploreTab }) => { const tabNavRef = useRef(null) const resetManualOutage = useResetAtom(manualChainOutageAtom) - const isMultichainExploreEnabled = useFeatureFlag(FeatureFlags.MultichainExplore) const initialKey: number = useMemo(() => { const key = initialTab && Pages.findIndex((page) => page.key === initialTab) @@ -87,13 +132,7 @@ const Explore = ({ initialTab }: { initialTab?: ExploreTab }) => { // to allow backward navigation between tabs const { tab: tabName } = useExploreParams() const tab = tabName ?? ExploreTab.Tokens - - const chainWithoutFallback = useChainFromUrlParam() - const chain = useMemo(() => { - return isMultichainExploreEnabled - ? chainWithoutFallback - : chainWithoutFallback ?? UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet] - }, [chainWithoutFallback, isMultichainExploreEnabled]) + const chain = useChainFromUrlParam() ?? UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet] useEffect(() => { const tabIndex = Pages.findIndex((page) => page.key === tab) if (tabIndex !== -1) { @@ -118,80 +157,38 @@ const Explore = ({ initialTab }: { initialTab?: ExploreTab }) => { ) return ( - - - - - - - {Pages.map(({ title, loggingElementName, key }, index) => { - // hide Transactions tab if no chain is selected and multichain explore is enabled - return key === ExploreTab.Transactions && isMultichainExploreEnabled && !chain ? null : ( - + + + + + {Pages.map(({ title, loggingElementName, key }, index) => { + return ( + + - setCurrentTab(index)} - to={ - `/explore/${key}` + - (chain?.id || (!isMultichainExploreEnabled && chain?.id !== UniverseChainId.Mainnet) - ? `/${chain?.urlParam}` - : '') - } - > - - {title} - - - - ) - })} - - - - {currentKey === ExploreTab.Tokens && } - {currentKey !== ExploreTab.Transactions && } - - - - - + setCurrentTab(index)} active={currentTab === index} key={key}> + {title} + + + + ) + })} + + + + {currentKey === ExploreTab.Tokens && } + {currentKey !== ExploreTab.Transactions && } + + + + ) } diff --git a/apps/web/src/pages/Explore/tables/RecentTransactions.tsx b/apps/web/src/pages/Explore/tables/RecentTransactions.tsx index 3f4a1d11a5b..bcc1034da08 100644 --- a/apps/web/src/pages/Explore/tables/RecentTransactions.tsx +++ b/apps/web/src/pages/Explore/tables/RecentTransactions.tsx @@ -1,5 +1,6 @@ import { ApolloError } from '@apollo/client' import { createColumnHelper } from '@tanstack/react-table' +import Row from 'components/Row' import { Table } from 'components/Table' import { Cell } from 'components/Table/Cell' import { Filter } from 'components/Table/Filter' @@ -16,8 +17,9 @@ import { useUpdateManualOutage } from 'featureFlags/flags/outageBanner' import { BETypeToTransactionType, TransactionType, useAllTransactions } from 'graphql/data/useAllTransactions' import { OrderDirection, getSupportedGraphQlChain } from 'graphql/data/util' import { useActiveLocalCurrency } from 'hooks/useActiveLocalCurrency' -import { useMemo, useReducer, useRef, useState } from 'react' -import { Flex, Text, styled } from 'ui/src' +import { useMemo, useReducer, useState } from 'react' +import { ThemedText } from 'theme/components' +import { Text } from 'ui/src' import { PoolTransaction, PoolTransactionType, @@ -27,17 +29,10 @@ import { shortenAddress } from 'utilities/src/addresses' import { useFormatter } from 'utils/formatNumbers' import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' -const TableRow = styled(Flex, { - row: true, - gap: '$gap4', - alignItems: 'center', -}) - export default function RecentTransactions() { const activeLocalCurrency = useActiveLocalCurrency() const { formatNumber, formatFiatPrice } = useFormatter() const [filterModalIsOpen, toggleFilterModal] = useReducer((s) => !s, false) - const filterAnchorRef = useRef(null) const [filter, setFilters] = useState([ TransactionType.SWAP, TransactionType.REMOVE, @@ -61,12 +56,12 @@ export default function RecentTransactions() { id: 'timestamp', header: () => ( - + - + - +
), cell: (transaction) => ( @@ -82,27 +77,27 @@ export default function RecentTransactions() { id: 'swap-type', header: () => ( - toggleFilterModal()} ref={filterAnchorRef}> + toggleFilterModal()}> - + - + ), cell: (transaction) => { const amountWithSymbolA = ( <> - + {BETypeToTransactionType[transaction.getValue?.().type]} - + ) @@ -137,16 +132,12 @@ export default function RecentTransactions() { id: 'fiat-value', header: () => ( - - {activeLocalCurrency} - + {activeLocalCurrency} ), cell: (fiat) => ( - - {formatFiatPrice({ price: fiat.getValue?.() })} - + {formatFiatPrice({ price: fiat.getValue?.() })} ), }), @@ -154,21 +145,21 @@ export default function RecentTransactions() { id: 'token-amount-0', header: () => ( - + - + ), cell: (transaction) => ( - - + + {formatNumber({ input: Math.abs(parseFloat(transaction.getValue?.().token0Quantity)) || 0, })} - + - +
), }), @@ -176,21 +167,21 @@ export default function RecentTransactions() { id: 'token-amount-1', header: () => ( - + - + ), cell: (transaction) => ( - - + + {formatNumber({ input: Math.abs(parseFloat(transaction.getValue?.().token1Quantity)) || 0, })} - + - + ), }), @@ -198,9 +189,9 @@ export default function RecentTransactions() { id: 'maker-address', header: () => ( - + - + ), cell: (makerAddress) => ( diff --git a/apps/web/src/pages/Landing/index.tsx b/apps/web/src/pages/Landing/index.tsx index e04641f1b50..5688c90349b 100644 --- a/apps/web/src/pages/Landing/index.tsx +++ b/apps/web/src/pages/Landing/index.tsx @@ -6,7 +6,7 @@ import usePrevious from 'hooks/usePrevious' import LandingV2 from 'pages/Landing/LandingV2' import { parse } from 'qs' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { Navigate, useLocation, useNavigate } from 'react-router-dom' import { TRANSITION_DURATIONS } from 'theme/styles' import Trace from 'uniswap/src/features/telemetry/Trace' @@ -41,6 +41,13 @@ export default function Landing() { return () => clearTimeout(timeoutId) }, [account.address, prevAccount, accountDrawer, navigate, queryParams.intro, connector, disconnect]) + // Redirect to swap page if user is connected or has been recently + // The intro query parameter can be used to override this + + if (account.isConnected && !queryParams.intro) { + return + } + return ( diff --git a/apps/web/src/pages/Landing/sections/Hero.tsx b/apps/web/src/pages/Landing/sections/Hero.tsx index 547f2c88a9e..7aa233babb1 100644 --- a/apps/web/src/pages/Landing/sections/Hero.tsx +++ b/apps/web/src/pages/Landing/sections/Hero.tsx @@ -113,7 +113,7 @@ export function Hero({ scrollToRef, transition }: HeroProps) { pointerEvents="none" bottom={48} style={{ transform: `translate(0px, ${translateY}px)`, opacity: opacityY }} - $midHeight={{ display: 'none' }} + $short={{ display: 'none' }} > - setReceiveWETH((receiveWETH) => !receiveWETH)} - variant="branded" + isActive={receiveWETH} + toggle={() => setReceiveWETH((receiveWETH) => !receiveWETH)} /> diff --git a/apps/web/src/pages/PoolDetails/index.test.tsx b/apps/web/src/pages/PoolDetails/index.test.tsx index ae209c33fa2..6218df97871 100644 --- a/apps/web/src/pages/PoolDetails/index.test.tsx +++ b/apps/web/src/pages/PoolDetails/index.test.tsx @@ -2,10 +2,10 @@ import { usePoolData } from 'graphql/data/pools/usePoolData' import PoolDetails from 'pages/PoolDetails' import Router from 'react-router-dom' import store from 'state' +import { addSerializedToken } from 'state/user/reducer' import { mocked } from 'test-utils/mocked' import { validParams, validPoolDataResponse } from 'test-utils/pools/fixtures' import { render, screen, waitFor } from 'test-utils/render' -import { dismissTokenWarning } from 'uniswap/src/features/tokens/slice/slice' jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -33,8 +33,8 @@ describe('PoolDetailsPage', () => { jest.spyOn(Router, 'useParams').mockReturnValue(validParams) mocked(usePoolData).mockReturnValue(validPoolDataResponse) store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -44,8 +44,8 @@ describe('PoolDetailsPage', () => { }), ) store.dispatch( - dismissTokenWarning({ - token: { + addSerializedToken({ + serializedToken: { chainId: 1, address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', symbol: 'WETH', diff --git a/apps/web/src/pages/RemoveLiquidity/V3.tsx b/apps/web/src/pages/RemoveLiquidity/V3.tsx index cf6a7625247..995a1b1c1d7 100644 --- a/apps/web/src/pages/RemoveLiquidity/V3.tsx +++ b/apps/web/src/pages/RemoveLiquidity/V3.tsx @@ -13,6 +13,7 @@ import CurrencyLogo from 'components/Logo/CurrencyLogo' import { AddRemoveTabs } from 'components/NavigationTabs' import { AutoRow, RowBetween, RowFixed } from 'components/Row' import Slider from 'components/Slider' +import Toggle from 'components/Toggle' import TransactionConfirmationModal, { ConfirmationModalContent } from 'components/TransactionConfirmationModal' import { Break } from 'components/earn/styled' import { useIsSupportedChainId } from 'constants/chains' @@ -35,7 +36,7 @@ import { useTransactionAdder } from 'state/transactions/hooks' import { TransactionType } from 'state/transactions/types' import { useUserSlippageToleranceWithDefault } from 'state/user/hooks' import { ThemedText } from 'theme/components' -import { Switch, Text } from 'ui/src' +import { Text } from 'ui/src' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { Trans } from 'uniswap/src/i18n' import { logger } from 'utilities/src/logger/logger' @@ -463,11 +464,10 @@ function Remove({ tokenId }: { tokenId: BigNumber }) { }} /> - setReceiveWETH((receiveWETH) => !receiveWETH)} - variant="branded" + isActive={receiveWETH} + toggle={() => setReceiveWETH((receiveWETH) => !receiveWETH)} /> )} diff --git a/apps/web/src/pages/Swap/Buy/CountryListRow.tsx b/apps/web/src/pages/Swap/Buy/CountryListRow.tsx index 5e9e2c08ac6..631322fba60 100644 --- a/apps/web/src/pages/Swap/Buy/CountryListRow.tsx +++ b/apps/web/src/pages/Swap/Buy/CountryListRow.tsx @@ -7,9 +7,9 @@ import { FORCountry } from 'uniswap/src/features/fiatOnRamp/types' import { getCountryFlagSvgUrl } from 'uniswap/src/features/fiatOnRamp/utils' const RowWrapper = styled(Flex, { - row: true, height: '$spacing60', px: '$spacing20', + flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', cursor: 'pointer', diff --git a/apps/web/src/pages/Swap/Buy/PredefinedAmount.tsx b/apps/web/src/pages/Swap/Buy/PredefinedAmount.tsx index 45f6e582ae2..3f224e21f3d 100644 --- a/apps/web/src/pages/Swap/Buy/PredefinedAmount.tsx +++ b/apps/web/src/pages/Swap/Buy/PredefinedAmount.tsx @@ -43,7 +43,7 @@ export function PredefinedAmount({ currentAmount, amount, disabled = false, onCl foregroundColor={colors[disabled ? 'neutral3' : active ? 'neutral1' : 'neutral2'].val} label={formatFiatOnRampFiatAmount(amount, meldSupportedFiatCurrency ?? fallbackCurrencyInfo)} px="$spacing16" - textVariant="buttonLabel2" + textVariant="buttonLabel3" /> ) } diff --git a/apps/web/src/pages/Swap/Buy/__snapshots__/CountryListRow.test.tsx.snap b/apps/web/src/pages/Swap/Buy/__snapshots__/CountryListRow.test.tsx.snap index c12cbf2eb5c..58276abc8f9 100644 --- a/apps/web/src/pages/Swap/Buy/__snapshots__/CountryListRow.test.tsx.snap +++ b/apps/web/src/pages/Swap/Buy/__snapshots__/CountryListRow.test.tsx.snap @@ -12,7 +12,7 @@ exports[`CountryListRow should render 1`] = ` class=" t_light _dsp_contents is_Theme" >
@@ -67,7 +67,7 @@ exports[`PredefinedAmount renders correctly with amount= 300 , currentAmount= "1 style="border-color: rgba(34,34,34,0.05);" > @@ -109,7 +109,7 @@ exports[`PredefinedAmount renders correctly with amount= 1000 , currentAmount= " style="border-color: rgba(34,34,34,0.05);" > @@ -146,7 +146,7 @@ exports[`PredefinedAmount renders correctly with amount= 1000 , currentAmount= " style="border-color: rgba(34,34,34,0.05);" > diff --git a/apps/web/src/pages/Swap/Buy/__snapshots__/ProviderConnectionError.test.tsx.snap b/apps/web/src/pages/Swap/Buy/__snapshots__/ProviderConnectionError.test.tsx.snap index 4ff11c7f737..475bcf3657c 100644 --- a/apps/web/src/pages/Swap/Buy/__snapshots__/ProviderConnectionError.test.tsx.snap +++ b/apps/web/src/pages/Swap/Buy/__snapshots__/ProviderConnectionError.test.tsx.snap @@ -149,7 +149,7 @@ exports[`ProviderConnectionError should render the component and call callbacks class="t_sub_theme t_primary_Button _dsp_contents is_Theme" > diff --git a/packages/wallet/src/features/transactions/swap/modals/SwapFeeWarning.tsx b/packages/wallet/src/features/transactions/swap/modals/SwapFeeWarning.tsx index 62551ad2f0f..7a925c7dcfb 100644 --- a/packages/wallet/src/features/transactions/swap/modals/SwapFeeWarning.tsx +++ b/packages/wallet/src/features/transactions/swap/modals/SwapFeeWarning.tsx @@ -21,7 +21,7 @@ export function SwapFeeWarning({ noFee, children }: PropsWithChildren<{ noFee: b - + {t('common.button.learn')} diff --git a/packages/wallet/src/features/transactions/swap/modals/UniswapXInfo.tsx b/packages/wallet/src/features/transactions/swap/modals/UniswapXInfo.tsx index 08af151201c..e8469fa1914 100644 --- a/packages/wallet/src/features/transactions/swap/modals/UniswapXInfo.tsx +++ b/packages/wallet/src/features/transactions/swap/modals/UniswapXInfo.tsx @@ -24,7 +24,7 @@ export function UniswapXInfo({ } diff --git a/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.native.tsx b/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.native.tsx index 2c1e9d49c5e..2f0d1aa70ab 100644 --- a/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.native.tsx +++ b/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.native.tsx @@ -1,18 +1,18 @@ import { Currency, TradeType } from '@uniswap/sdk-core' import { useTranslation } from 'react-i18next' import { Flex, Text, TouchableArea, isWeb, useSporeColors } from 'ui/src' -import { AlertTriangleFilled } from 'ui/src/components/icons' +import { AlertTriangle } from 'ui/src/components/icons' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' import { fonts, iconSizes, spacing } from 'ui/src/theme' import { BottomSheetTextInput } from 'uniswap/src/components/modals/Modal' import { LearnMoreLink } from 'uniswap/src/components/text/LearnMoreLink' import { MAX_AUTO_SLIPPAGE_TOLERANCE, MAX_CUSTOM_SLIPPAGE_TOLERANCE } from 'uniswap/src/constants/transactions' import { uniswapUrls } from 'uniswap/src/constants/urls' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { Trade } from 'uniswap/src/features/transactions/swap/types/trade' import { getSymbolDisplayText } from 'uniswap/src/utils/currency' import { NumberType } from 'utilities/src/format/types' import PlusMinusButton, { PlusMinusButtonType } from 'wallet/src/components/buttons/PlusMinusButton' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { useSwapFormContext } from 'wallet/src/features/transactions/contexts/SwapFormContext' import { SwapSettingConfig } from 'wallet/src/features/transactions/swap/modals/settings/configs/types' import { useSlippageSettings } from 'wallet/src/features/transactions/swap/modals/settings/useSlippageSettings' @@ -36,7 +36,7 @@ export const Slippage: SwapSettingConfig = { {!isCustomSlippage ? ( - + {t('swap.settings.slippage.control.auto')} @@ -97,7 +97,7 @@ export const Slippage: SwapSettingConfig = { style={inputAnimatedStyle} > - + {t('swap.settings.slippage.control.auto')} @@ -142,7 +142,7 @@ export const Slippage: SwapSettingConfig = { }, } -function SlippageMessage({ +export function SlippageMessage({ inputWarning, trade, slippageTolerance, @@ -163,7 +163,7 @@ function SlippageMessage({ if (inputWarning) { return ( - + {inputWarning} @@ -189,7 +189,7 @@ function SlippageMessage({ {showSlippageWarning ? ( - + {t('swap.settings.slippage.warning.message')} diff --git a/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.tsx b/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.tsx index d712ba6c800..1b73e9a6b2b 100644 --- a/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.tsx +++ b/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.tsx @@ -1,9 +1,96 @@ -import { PlatformSplitStubError } from 'utilities/src/errors' +import { useState } from 'react' +import { useTranslation } from 'react-i18next' +import { LayoutChangeEvent } from 'react-native' +import { Flex, Input, Text } from 'ui/src' import { SwapSettingConfig } from 'wallet/src/features/transactions/swap/modals/settings/configs/types' +import { useSlippageSettings } from 'wallet/src/features/transactions/swap/modals/settings/useSlippageSettings' + +const INPUT_MIN_WIDTH = 44 export const Slippage: SwapSettingConfig = { renderTitle: (t) => t('swap.slippage.settings.title'), Control() { - throw new PlatformSplitStubError('Slippage') + const { t } = useTranslation() + + const [inputWidth, setInputWidth] = useState(0) + const { + isEditingSlippage, + autoSlippageEnabled, + inputSlippageTolerance, + autoSlippageTolerance, + inputAnimatedStyle, + onPressAutoSlippage, + onChangeSlippageInput, + onFocusSlippageInput, + onBlurSlippageInput, + } = useSlippageSettings() + + function onInputTextLayout(event: LayoutChangeEvent): void { + setInputWidth(event.nativeEvent.layout.width) + } + + const backgroundColor = isEditingSlippage ? '$surface2' : '$surface1' + const inputValue = autoSlippageEnabled ? autoSlippageTolerance.toFixed(2).toString() : inputSlippageTolerance + + return ( + + + + + {t('swap.settings.slippage.control.auto')} + + + + + + + {inputValue} + + + + % + + + + + ) }, } diff --git a/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.web.tsx b/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.web.tsx deleted file mode 100644 index 7972618cee5..00000000000 --- a/packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.web.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { useState } from 'react' -import { useTranslation } from 'react-i18next' -import { LayoutChangeEvent } from 'react-native' -import { Flex, Input, Text } from 'ui/src' -import { SwapSettingConfig } from 'wallet/src/features/transactions/swap/modals/settings/configs/types' -import { useSlippageSettings } from 'wallet/src/features/transactions/swap/modals/settings/useSlippageSettings' - -const INPUT_MIN_WIDTH = 44 - -export const Slippage: SwapSettingConfig = { - renderTitle: (t) => t('swap.slippage.settings.title'), - Control() { - const { t } = useTranslation() - - const [inputWidth, setInputWidth] = useState(0) - const { - isEditingSlippage, - autoSlippageEnabled, - inputSlippageTolerance, - autoSlippageTolerance, - inputAnimatedStyle, - onPressAutoSlippage, - onChangeSlippageInput, - onFocusSlippageInput, - onBlurSlippageInput, - } = useSlippageSettings() - - function onInputTextLayout(event: LayoutChangeEvent): void { - setInputWidth(event.nativeEvent.layout.width) - } - - const backgroundColor = isEditingSlippage ? '$surface2' : '$surface1' - const inputValue = autoSlippageEnabled ? autoSlippageTolerance.toFixed(2).toString() : inputSlippageTolerance - - return ( - - - - - {t('swap.settings.slippage.control.auto')} - - - - - - - {inputValue} - - - - % - - - - - ) - }, -} diff --git a/packages/wallet/src/features/transactions/swap/modals/settings/configs/SwapProtection.tsx b/packages/wallet/src/features/transactions/swap/modals/settings/configs/SwapProtection.tsx index a3c1772c2a2..982e2c7cf4e 100644 --- a/packages/wallet/src/features/transactions/swap/modals/settings/configs/SwapProtection.tsx +++ b/packages/wallet/src/features/transactions/swap/modals/settings/configs/SwapProtection.tsx @@ -1,9 +1,10 @@ import { useCallback } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' -import { Switch, Text } from 'ui/src' +import { isWeb, Text } from 'ui/src' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { FeatureFlags } from 'uniswap/src/features/gating/flags' +import { Switch as NativeSwitch, WebSwitch } from 'wallet/src/components/buttons/Switch' import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers' import { useSwapFormContext } from 'wallet/src/features/transactions/contexts/SwapFormContext' import { SwapSettingConfig } from 'wallet/src/features/transactions/swap/modals/settings/configs/types' @@ -41,12 +42,13 @@ export const SwapProtection: SwapSettingConfig = { } }, [dispatch, swapProtectionSetting]) + const Switch = isWeb ? WebSwitch : NativeSwitch + return ( ) }, diff --git a/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts b/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts index 3d3ce2e5ab8..bfd9c585d9f 100644 --- a/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/submitOrderSaga.test.ts @@ -1,8 +1,9 @@ import { Protocol } from '@uniswap/router-sdk' import { TradeType } from '@uniswap/sdk-core' +import axios from 'axios' import { testSaga } from 'redux-saga-test-plan' -import { submitOrder } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' import { OrderRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index' +import { TRADING_API_HEADERS } from 'uniswap/src/data/tradingApi/client' import { WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency' @@ -17,6 +18,7 @@ import { import { UniverseChainId } from 'uniswap/src/types/chains' import { currencyId } from 'uniswap/src/utils/currencyId' import { + ORDER_ENDPOINT, ORDER_STALENESS_THRESHOLD, SubmitUniswapXOrderParams, submitUniswapXOrder, @@ -77,7 +79,7 @@ describe(submitUniswapXOrder, () => { .next() .put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails }) .next() - .call(submitOrder, baseSubmitOrderParams.orderParams) + .call(axios.post, ORDER_ENDPOINT, baseSubmitOrderParams.orderParams, { headers: TRADING_API_HEADERS }) .next() .call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, { routing: Routing.DUTCH_V2, @@ -103,7 +105,7 @@ describe(submitUniswapXOrder, () => { .next() .put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails }) .next() - .call(submitOrder, baseSubmitOrderParams.orderParams) + .call(axios.post, ORDER_ENDPOINT, baseSubmitOrderParams.orderParams, { headers: TRADING_API_HEADERS }) .throw(new Error('pretend the order endpoint failed')) .put({ type: updateTransaction.type, @@ -139,7 +141,7 @@ describe(submitUniswapXOrder, () => { .next({ payload: { hash: approveTxHash, status: TransactionStatus.Success } }) .put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails }) .next() - .call(submitOrder, baseSubmitOrderParams.orderParams) + .call(axios.post, ORDER_ENDPOINT, baseSubmitOrderParams.orderParams, { headers: TRADING_API_HEADERS }) .next() .call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, { routing: Routing.DUTCH_V2, @@ -169,7 +171,7 @@ describe(submitUniswapXOrder, () => { .next({ payload: { hash: wrapTxHash, status: TransactionStatus.Success } }) .put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails }) .next() - .call(submitOrder, baseSubmitOrderParams.orderParams) + .call(axios.post, ORDER_ENDPOINT, baseSubmitOrderParams.orderParams, { headers: TRADING_API_HEADERS }) .next() .call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, { routing: Routing.DUTCH_V2, @@ -199,7 +201,7 @@ describe(submitUniswapXOrder, () => { .next({ payload: { hash: approveTxHash, status: TransactionStatus.Success } }) .put({ type: updateTransaction.type, payload: expectedSubmittedOrderDetails }) .next() - .call(submitOrder, baseSubmitOrderParams.orderParams) + .call(axios.post, ORDER_ENDPOINT, baseSubmitOrderParams.orderParams, { headers: TRADING_API_HEADERS }) .next() .call(sendAnalyticsEvent, WalletEventName.SwapSubmitted, { routing: Routing.DUTCH_V2, diff --git a/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts b/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts index 3bc1d471ee5..e22c55fd4e7 100644 --- a/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts +++ b/packages/wallet/src/features/transactions/swap/submitOrderSaga.ts @@ -1,6 +1,8 @@ +import axios from 'axios' import { call, put, take } from 'typed-redux-saga' -import { submitOrder } from 'uniswap/src/data/apiClients/tradingApi/TradingApiClient' +import { uniswapUrls } from 'uniswap/src/constants/urls' import { OrderRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index' +import { TRADING_API_HEADERS } from 'uniswap/src/data/tradingApi/client' import { WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { finalizeTransaction, transactionActions } from 'uniswap/src/features/transactions/slice' @@ -36,6 +38,8 @@ export interface SubmitUniswapXOrderParams { onFailure: () => void } +export const ORDER_ENDPOINT = uniswapUrls.tradingApiUrl + uniswapUrls.tradingApiPaths.order + export function* submitUniswapXOrder(params: SubmitUniswapXOrderParams) { const { orderParams, approveTxHash, wrapTxHash, txId, chainId, typeInfo, account, analytics, onSubmit, onFailure } = params @@ -94,7 +98,7 @@ export function* submitUniswapXOrder(params: SubmitUniswapXOrderParams) { try { const addedTime = Date.now() // refresh the addedTime to match the actual submission time yield* put(transactionActions.updateTransaction({ ...order, queueStatus: QueuedOrderStatus.Submitted, addedTime })) - yield* call(submitOrder, orderParams) + yield* call(axios.post, ORDER_ENDPOINT, orderParams, { headers: TRADING_API_HEADERS }) } catch { // In the rare event that submission fails, we update the order status to prompt the user. // If the app is closed before this catch block is reached, orderWatcherSaga will handle the failure upon reopening. diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts index eef4e6d32b3..39ccda09ab7 100644 --- a/packages/wallet/src/features/transactions/swap/swapSaga.test.ts +++ b/packages/wallet/src/features/transactions/swap/swapSaga.test.ts @@ -17,29 +17,23 @@ import { TransactionType, TransactionTypeInfo, } from 'uniswap/src/features/transactions/types/transactionDetails' -import { WETH } from 'uniswap/src/test/fixtures' import { UniverseChainId } from 'uniswap/src/types/chains' import { currencyId } from 'uniswap/src/utils/currencyId' -import { - SendTransactionParams, - sendTransaction, - tryGetNonce, -} from 'wallet/src/features/transactions/sendTransactionSaga' +import { SendTransactionParams, sendTransaction } from 'wallet/src/features/transactions/sendTransactionSaga' import { getBaseTradeAnalyticsProperties } from 'wallet/src/features/transactions/swap/analytics' import { SubmitUniswapXOrderParams, submitUniswapXOrder } from 'wallet/src/features/transactions/swap/submitOrderSaga' -import { SwapParams, approveAndSwap, shouldSubmitViaPrivateRpc } from 'wallet/src/features/transactions/swap/swapSaga' +import { + SwapParams, + approveAndSwap, + getNonceForApproveAndSwap, + shouldSubmitViaPrivateRpc, +} from 'wallet/src/features/transactions/swap/swapSaga' import { getProvider } from 'wallet/src/features/wallet/context' import { selectWalletSwapProtectionSetting } from 'wallet/src/features/wallet/selectors' import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' -import { signerMnemonicAccount } from 'wallet/src/test/fixtures' +import { WETH, signerMnemonicAccount } from 'wallet/src/test/fixtures' import { getTxProvidersMocks } from 'wallet/src/test/mocks' -jest.mock('uniswap/src/features/gating/sdk/statsig', () => ({ - Statsig: { - checkGate: jest.fn().mockReturnValue(true), - }, -})) - const account = signerMnemonicAccount() const CHAIN_ID = UniverseChainId.Mainnet @@ -85,7 +79,6 @@ const mockApproveTxRequest = { chainId: 1, to: DAI.address, data: '0x0', - nonce: 1, } const mockWrapTxRequest = { @@ -112,7 +105,6 @@ const classicSwapParams = { txRequest: mockSwapTxRequest, trade: mockTrade, gasFee: { value: '5', isLoading: false, error: null }, - gasFeeEstimation: {}, approvalError: false, }, onSubmit: jest.fn(), @@ -150,7 +142,6 @@ const expectedSendApprovalParams: SendTransactionParams = { tokenAddress: mockApproveTxRequest.to, spender: permit2Address(mockApproveTxRequest.chainId), swapTxId: '1', - estimatedGasFeeDetails: undefined, }, transactionOriginType: TransactionOriginType.Internal, analytics: { @@ -162,7 +153,7 @@ describe(approveAndSwap, () => { const sharedProviders: (EffectProviders | StaticProvider)[] = [ [select(selectWalletSwapProtectionSetting), SwapProtectionSetting.Off], [call(getProvider, mockSwapTxRequest.chainId), mockProvider], - [call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId), nonce], + [call(getNonceForApproveAndSwap, classicSwapParams.account.address, mockSwapTxRequest.chainId, false), nonce], ] it('sends a swap tx', async () => { @@ -205,7 +196,7 @@ describe(approveAndSwap, () => { .next() .call(shouldSubmitViaPrivateRpc, classicSwapParams.swapTxContext.txRequest.chainId) .next(false) - .call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId) + .call(getNonceForApproveAndSwap, classicSwapParams.account.address, mockSwapTxRequest.chainId, false) .next(nonce) .call(sendTransaction, expectedSendSwapParams) .next({ transactionResponse: { hash: '0xMockSwapTxHash' }, populatedRequest: {} }) @@ -222,6 +213,7 @@ describe(approveAndSwap, () => { txId: classicSwapParams.txId, transactionOriginType: TransactionOriginType.Internal, } + await expectSaga(approveAndSwap, classicSwapParams) .provide([ ...sharedProviders, @@ -236,13 +228,14 @@ describe(approveAndSwap, () => { ]) .call(sendTransaction, expectedSendSwapParams) .silentRun() + testSaga(approveAndSwap, classicSwapParams) .next() .call(classicSwapParams.onSubmit) .next() .call(shouldSubmitViaPrivateRpc, classicSwapParams.swapTxContext.txRequest.chainId) .next(false) - .call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId) + .call(getNonceForApproveAndSwap, classicSwapParams.account.address, mockSwapTxRequest.chainId, false) .next(nonce) .call(sendTransaction, expectedSendApprovalParams) .next({ transactionResponse: { hash: '0xMockApprovalTxHash' }, populatedRequest: {} }) @@ -279,7 +272,7 @@ describe(approveAndSwap, () => { testSaga(approveAndSwap, uniswapXSwapParams) .next() - .call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId) + .call(getNonceForApproveAndSwap, classicSwapParams.account.address, mockSwapTxRequest.chainId, false) .next(nonce) .call(sendTransaction, expectedSendApprovalParams) .next({ transactionResponse: { hash: '0xMockApprovalTxHash' }, populatedRequest: {} }) @@ -342,7 +335,7 @@ describe(approveAndSwap, () => { testSaga(approveAndSwap, uniswapXSwapEthInputParams) .next() - .call(tryGetNonce, classicSwapParams.account, mockSwapTxRequest.chainId) + .call(getNonceForApproveAndSwap, classicSwapParams.account.address, mockSwapTxRequest.chainId, false) .next(nonce) .call(sendTransaction, expectedSendApprovalParams) .next({ transactionResponse: { hash: '0xMockApprovalTxHash' }, populatedRequest: {} }) diff --git a/packages/wallet/src/features/transactions/swap/swapSaga.ts b/packages/wallet/src/features/transactions/swap/swapSaga.ts index 09f297f4470..5ed005b8e1e 100644 --- a/packages/wallet/src/features/transactions/swap/swapSaga.ts +++ b/packages/wallet/src/features/transactions/swap/swapSaga.ts @@ -3,20 +3,25 @@ import { call, select } from 'typed-redux-saga' import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index' import { FeatureFlags, getFeatureFlagName } from 'uniswap/src/features/gating/flags' import { Statsig } from 'uniswap/src/features/gating/sdk/statsig' +import { isClassic } from 'uniswap/src/features/transactions/swap/utils/routing' import { ApproveTransactionInfo, TransactionOriginType, + TransactionStatus, TransactionType, } from 'uniswap/src/features/transactions/types/transactionDetails' +import { RPCType } from 'uniswap/src/types/chains' import { logger } from 'utilities/src/logger/logger' import { isPrivateRpcSupportedOnChain } from 'wallet/src/features/providers' import { ValidatedSwapTxContext } from 'wallet/src/features/transactions/contexts/SwapTxContext' -import { sendTransaction, tryGetNonce } from 'wallet/src/features/transactions/sendTransactionSaga' +import { makeSelectAddressTransactions } from 'wallet/src/features/transactions/selectors' +import { sendTransaction } from 'wallet/src/features/transactions/sendTransactionSaga' import { getBaseTradeAnalyticsProperties } from 'wallet/src/features/transactions/swap/analytics' import { submitUniswapXOrder } from 'wallet/src/features/transactions/swap/submitOrderSaga' import { tradeToTransactionInfo } from 'wallet/src/features/transactions/swap/utils' import { wrap } from 'wallet/src/features/transactions/swap/wrapSaga' import { SignerMnemonicAccount } from 'wallet/src/features/wallet/accounts/types' +import { getProvider } from 'wallet/src/features/wallet/context' import { selectWalletSwapProtectionSetting } from 'wallet/src/features/wallet/selectors' import { SwapProtectionSetting } from 'wallet/src/features/wallet/slice' import { createMonitoredSaga } from 'wallet/src/utils/saga' @@ -35,6 +40,7 @@ export function* approveAndSwap(params: SwapParams) { const { swapTxContext, account, txId, analytics, onSubmit, onFailure } = params const { trade, routing, approveTxRequest } = swapTxContext const isUniswapX = routing === Routing.DUTCH_V2 + const { address } = account const chainId = swapTxContext.trade.inputAmount.currency.chainId @@ -46,11 +52,7 @@ export function* approveAndSwap(params: SwapParams) { // MEV protection is not needed for UniswapX approval and/or wrap transactions. const submitViaPrivateRpc = !isUniswapX && (yield* call(shouldSubmitViaPrivateRpc, chainId)) - // We must manually set the nonce when submitting multiple transactions in a row, - // otherwise for some L2s the Provider might fetch the same nonce for both transactions. - let nonce = yield* call(tryGetNonce, account, chainId) - - const gasFeeEstimation = swapTxContext.routing === Routing.CLASSIC ? swapTxContext.gasFeeEstimation : undefined + let nonce = yield* call(getNonceForApproveAndSwap, address, chainId, submitViaPrivateRpc) let approveTxHash: string | undefined // Approval Logic @@ -60,10 +62,9 @@ export function* approveAndSwap(params: SwapParams) { tokenAddress: approveTxRequest.to, spender: permit2Address(chainId), swapTxId: txId, - estimatedGasFeeDetails: gasFeeEstimation?.approvalFee, } - const options = { request: { ...approveTxRequest, nonce }, submitViaPrivateRpc } + const options = { request: approveTxRequest, submitViaPrivateRpc } const sendTransactionParams = { chainId, @@ -76,13 +77,13 @@ export function* approveAndSwap(params: SwapParams) { // TODO(WEB-4406) - Refactor the approval submission's rpc call latency to not delay wrap submission approveTxHash = (yield* call(sendTransaction, sendTransactionParams)).transactionResponse.hash - nonce = nonce ? nonce + 1 : undefined + nonce++ } // Default to input for USD volume amount const transactedUSDValue = analytics.token_in_amount_usd - const typeInfo = tradeToTransactionInfo(swapTxContext.trade, transactedUSDValue, gasFeeEstimation?.swapFee) + const typeInfo = tradeToTransactionInfo(swapTxContext.trade, transactedUSDValue) // Swap Logic - UniswapX if (isUniswapX) { const { orderParams, wrapTxRequest } = swapTxContext @@ -116,7 +117,9 @@ export function* approveAndSwap(params: SwapParams) { } // Swap Logic - Classic else { - const options = { request: { ...swapTxContext.txRequest, nonce }, submitViaPrivateRpc } + const { txRequest: swapTxRequest } = swapTxContext + const request = { ...swapTxRequest, nonce } + const options = { request, submitViaPrivateRpc } const sendTransactionParams = { txId, chainId, @@ -143,6 +146,21 @@ export const { actions: swapActions, } = createMonitoredSaga(approveAndSwap, 'swap') +export function* getNonceForApproveAndSwap(address: Address, chainId: number, submitViaPrivateRpc: boolean) { + const rpcType = submitViaPrivateRpc ? RPCType.Private : RPCType.Public + const provider = yield* call(getProvider, chainId, rpcType) + const nonce = yield* call([provider, provider.getTransactionCount], address, 'pending') + + const pendingPrivateTransactionCount = yield* call(getPendingPrivateTxCount, address, chainId) + if (rpcType !== RPCType.Private) { + // only need to add the `pendingPrivateTransactionCount` when submitting via a public RPC + // because it is unaware of pending txs in private pools + return nonce + pendingPrivateTransactionCount + } + + return nonce +} + export function* shouldSubmitViaPrivateRpc(chainId: number) { const swapProtectionSetting = yield* select(selectWalletSwapProtectionSetting) const swapProtectionOn = swapProtectionSetting === SwapProtectionSetting.On @@ -150,3 +168,20 @@ export function* shouldSubmitViaPrivateRpc(chainId: number) { const privateRpcSupportedOnChain = chainId ? isPrivateRpcSupportedOnChain(chainId) : false return Boolean(swapProtectionOn && privateRpcSupportedOnChain && privateRpcFeatureEnabled) } + +const selectAddressTransactions = makeSelectAddressTransactions() + +function* getPendingPrivateTxCount(address: Address, chainId: number) { + const pendingTransactions = yield* select(selectAddressTransactions, address) + if (!pendingTransactions) { + return 0 + } + + return pendingTransactions.filter( + (tx) => + tx.chainId === chainId && + tx.status === TransactionStatus.Pending && + isClassic(tx) && + Boolean(tx.options.submitViaPrivateRpc), + ).length +} diff --git a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.test.ts b/packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.test.ts deleted file mode 100644 index ffcddace12f..00000000000 --- a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks' -import { UNI, WBTC } from 'uniswap/src/constants/tokens' -import { Routing } from 'uniswap/src/data/tradingApi/__generated__/index' -import { AccountType, SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo' -import { ApprovalAction } from 'uniswap/src/features/transactions/swap/types/trade' -import { createMockDerivedSwapInfo } from 'uniswap/src/test/fixtures/transactions/swap' -import { UniverseChainId } from 'uniswap/src/types/chains' -import { - ClassicSwapTxAndGasInfo, - useSwapTxAndGasInfo, -} from 'wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo' -import { useTokenApprovalInfo } from 'wallet/src/features/transactions/swap/trade/api/hooks/useTokenApprovalInfo' -import { - TransactionRequestInfo, - useTransactionRequestInfo, -} from 'wallet/src/features/transactions/swap/trade/api/hooks/useTransactionRequestInfo' - -jest.mock('wallet/src/features/transactions/swap/trade/api/hooks/useTokenApprovalInfo') -jest.mock('wallet/src/features/transactions/swap/trade/api/hooks/useTransactionRequestInfo') - -describe('useSwapTxAndGasInfo', () => { - const mockDerivedSwapInfo: DerivedSwapInfo = createMockDerivedSwapInfo( - UNI[UniverseChainId.Mainnet], - WBTC, - '1000000000000000000', - '1000000000', - ) - - const mockAccount: SignerMnemonicAccountMeta = { address: '0x123', type: AccountType.SignerMnemonic } - - beforeEach(() => { - jest.clearAllMocks() - }) - - it('should return ClassicSwapTxAndGasInfo including gas estimates for classic trade', () => { - const mockTokenApprovalInfo = { - action: ApprovalAction.Approve, - txRequest: { - to: '0x456', - chainId: 1, - gasLimit: '100000', - maxFeePerGas: '300000', - maxPriorityFeePerGas: '400000', - }, - gasFee: '200000', - } - const mockSwapTxInfo: TransactionRequestInfo = { - transactionRequest: { to: '0x456', chainId: 1 }, - gasFeeResult: { value: '123', isLoading: false, error: null }, - gasFeeEstimation: { - gasUseEstimate: '500000', - gasFee: '600000', - maxFeePerGas: '700000', - maxPriorityFeePerGas: '800000', - }, - permitSignature: undefined, - } - - ;(useTokenApprovalInfo as jest.Mock).mockReturnValue(mockTokenApprovalInfo) - ;(useTransactionRequestInfo as jest.Mock).mockReturnValue(mockSwapTxInfo) - - const { result } = renderHook(() => - useSwapTxAndGasInfo({ derivedSwapInfo: mockDerivedSwapInfo, account: mockAccount }), - ) - - expect(result.current).toMatchObject({ - routing: Routing.CLASSIC, - trade: expect.any(Object), - txRequest: expect.any(Object), - approveTxRequest: expect.any(Object), - gasFee: { value: '200123', isLoading: false, error: null }, - gasFeeEstimation: { - swapFee: { - gasUseEstimate: '500000', - gasFee: '600000', - maxFeePerGas: '700000', - maxPriorityFeePerGas: '800000', - }, - approvalFee: { - gasUseEstimate: '100000', - gasFee: '200000', - maxFeePerGas: '300000', - maxPriorityFeePerGas: '400000', - }, - }, - approvalError: false, - }) - }) -}) diff --git a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.ts b/packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.ts index 1724fd8dc6e..4811544a2c6 100644 --- a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.ts +++ b/packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.ts @@ -3,7 +3,6 @@ import { useMemo } from 'react' import { OrderRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index' import { AccountMeta } from 'uniswap/src/features/accounts/types' import { GasFeeResult } from 'uniswap/src/features/gas/types' -import { EstimatedGasFeeDetails } from 'uniswap/src/features/telemetry/types' import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo' import { ApprovalAction, ClassicTrade, UniswapXTrade } from 'uniswap/src/features/transactions/swap/types/trade' import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' @@ -21,18 +20,12 @@ export type UniswapXGasBreakdown = { inputTokenSymbol?: string } -export type GasFeeEstimation = { - swapFee?: EstimatedGasFeeDetails - approvalFee?: EstimatedGasFeeDetails -} - export type ClassicSwapTxAndGasInfo = { routing: Routing.CLASSIC trade?: ClassicTrade txRequest?: ValidatedTransactionRequest approveTxRequest: ValidatedTransactionRequest | undefined gasFee: GasFeeResult - gasFeeEstimation: GasFeeEstimation approvalError: boolean } @@ -96,18 +89,6 @@ export function useSwapTxAndGasInfo({ const approvalError = tokenApprovalInfo?.action === ApprovalAction.Unknown const gasFeeError = swapTxInfo.gasFeeResult.error ?? approvalError ? new Error('Approval action unknown') : null - const gasFeeEstimation: GasFeeEstimation = { - swapFee: swapTxInfo.gasFeeEstimation, - approvalFee: tokenApprovalInfo - ? { - gasUseEstimate: tokenApprovalInfo.txRequest?.gasLimit?.toString(), - maxFeePerGas: tokenApprovalInfo.txRequest?.maxFeePerGas?.toString(), - maxPriorityFeePerGas: tokenApprovalInfo.txRequest?.maxPriorityFeePerGas?.toString(), - gasFee: tokenApprovalInfo.gasFee, - } - : undefined, - } - // Do not populate gas fee: // - If errors exist on swap or approval requests. // - If we don't have both the approval and transaction gas fees. @@ -151,13 +132,11 @@ export function useSwapTxAndGasInfo({ txRequest: validateTransactionRequest(swapTxInfo.transactionRequest), approveTxRequest, gasFee, - gasFeeEstimation, approvalError, } } }, [ tokenApprovalInfo, - swapTxInfo.gasFeeEstimation, swapTxInfo.gasFeeResult.error, swapTxInfo.gasFeeResult.value, swapTxInfo.gasFeeResult.isLoading, diff --git a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTokenApprovalInfo.ts b/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTokenApprovalInfo.ts index cde1db2dee8..4f252e288ec 100644 --- a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTokenApprovalInfo.ts +++ b/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTokenApprovalInfo.ts @@ -1,7 +1,9 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { useMemo } from 'react' -import { useCheckApprovalQuery } from 'uniswap/src/data/apiClients/tradingApi/useCheckApprovalQuery' -import { ApprovalRequest, Routing } from 'uniswap/src/data/tradingApi/__generated__/index' +import { uniswapUrls } from 'uniswap/src/constants/urls' +import { useRestQuery } from 'uniswap/src/data/rest' +import { ApprovalRequest, ApprovalResponse, Routing } from 'uniswap/src/data/tradingApi/__generated__/index' +import { TradingApiApolloClient } from 'uniswap/src/data/tradingApi/client' import { AccountMeta } from 'uniswap/src/features/accounts/types' import { ApprovalAction, TokenApprovalInfo } from 'uniswap/src/features/transactions/swap/types/trade' import { @@ -11,7 +13,7 @@ import { import { WrapType } from 'uniswap/src/features/transactions/types/wrap' import { WalletChainId } from 'uniswap/src/types/chains' import { logger } from 'utilities/src/logger/logger' -import { ONE_MINUTE_MS, ONE_SECOND_MS } from 'utilities/src/time/time' +import { ONE_MINUTE_MS } from 'utilities/src/time/time' interface TokenApprovalInfoParams { chainId: WalletChainId @@ -51,13 +53,17 @@ export function useTokenApprovalInfo( } }, [address, amount, chainId, currencyIn, tokenAddress]) - const shouldSkip = skip || !approvalRequestArgs || isWrap || !address - - const { data, error } = useCheckApprovalQuery({ - params: shouldSkip ? undefined : approvalRequestArgs, - staleTime: 15 * ONE_SECOND_MS, - immediateGcTime: ONE_MINUTE_MS, - }) + const { data, error } = useRestQuery>( + uniswapUrls.tradingApiPaths.approval, + approvalRequestArgs ?? {}, + ['approval', 'gasFee'], + { + ttlMs: ONE_MINUTE_MS, + skip: skip || !approvalRequestArgs || isWrap || !address, + }, + 'POST', + TradingApiApolloClient, + ) return useMemo(() => { if (error) { diff --git a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTransactionRequestInfo.ts b/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTransactionRequestInfo.ts index 7e712444988..9a715665e3b 100644 --- a/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTransactionRequestInfo.ts +++ b/packages/wallet/src/features/transactions/swap/trade/api/hooks/useTransactionRequestInfo.ts @@ -7,9 +7,7 @@ import { AccountMeta } from 'uniswap/src/features/accounts/types' import { GasFeeResult, GasSpeed } from 'uniswap/src/features/gas/types' import { DynamicConfigs, SwapConfigKey } from 'uniswap/src/features/gating/configs' import { useDynamicConfigValue } from 'uniswap/src/features/gating/hooks' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { EstimatedGasFeeDetails } from 'uniswap/src/features/telemetry/types' import { DerivedSwapInfo } from 'uniswap/src/features/transactions/swap/types/derivedSwapInfo' import { ApprovalAction, TokenApprovalInfo } from 'uniswap/src/features/transactions/swap/types/trade' import { isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' @@ -20,6 +18,7 @@ import { logger } from 'utilities/src/logger/logger' import { isMobileApp } from 'utilities/src/platform' import { ONE_SECOND_MS } from 'utilities/src/time/time' import { useTransactionGasFee } from 'wallet/src/features/gas/hooks' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { getBaseTradeAnalyticsPropertiesFromSwapInfo } from 'wallet/src/features/transactions/swap/analytics' import { useWrapTransactionRequest } from 'wallet/src/features/transactions/swap/trade/hooks/useWrapTransactionRequest' import { usePermit2SignatureWithData } from 'wallet/src/features/transactions/swap/usePermit2Signature' @@ -31,7 +30,6 @@ export interface TransactionRequestInfo { transactionRequest: providers.TransactionRequest | undefined permitSignature: string | undefined gasFeeResult: GasFeeResult - gasFeeEstimation: EstimatedGasFeeDetails } export function useTransactionRequestInfo({ @@ -132,13 +130,6 @@ export function useTransactionRequestInfo({ const swapGasFee = swapQuote?.gasFee - const gasFeeEstimation: EstimatedGasFeeDetails = { - gasUseEstimate: swapQuote?.gasUseEstimate, - maxFeePerGas: swapQuote?.maxFeePerGas, - maxPriorityFeePerGas: swapQuote?.maxPriorityFeePerGas, - gasFee: swapQuote?.gasFee, - } - // This is a case where simulation fails on backend, meaning txn is expected to fail const simulationError = swapQuote?.txFailureReasons?.includes(TransactionFailureReason.SIMULATION_ERROR) const gasEstimateError = useMemo( @@ -192,6 +183,5 @@ export function useTransactionRequestInfo({ transactionRequest: isWrapApplicable ? wrapTxRequest : data?.swap, permitSignature: signatureInfo.signature, gasFeeResult, - gasFeeEstimation, } } diff --git a/packages/wallet/src/features/transactions/swap/trade/hooks/useShowSwapNetworkNotification.ts b/packages/wallet/src/features/transactions/swap/trade/hooks/useShowSwapNetworkNotification.ts index 62715efa0b9..cf321b0dfaa 100644 --- a/packages/wallet/src/features/transactions/swap/trade/hooks/useShowSwapNetworkNotification.ts +++ b/packages/wallet/src/features/transactions/swap/trade/hooks/useShowSwapNetworkNotification.ts @@ -1,26 +1,26 @@ -import { useCallback } from 'react' +import { useEffect } from 'react' import { useDispatch } from 'react-redux' import { WalletChainId } from 'uniswap/src/types/chains' +import { usePrevious } from 'utilities/src/react/hooks' import { pushNotification } from 'wallet/src/features/notifications/slice' import { AppNotificationType } from 'wallet/src/features/notifications/types' -export function useShowSwapNetworkNotification(): (chainId?: WalletChainId, prevChainId?: WalletChainId) => void { +export function useShowSwapNetworkNotification(chainId?: WalletChainId): void { + const prevChainId = usePrevious(chainId) const appDispatch = useDispatch() - return useCallback( - (chainId?: WalletChainId, prevChainId?: WalletChainId) => { - // don't fire notification toast for first network selection - if (!prevChainId || !chainId || prevChainId === chainId) { - return - } - appDispatch( - pushNotification({ - type: AppNotificationType.NetworkChanged, - chainId, - flow: 'swap', - hideDelay: 2000, - }), - ) - }, - [appDispatch], - ) + useEffect(() => { + // don't fire notification toast for first network selection + if (!prevChainId || !chainId || prevChainId === chainId) { + return + } + + appDispatch( + pushNotification({ + type: AppNotificationType.NetworkChanged, + chainId, + flow: 'swap', + hideDelay: 2000, + }), + ) + }, [chainId, prevChainId, appDispatch]) } diff --git a/packages/wallet/src/features/transactions/swap/trade/hooks/useSwapCallback.ts b/packages/wallet/src/features/transactions/swap/trade/hooks/useSwapCallback.ts index 22da501baf8..8e44380fdd7 100644 --- a/packages/wallet/src/features/transactions/swap/trade/hooks/useSwapCallback.ts +++ b/packages/wallet/src/features/transactions/swap/trade/hooks/useSwapCallback.ts @@ -3,12 +3,12 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { useCallback } from 'react' import { useDispatch, useSelector } from 'react-redux' import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { selectSwapStartTimestamp } from 'uniswap/src/features/timing/selectors' import { updateSwapStartTimestamp } from 'uniswap/src/features/timing/slice' import { isClassic } from 'uniswap/src/features/transactions/swap/utils/routing' import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' import { ValidatedSwapTxContext } from 'wallet/src/features/transactions/contexts/SwapTxContext' import { getBaseTradeAnalyticsProperties } from 'wallet/src/features/transactions/swap/analytics' import { swapActions } from 'wallet/src/features/transactions/swap/swapSaga' diff --git a/packages/wallet/src/features/transactions/swap/trade/hooks/useUSDTokenUpdater.ts b/packages/wallet/src/features/transactions/swap/trade/hooks/useUSDTokenUpdater.ts index ab6c2575a28..7cb58ceed26 100644 --- a/packages/wallet/src/features/transactions/swap/trade/hooks/useUSDTokenUpdater.ts +++ b/packages/wallet/src/features/transactions/swap/trade/hooks/useUSDTokenUpdater.ts @@ -1,9 +1,9 @@ import { Currency } from '@uniswap/sdk-core' import { useEffect, useRef } from 'react' -import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { ValueType, getCurrencyAmount } from 'uniswap/src/features/tokens/getCurrencyAmount' import { STABLECOIN_AMOUNT_OUT, useUSDCPrice } from 'uniswap/src/features/transactions/swap/hooks/useUSDCPrice' import { NumberType } from 'utilities/src/format/types' +import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' const NUM_DECIMALS_USD = 2 const NUM_DECIMALS_DISPLAY = 2 diff --git a/packages/wallet/src/features/transactions/swap/utils.ts b/packages/wallet/src/features/transactions/swap/utils.ts index a3396c97218..d2a382e8283 100644 --- a/packages/wallet/src/features/transactions/swap/utils.ts +++ b/packages/wallet/src/features/transactions/swap/utils.ts @@ -9,14 +9,11 @@ import { FeeOptions } from '@uniswap/v3-sdk' import { BigNumber } from 'ethers' import { AppTFunction } from 'ui/src/i18n/types' import { AssetType } from 'uniswap/src/entities/assets' -import { LocalizationContextState } from 'uniswap/src/features/language/LocalizationContext' import { ElementName, ElementNameType } from 'uniswap/src/features/telemetry/constants' -import { EstimatedGasFeeDetails } from 'uniswap/src/features/telemetry/types' import { ClassicTrade, Trade } from 'uniswap/src/features/transactions/swap/types/trade' import { isClassic, isUniswapX } from 'uniswap/src/features/transactions/swap/utils/routing' import { getClassicQuoteFromResponse } from 'uniswap/src/features/transactions/swap/utils/tradingApi' import { - BaseSwapTransactionInfo, ExactInputSwapTransactionInfo, ExactOutputSwapTransactionInfo, TransactionType, @@ -34,6 +31,7 @@ import { currencyIdToChain, } from 'uniswap/src/utils/currencyId' import { NumberType } from 'utilities/src/format/types' +import { LocalizationContextState } from 'wallet/src/features/language/LocalizationContext' import { PermitSignatureInfo } from 'wallet/src/features/transactions/swap/usePermit2Signature' export function serializeQueryParams(params: Record[0]>): string { @@ -71,7 +69,6 @@ export function isWrapAction(wrapType: WrapType): wrapType is WrapType.Unwrap | export function tradeToTransactionInfo( trade: Trade, transactedUSDValue?: number, - estimatedGasFeeDetails?: EstimatedGasFeeDetails, ): ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo { const slippageTolerancePercent = slippageToleranceToPercent(trade.slippageTolerance) @@ -82,8 +79,7 @@ export function tradeToTransactionInfo( const inputCurrency = isUniswapX(trade) ? trade.inputAmount.currency.wrapped : trade.inputAmount.currency const outputCurrency = trade.outputAmount.currency - const baseTransactionInfo: BaseSwapTransactionInfo = { - type: TransactionType.Swap, + const baseTransactionInfo = { inputCurrencyId: currencyId(inputCurrency), outputCurrencyId: currencyId(outputCurrency), slippageTolerance, @@ -92,12 +88,12 @@ export function tradeToTransactionInfo( routeString, protocol: getProtocolVersionFromTrade(trade), transactedUSDValue, - estimatedGasFeeDetails, } return trade.tradeType === TradeType.EXACT_INPUT ? { ...baseTransactionInfo, + type: TransactionType.Swap, tradeType: TradeType.EXACT_INPUT, inputCurrencyAmountRaw: trade.inputAmount.quotient.toString(), expectedOutputCurrencyAmountRaw: trade.outputAmount.quotient.toString(), @@ -105,6 +101,7 @@ export function tradeToTransactionInfo( } : { ...baseTransactionInfo, + type: TransactionType.Swap, tradeType: TradeType.EXACT_OUTPUT, outputCurrencyAmountRaw: trade.outputAmount.quotient.toString(), expectedInputCurrencyAmountRaw: trade.inputAmount.quotient.toString(), @@ -193,7 +190,7 @@ export const prepareSwapFormState = ({ exactAmountToken: '', [CurrencyField.INPUT]: { address: currencyIdToAddress(inputCurrencyId), - chainId: (currencyIdToChain(inputCurrencyId) as WalletChainId) ?? UniverseChainId.Mainnet, + chainId: currencyIdToChain(inputCurrencyId) ?? UniverseChainId.Mainnet, type: AssetType.Currency, }, [CurrencyField.OUTPUT]: null, diff --git a/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts b/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts index de7aaac81da..004f36b5cff 100644 --- a/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts +++ b/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts @@ -19,7 +19,6 @@ import { getTxFixtures, transactionDetails, } from 'uniswap/src/test/fixtures' -import { mockApolloClient } from 'uniswap/src/test/mocks' import { UniverseChainId } from 'uniswap/src/types/chains' import { sleep } from 'utilities/src/time/timing' import { fetchFiatOnRampTransaction } from 'wallet/src/features/fiatOnRamp/api' @@ -32,7 +31,7 @@ import { watchTransaction, } from 'wallet/src/features/transactions/transactionWatcherSaga' import { getProvider, getProviderManager } from 'wallet/src/features/wallet/context' -import { getTxProvidersMocks } from 'wallet/src/test/mocks' +import { getTxProvidersMocks, mockApolloClient } from 'wallet/src/test/mocks' const { ethersTxReceipt, diff --git a/packages/wallet/src/features/transactions/transactionWatcherSaga.ts b/packages/wallet/src/features/transactions/transactionWatcherSaga.ts index 62a07a0d1c4..95874d8a684 100644 --- a/packages/wallet/src/features/transactions/transactionWatcherSaga.ts +++ b/packages/wallet/src/features/transactions/transactionWatcherSaga.ts @@ -7,7 +7,6 @@ import { PollingInterval } from 'uniswap/src/constants/misc' import { FiatOnRampTransactionDetails } from 'uniswap/src/features/fiatOnRamp/types' import { MobileAppsFlyerEvents, WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent, sendAppsFlyerEvent } from 'uniswap/src/features/telemetry/send' -import { selectIncompleteTransactions, selectSwapTransactionsCount } from 'uniswap/src/features/transactions/selectors' import { addTransaction, cancelTransaction, @@ -38,10 +37,9 @@ import { attemptCancelTransaction } from 'wallet/src/features/transactions/cance import { OrderWatcher } from 'wallet/src/features/transactions/orderWatcherSaga' import { refetchGQLQueries } from 'wallet/src/features/transactions/refetchGQLQueriesSaga' import { attemptReplaceTransaction } from 'wallet/src/features/transactions/replaceTransactionSaga' +import { selectIncompleteTransactions, selectSwapTransactionsCount } from 'wallet/src/features/transactions/selectors' import { - getDiff, getFinalizedTransactionStatus, - getPercentageError, isOnRampTransaction, receiptFromEthersReceipt, } from 'wallet/src/features/transactions/utils' @@ -425,33 +423,6 @@ export function logTransactionEvent(actionData: ReturnType( + uniswapUrls.trmPath, + { address }, + ['block'], + { + ttlMs: ONE_MINUTE_MS * 5, + skip: !address || isViewOnly, + }, + ) + + return { + isBlocked: data?.block || false, + isBlockedLoading: loading, + } +} + /** Returns TRM status for the active account. */ export function useIsBlockedActiveAddress(): IsBlockedResult { const account = useActiveAccount() diff --git a/packages/wallet/src/features/unitags/api.ts b/packages/wallet/src/features/unitags/api.ts index d07f666fb55..f4d55d75887 100644 --- a/packages/wallet/src/features/unitags/api.ts +++ b/packages/wallet/src/features/unitags/api.ts @@ -1,11 +1,15 @@ import axios from 'axios' import { uniswapUrls } from 'uniswap/src/constants/urls' import { REQUEST_SOURCE, getVersionHeader } from 'uniswap/src/data/constants' +import { useRestQuery } from 'uniswap/src/data/rest' +import { addQueryParamsToEndpoint, unitagsApolloClient } from 'uniswap/src/features/unitags/api' import { ProfileMetadata, UnitagAddressResponse, UnitagAddressesResponse, UnitagChangeUsernameRequestBody, + UnitagClaimEligibilityParams, + UnitagClaimEligibilityResponse, UnitagClaimUsernameRequestBody, UnitagDeleteUsernameRequestBody, UnitagGetAvatarUploadUrlResponse, @@ -14,6 +18,7 @@ import { UnitagUpdateMetadataResponse, } from 'uniswap/src/features/unitags/types' import { isMobileApp } from 'utilities/src/platform' +import { ONE_MINUTE_MS } from 'utilities/src/time/time' import { createSignedRequestBody, createSignedRequestParams } from 'wallet/src/data/utils' import { Account } from 'wallet/src/features/wallet/accounts/types' import { SignerManager } from 'wallet/src/features/wallet/signing/SignerManager' @@ -37,6 +42,26 @@ const generateAxiosHeaders = async ( } } +export function useUnitagClaimEligibilityQuery({ + address, + deviceId, + isUsernameChange, + skip, +}: UnitagClaimEligibilityParams & { skip?: boolean }): ReturnType> { + return useRestQuery>( + addQueryParamsToEndpoint('/claim/eligibility', { + address, + deviceId, + isUsernameChange, + }), + { address, deviceId, isUsernameChange }, // dummy body so that cache key is unique per query params + ['canClaim', 'errorCode', 'message'], // return all fields + { skip, ttlMs: ONE_MINUTE_MS * 2 }, + 'GET', + unitagsApolloClient, + ) +} + // Axios requests with signature authentication export async function getUnitagAvatarUploadUrl({ diff --git a/packages/wallet/src/features/unitags/hooks.ts b/packages/wallet/src/features/unitags/hooks.ts index a9461444b77..fe51805cbbd 100644 --- a/packages/wallet/src/features/unitags/hooks.ts +++ b/packages/wallet/src/features/unitags/hooks.ts @@ -3,13 +3,12 @@ import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { getUniqueId } from 'react-native-device-info' import { useDispatch } from 'react-redux' -import { useUnitagsClaimEligibilityQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsClaimEligibilityQuery' -import { useUnitagsUsernameQuery } from 'uniswap/src/data/apiClients/unitagsApi/useUnitagsUsernameQuery' import { useENS } from 'uniswap/src/features/ens/useENS' import { FeatureFlags } from 'uniswap/src/features/gating/flags' import { useFeatureFlag } from 'uniswap/src/features/gating/hooks' import { UnitagEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' +import { useUnitagQuery } from 'uniswap/src/features/unitags/api' import { useUnitagUpdater } from 'uniswap/src/features/unitags/context' import { UnitagClaim, @@ -21,12 +20,12 @@ import { UniverseChainId } from 'uniswap/src/types/chains' import { areAddressesEqual } from 'uniswap/src/utils/addresses' import { logger } from 'utilities/src/logger/logger' import { useAsyncData } from 'utilities/src/react/hooks' -import { ONE_MINUTE_MS, ONE_SECOND_MS } from 'utilities/src/time/time' +import { ONE_SECOND_MS } from 'utilities/src/time/time' import { getFirebaseAppCheckToken } from 'wallet/src/features/appCheck' import { pushNotification } from 'wallet/src/features/notifications/slice' import { AppNotificationType } from 'wallet/src/features/notifications/types' import { useOnboardingContext } from 'wallet/src/features/onboarding/OnboardingContext' -import { claimUnitag, getUnitagAvatarUploadUrl } from 'wallet/src/features/unitags/api' +import { claimUnitag, getUnitagAvatarUploadUrl, useUnitagClaimEligibilityQuery } from 'wallet/src/features/unitags/api' import { isLocalFileUri, uploadAndUpdateAvatarAfterClaim } from 'wallet/src/features/unitags/avatars' import { AVATAR_UPLOAD_CREDS_EXPIRY_SECONDS, UNITAG_VALID_REGEX } from 'wallet/src/features/unitags/constants' import { parseUnitagErrorCode } from 'wallet/src/features/unitags/utils' @@ -46,29 +45,24 @@ export const useCanActiveAddressClaimUnitag = (): { const { refetchUnitagsCounter } = useUnitagUpdater() const skip = !deviceId - const { isLoading, data, refetch } = useUnitagsClaimEligibilityQuery({ - params: skip - ? undefined - : { - address: activeAddress, - deviceId, - }, + const { loading, data, refetch } = useUnitagClaimEligibilityQuery({ + address: activeAddress, + deviceId: deviceId ?? '', // this is fine since we skip if deviceId is undefined + skip, }) // Force refetch of canClaimUnitag if refetchUnitagsCounter changes useEffect(() => { - if (skip || isLoading) { + if (skip || loading) { return } - refetch().catch((error) => - logger.error(error, { tags: { file: 'unitags/hooks.ts', function: 'useCanActiveAddressClaimUnitag' } }), - ) + refetch?.() // eslint-disable-next-line react-hooks/exhaustive-deps }, [refetchUnitagsCounter]) return { - canClaimUnitag: !isLoading && !!data?.canClaim, + canClaimUnitag: !loading && !!data?.canClaim, } } @@ -79,32 +73,26 @@ export const useCanAddressClaimUnitag = ( const { data: deviceId } = useAsyncData(getUniqueId) const { refetchUnitagsCounter } = useUnitagUpdater() const skip = !deviceId - - const { isLoading, data, refetch } = useUnitagsClaimEligibilityQuery({ - params: skip - ? undefined - : { - address, - deviceId, - isUsernameChange, - }, + const { loading, data, refetch } = useUnitagClaimEligibilityQuery({ + address, + deviceId: deviceId ?? '', // this is fine since we skip if deviceId is undefined + isUsernameChange, + skip, }) // Force refetch of canClaimUnitag if refetchUnitagsCounter changes useEffect(() => { - if (skip || isLoading) { + if (skip || loading) { return } - refetch().catch((error) => - logger.error(error, { tags: { file: 'unitags/hooks.ts', function: 'useCanAddressClaimUnitag' } }), - ) + refetch?.() // Skip is included in the dependency array here bc of useAsyncData -- on mount deviceId is undefined so refetch would be skipped if not included // eslint-disable-next-line react-hooks/exhaustive-deps }, [refetchUnitagsCounter, skip]) return { - canClaimUnitag: !isLoading && !!data?.canClaim, + canClaimUnitag: !loading && !!data?.canClaim, errorCode: data?.errorCode, } } @@ -138,10 +126,7 @@ export const useCanClaimUnitagName = ( // Skip the backend calls if we found an error const unitagToSearch = error ? undefined : unitag - const { isLoading: unitagLoading, data } = useUnitagsUsernameQuery({ - params: unitagToSearch ? { username: unitagToSearch } : undefined, - staleTime: 2 * ONE_MINUTE_MS, - }) + const { loading: unitagLoading, data } = useUnitagQuery(unitagToSearch) const { loading: ensLoading, address: ensAddress } = useENS(UniverseChainId.Mainnet, unitagToSearch, true) const loading = unitagLoading || ensLoading diff --git a/packages/wallet/src/features/wallet/Keyring/Keyring.native.ts b/packages/wallet/src/features/wallet/Keyring/Keyring.native.ts index 8b160230416..b6e5c729c9a 100644 --- a/packages/wallet/src/features/wallet/Keyring/Keyring.native.ts +++ b/packages/wallet/src/features/wallet/Keyring/Keyring.native.ts @@ -81,11 +81,11 @@ class NativeKeyring implements IKeyring { return RNEthersRS.generateAddressForMnemonic(mnemonic, derivationIndex) } - generateAddressesForMnemonic(_mnemonicId: string, _startIndex: number, _stopIndex: number): Promise { + generateAddressesForMnemonic(_mnemonicId: string): Promise { throw new NotImplementedError('generateAddressesForMnemonic') } - generateAddressesForMnemonicId(_mnemonicId: string, _startIndex: number, _stopIndex: number): Promise { + generateAddressesForMnemonicId(_mnemonicId: string): Promise { throw new NotImplementedError('generateAddressesForMnemonicId') } diff --git a/packages/wallet/src/features/wallet/Keyring/Keyring.test.ts b/packages/wallet/src/features/wallet/Keyring/Keyring.test.ts index 25bf2e4e620..d4f5cc6a04c 100644 --- a/packages/wallet/src/features/wallet/Keyring/Keyring.test.ts +++ b/packages/wallet/src/features/wallet/Keyring/Keyring.test.ts @@ -1,3 +1,4 @@ +import { WebKeyring } from 'wallet/src/features/wallet/Keyring/Keyring.web' import { SAMPLE_PASSWORD, SAMPLE_SEED, @@ -11,8 +12,7 @@ import { SAMPLE_SEED_ADDRESS_7, SAMPLE_SEED_ADDRESS_8, SAMPLE_SEED_ADDRESS_9, -} from 'uniswap/src/test/fixtures' -import { WebKeyring } from 'wallet/src/features/wallet/Keyring/Keyring.web' +} from 'wallet/src/test/fixtures' type ChromeSessionStore = { [prop: string]: unknown } @@ -259,7 +259,7 @@ describe(WebKeyring, () => { await keyring.importMnemonic(SAMPLE_SEED, SAMPLE_PASSWORD) await keyring.unlock(SAMPLE_PASSWORD) - const addresses = await keyring.generateAddressesForMnemonicId(SAMPLE_SEED_ADDRESS_1, 0, 10) + const addresses = await keyring.generateAddressesForMnemonicId(SAMPLE_SEED_ADDRESS_1, 0, 9) expect(addresses).toEqual([ SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, diff --git a/packages/wallet/src/features/wallet/Keyring/Keyring.ts b/packages/wallet/src/features/wallet/Keyring/Keyring.ts index 073a701c4ed..51a012fa2e2 100644 --- a/packages/wallet/src/features/wallet/Keyring/Keyring.ts +++ b/packages/wallet/src/features/wallet/Keyring/Keyring.ts @@ -1,4 +1,4 @@ -import { PlatformSplitStubError } from 'utilities/src/errors' +import { NotImplementedError } from 'utilities/src/errors' /** * Provides the generation, storage, and signing logic for mnemonics and private keys. @@ -83,26 +83,34 @@ export interface IKeyring { * * @param mnemonic mnemonic to generate private key for (current convention is to * use the public address associated with mnemonic at derivation index 0) - * @param startIndex number used to specify the derivation index at which to start deriving private keys + * @param startDerivationIndex number used to specify the derivation index at which to start deriving private keys * from the mnemonic - * @param stopIndex number used to specify the derivation index at which to stop deriving private keys + * @param endDerivationIndex number used to specify the derivation index at which to stop deriving private keys * from the mnemonic * @returns public addresses associated with the private keys generated from the mnemonic at the given derivation index range */ - generateAddressesForMnemonic(mnemonic: string, startIndex: number, stopIndex: number): Promise> + generateAddressesForMnemonic( + mnemonic: string, + startDerivationIndex: number, + endDerivationIndex: number, + ): Promise> /** * Derives public addresses from `mnemonicId` for a range of derivation indexes. * * @param mnemonicId key string associated with mnemonic to generate private key for (current convention is to * use the public address associated with mnemonic at derivation index 0) - * @param startIndex number used to specify the derivation index at which to start deriving private keys + * @param startDerivationIndex number used to specify the derivation index at which to start deriving private keys * from the mnemonic - * @param stopIndex number used to specify the derivation index at which to stop deriving private keys + * @param endDerivationIndex number used to specify the derivation index at which to stop deriving private keys * from the mnemonic * @returns public addresses associated with the private keys generated from the mnemonic at the given derivation index range */ - generateAddressesForMnemonicId(mnemonicId: string, startIndex: number, stopIndex: number): Promise> + generateAddressesForMnemonicId( + mnemonicId: string, + startDerivationIndex: number, + endDerivationIndex: number, + ): Promise> /** * Derives private key and public address from mnemonic associated with `mnemonicId` for given `derivationIndex`. @@ -130,7 +138,7 @@ export interface IKeyring { /** Dummy Keyring implementation. */ class NullKeyring implements IKeyring { removeAllMnemonicsAndPrivateKeys(): Promise { - throw new PlatformSplitStubError('removeAllMnemonicsAndPrivateKeys') + throw new NotImplementedError('removeAllMnemonicsAndPrivateKeys') } generateAddressesForMnemonic( @@ -138,7 +146,7 @@ class NullKeyring implements IKeyring { _startDerivationIndex: number, _endDerivationIndex: number, ): Promise { - throw new PlatformSplitStubError('generateAddressesForMnemonic') + throw new NotImplementedError('generateAddressesForMnemonic') } generateAddressesForMnemonicId( @@ -146,11 +154,11 @@ class NullKeyring implements IKeyring { _startDerivationIndex: number, _endDerivationIndex: number, ): Promise { - throw new PlatformSplitStubError('generateAddressesForMnemonicId') + throw new NotImplementedError('generateAddressesForMnemonicId') } isUnlocked(): Promise { - throw new PlatformSplitStubError('isUnlocked') + throw new NotImplementedError('isUnlocked') } unlock(): Promise { @@ -162,67 +170,67 @@ class NullKeyring implements IKeyring { } checkPassword(_password: string): Promise { - throw new PlatformSplitStubError('checkPassword') + throw new NotImplementedError('checkPassword') } changePassword(_newPassword: string): Promise { - throw new PlatformSplitStubError('changePassword') + throw new NotImplementedError('changePassword') } removePassword(): Promise { - throw new PlatformSplitStubError('removePassword') + throw new NotImplementedError('removePassword') } getMnemonicIds(): Promise { - throw new PlatformSplitStubError('getMnemonicIds') + throw new NotImplementedError('getMnemonicIds') } // returns the mnemonicId (derived address at index 0) of the imported mnemonic importMnemonic(_mnemonic: string, _password?: string, _allowOverwrite?: boolean): Promise { - throw new PlatformSplitStubError('importMnemonic') + throw new NotImplementedError('importMnemonic') } removeMnemonic(_menemonicId: string): Promise { - throw new PlatformSplitStubError('removeMnemonic') + throw new NotImplementedError('removeMnemonic') } retrieveMnemonicUnlocked(_address: string): Promise { - throw new PlatformSplitStubError('retrieveMnemonicUnlocked') + throw new NotImplementedError('retrieveMnemonicUnlocked') } // returns the mnemonicId (derived address at index 0) of the stored mnemonic generateAndStoreMnemonic(_password?: string): Promise { - throw new PlatformSplitStubError('generateAndStoreMnemonic') + throw new NotImplementedError('generateAndStoreMnemonic') } getAddressesForStoredPrivateKeys(): Promise { - throw new PlatformSplitStubError('getAddressesForStoredPrivateKeys') + throw new NotImplementedError('getAddressesForStoredPrivateKeys') } // returns the address for a given mnemonic generateAddressForMnemonic(_menemonic: string, _derivationIndex: number): Promise { - throw new PlatformSplitStubError('generateAddressForMnemonic') + throw new NotImplementedError('generateAddressForMnemonic') } // returns the address of the generated key generateAndStorePrivateKey(_menemonicId: string, _derivationIndex: number): Promise { - throw new PlatformSplitStubError('generateAndStorePrivateKey') + throw new NotImplementedError('generateAndStorePrivateKey') } removePrivateKey(_address: string): Promise { - throw new PlatformSplitStubError('removePrivateKey') + throw new NotImplementedError('removePrivateKey') } signTransactionHashForAddress(_address: string, _hash: string, _chainId: number): Promise { - throw new PlatformSplitStubError('signTransactionHashForAddress') + throw new NotImplementedError('signTransactionHashForAddress') } signMessageForAddress(_address: string, _message: string): Promise { - throw new PlatformSplitStubError('signMessageForAddress') + throw new NotImplementedError('signMessageForAddress') } signHashForAddress(_address: string, _hash: string, _chainId: number): Promise { - throw new PlatformSplitStubError('signHashForAddress') + throw new NotImplementedError('signHashForAddress') } } diff --git a/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts b/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts index 6f86b8a63b8..4da32b16fbc 100644 --- a/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts +++ b/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts @@ -360,18 +360,22 @@ export class WebKeyring implements IKeyring { } /** - * Derives public addresses from a mnemonic for a range of derivation indexes, non inclusive + * Derives public addresses from a mnemonic for a range of derivation indexes. * * @param mnemonic mnemonic to generate private key for (current convention is to * use the public address associated with mnemonic at derivation index 0) - * @param startIndex number used to specify the derivation index at which to start deriving private keys + * @param startDerivationIndex number used to specify the derivation index at which to start deriving private keys + * from the mnemonic + * @param endDerivationIndex number used to specify the derivation index at which to stop deriving private keys * from the mnemonic - * @param stopIndex number used to specify the derivation index at which to stop deriving private keys - * from the mnemonic, non-inclusive * @returns public addresses associated with the private keys generated from the mnemonic at the given derivation index range */ - async generateAddressesForMnemonic(mnemonic: string, startIndex: number, stopIndex: number): Promise { - if (startIndex >= stopIndex) { + async generateAddressesForMnemonic( + mnemonic: string, + startDerivationIndex: number, + endDerivationIndex: number, + ): Promise { + if (startDerivationIndex >= endDerivationIndex) { throw new Error('End derivation index must be greater than start derivation index') } @@ -383,7 +387,7 @@ export class WebKeyring implements IKeyring { const hdKey = HDKey.fromExtendedKey(xpub) const addresses = [] - for (let i = startIndex; i < stopIndex; i++) { + for (let i = startDerivationIndex; i <= endDerivationIndex; i++) { const pubKey = hdKey.deriveChild(i).publicKey if (!pubKey) { continue @@ -397,19 +401,23 @@ export class WebKeyring implements IKeyring { } /** - * Derives public addresses from `mnemonicId` for a range of derivation indexes, non inclusive + * Derives public addresses from `mnemonicId` for a range of derivation indexes. * * @param mnemonicId key string associated with mnemonic to generate private key for (current convention is to * use the public address associated with mnemonic at derivation index 0) - * @param startIndex number used to specify the derivation index at which to start deriving private keys + * @param startDerivationIndex number used to specify the derivation index at which to start deriving private keys * from the mnemonic - * @param stopIndex number used to specify the derivation index at which to stop deriving private keys + * @param endDerivationIndex number used to specify the derivation index at which to stop deriving private keys * from the mnemonic * @returns public addresses associated with the private keys generated from the mnemonic at the given derivation index range */ - async generateAddressesForMnemonicId(mnemonicId: string, startIndex: number, stopIndex: number): Promise { + async generateAddressesForMnemonicId( + mnemonicId: string, + startDerivationIndex: number, + endDerivationIndex: number, + ): Promise { const mnemonic = await this.retrieveMnemonicUnlocked(mnemonicId) - return await this.generateAddressesForMnemonic(mnemonic, startIndex, stopIndex) + return await this.generateAddressesForMnemonic(mnemonic, startDerivationIndex, endDerivationIndex) } /** diff --git a/packages/wallet/src/features/wallet/context.tsx b/packages/wallet/src/features/wallet/context.tsx index 28870b6bb0b..d5b33566a13 100644 --- a/packages/wallet/src/features/wallet/context.tsx +++ b/packages/wallet/src/features/wallet/context.tsx @@ -1,9 +1,7 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ -import { Signer } from 'ethers' import { createContext, PropsWithChildren, useCallback, useContext, useEffect, useState } from 'react' import { call, getContext } from 'typed-redux-saga' -import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' -import { WalletChainId } from 'uniswap/src/types/chains' +import { RPCType, WalletChainId } from 'uniswap/src/types/chains' import { logger } from 'utilities/src/logger/logger' import { ContractManager } from 'wallet/src/features/contracts/ContractManager' import { ProviderManager } from 'wallet/src/features/providers/ProviderManager' @@ -63,8 +61,8 @@ export function useProviderManager(): ProviderManager { return useContext(WalletContext).value.providers } -export function useProvider(chainId: WalletChainId) { - return useProviderManager().tryGetProvider(chainId) +export function useProvider(chainId: WalletChainId, rpcType: RPCType = RPCType.Public) { + return useProviderManager().tryGetProvider(chainId, rpcType) } export function* getProviderManager() { @@ -72,27 +70,17 @@ export function* getProviderManager() { return (yield* getContext('providers')) ?? walletContextValue.providers } -export function* getProvider(chainId: WalletChainId) { +export function* getProvider(chainId: WalletChainId, rpcType: RPCType = RPCType.Public) { const providerManager = yield* call(getProviderManager) // Note, unlike useWalletProvider above, this throws on missing provider - return providerManager.getProvider(chainId) -} - -export function* getPrivateProvider(chainId: WalletChainId, account?: SignerMnemonicAccountMeta) { - let signer: Signer | undefined - if (account) { - const signerManager = yield* call(getSignerManager) - signer = yield* call([signerManager, signerManager.getSignerForAccount], account) - } - const providerManager = yield* call(getProviderManager) - return yield* call([providerManager, providerManager.getPrivateProvider], chainId, signer) + return providerManager.getProvider(chainId, rpcType) } /** * Non-generator version of getProvider */ -export function getProviderSync(chainId: WalletChainId) { - return walletContextValue.providers.getProvider(chainId) +export function getProviderSync(chainId: WalletChainId, rpcType: RPCType = RPCType.Public) { + return walletContextValue.providers.getProvider(chainId, rpcType) } export function useContractManager(): ContractManager { diff --git a/packages/wallet/src/features/wallet/hooks.ts b/packages/wallet/src/features/wallet/hooks.ts index bd4fe47e50a..a9ca0f7a656 100644 --- a/packages/wallet/src/features/wallet/hooks.ts +++ b/packages/wallet/src/features/wallet/hooks.ts @@ -1,7 +1,7 @@ import { useMemo, useRef } from 'react' import { useSelector } from 'react-redux' import { AccountType } from 'uniswap/src/features/accounts/types' -import { useENSName } from 'uniswap/src/features/ens/api' +import { useENSAvatar, useENSName } from 'uniswap/src/features/ens/api' import { useUnitagByAddress } from 'uniswap/src/features/unitags/hooks' import { getValidAddress, sanitizeAddressText, shortenAddress } from 'uniswap/src/utils/addresses' import { trimToLength } from 'utilities/src/primitives/string' @@ -178,3 +178,31 @@ export function useDisplayName(address: Maybe, options?: DisplayNameOpti type: DisplayNameType.Address, } } + +/* + * Fetches avatar for address, in priority uses: unitag avatar, ens avatar, undefined + * Note that this hook is used instead of just useENSAvatar because our implementation + * of useENSAvatar checks for reverse name resolution which Unitags does not support. + * Chose to do this because even if we used useENSAvatar without reverse name resolution, + * there is more latency because it has to go to the contract via CCIP-read first. + */ +export function useAvatar(address: Maybe): { + avatar: Maybe + loading: boolean +} { + const validated = getValidAddress(address) + const { data: ensAvatar, loading: ensLoading } = useENSAvatar(validated) + const { unitag, loading: unitagLoading } = useUnitagByAddress(validated || undefined) + + const unitagAvatar = unitag?.metadata?.avatar + + if (unitagAvatar) { + return { avatar: unitagAvatar, loading: false } + } + + if (ensAvatar) { + return { avatar: ensAvatar, loading: false } + } + + return { avatar: undefined, loading: ensLoading || unitagLoading } +} diff --git a/packages/wallet/src/provider/index.tsx b/packages/wallet/src/provider/index.tsx index 928b809d719..499f82fb692 100644 --- a/packages/wallet/src/provider/index.tsx +++ b/packages/wallet/src/provider/index.tsx @@ -11,7 +11,7 @@ interface SharedProviderProps { // A provider meant for sharing across all surfaces. // Props should be defined as needed and clarified in name to improve readability -export function SharedWalletProvider({ reduxStore, children }: SharedProviderProps): JSX.Element { +export function SharedProvider({ reduxStore, children }: SharedProviderProps): JSX.Element { return ( diff --git a/packages/wallet/src/provider/tamagui-provider.tsx b/packages/wallet/src/provider/tamagui-provider.tsx index 25b84da97b8..0593b4fbf1b 100644 --- a/packages/wallet/src/provider/tamagui-provider.tsx +++ b/packages/wallet/src/provider/tamagui-provider.tsx @@ -7,7 +7,7 @@ import { useSelectedColorScheme } from 'wallet/src/features/appearance/hooks' // this exported Provider is useful for tests export function TamaguiProvider({ children, ...rest }: Omit): JSX.Element { - // because we don't always want to wrap all of redux for visual tests, make it default to false if in test mode + // because we dont always want to wrap all of redux for visual tests, make it default to false if in test mode // this should be done better but release needs hotfix so for now it works const userSelectedColorScheme = useSelectedColorScheme() const isDark = isTestEnv() ? false : userSelectedColorScheme === 'dark' diff --git a/packages/wallet/src/state/walletMigrations.ts b/packages/wallet/src/state/walletMigrations.ts index ffd95971b5d..c4d35a7b341 100644 --- a/packages/wallet/src/state/walletMigrations.ts +++ b/packages/wallet/src/state/walletMigrations.ts @@ -2,12 +2,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { AccountType } from 'uniswap/src/features/accounts/types' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' -import { Language } from 'uniswap/src/features/language/constants' -import { BasicTokenInfo, SerializedTokenMap } from 'uniswap/src/features/tokens/slice/types' -import { CurrencyId } from 'uniswap/src/types/currency' import { areAddressesEqual } from 'uniswap/src/utils/addresses' -import { currencyIdToAddress, currencyIdToChain } from 'uniswap/src/utils/currencyId' import { Account } from 'wallet/src/features/wallet/accounts/types' // Mobile: 63 @@ -233,79 +228,3 @@ export function deleteHoldToSwapBehaviorHistory(state: any): any { delete newState.behaviorHistory?.hasSubmittedHoldToSwap return newState } - -// Mobile: 76 -// Extension: 12 -export function addCreatedOnboardingRedesignAccountBehaviorHistory(state: any): any { - const newState = { - ...state, - behaviorHistory: { - ...state.behaviorHistory, - createdOnboardingRedesignAccount: false, - }, - } - return newState -} - -export function moveDismissedTokenWarnings(state: any): any { - // Don't migrate if the state doesn't exist - if (typeof state.tokens?.dismissedWarningTokens !== 'object') { - return state - } - - // Translate old warning - const newWarnings: SerializedTokenMap = {} - Object.keys(state.tokens.dismissedWarningTokens).forEach((currencyId: CurrencyId) => { - const chainId = currencyIdToChain(currencyId) - const address = currencyIdToAddress(currencyId) - if (chainId) { - const serializedToken: BasicTokenInfo = { - chainId, - address, - } - newWarnings[chainId] = newWarnings[chainId] || {} - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - newWarnings[chainId]![address] = serializedToken - } - }) - - // Replace old warnings with new warnings - const newState = { - ...state, - tokens: { - dismissedTokenWarnings: newWarnings, - }, - } - - return newState -} - -export function moveLanguageSetting(state: any): any { - const newState = { - ...state, - languageSettings: undefined, - userSettings: { - ...state.userSettings, - currentLanguage: state.languageSettings?.currentLanguage ?? Language.English, - }, - } - - delete newState.languageSettings - - return newState -} - -export function moveCurrencySetting(state: any): any { - const newState = { - ...state, - fiatCurrencySettings: undefined, - userSettings: { - ...state.userSettings, - currentCurrency: state.fiatCurrencySettings?.currentCurrency ?? FiatCurrency.UnitedStatesDollar, - }, - } - - delete newState.fiatCurrencySettings - - return newState -} diff --git a/packages/wallet/src/state/walletMigrationsTests.ts b/packages/wallet/src/state/walletMigrationsTests.ts index 876c91ea3a3..f8e93fe7678 100644 --- a/packages/wallet/src/state/walletMigrationsTests.ts +++ b/packages/wallet/src/state/walletMigrationsTests.ts @@ -1,11 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable max-lines */ -import { USDC } from 'uniswap/src/constants/tokens' import { AccountType } from 'uniswap/src/features/accounts/types' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' -import { Language } from 'uniswap/src/features/language/constants' -import { UniverseChainId } from 'uniswap/src/types/chains' -import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { Account } from 'wallet/src/features/wallet/accounts/types' export function testActivatePendingAccounts(migration: (state: any) => any, prevSchema: any): void { @@ -537,42 +532,3 @@ export function testRemoveHoldToSwap(migration: (state: any) => any, prevSchema: expect(result.behaviorHistory.hasViewedReviewScreen).toBe(undefined) expect(result.behaviorHistory.hasSubmittedHoldToSwap).toBe(undefined) } - -export function testAddCreatedOnboardingRedesignAccount(migration: (state: any) => any, prevSchema: any): void { - const result = migration(prevSchema) - - expect(result.behaviorHistory.createdOnboardingRedesignAccount).toBe(false) -} - -export function testMovedTokenWarnings(migration: (state: any) => any, prevSchema: any): void { - const prevSchemaWithWarnings = { - ...prevSchema, - tokens: { - dismissedWarningTokens: { - [buildCurrencyId(UniverseChainId.Mainnet, USDC.address)]: true, - }, - }, - } - const result = migration(prevSchemaWithWarnings) - expect(result.tokens.dismissedWarningTokens).toEqual(undefined) - expect(result.tokens.dismissedTokenWarnings).toMatchObject({ - [UniverseChainId.Mainnet]: { - [USDC.address]: { - chainId: UniverseChainId.Mainnet, - address: USDC.address, - }, - }, - }) -} - -export function testMovedLanguageSetting(migration: (state: any) => any, prevSchema: any): void { - const result = migration(prevSchema) - expect(result.languageSettings).toEqual(undefined) - expect(result.userSettings.currentLanguage).toEqual(Language.English) -} - -export function testMovedCurrencySetting(migration: (state: any) => any, prevSchema: any): void { - const result = migration(prevSchema) - expect(result.fiatCurrencySettings).toEqual(undefined) - expect(result.userSettings.currentCurrency).toEqual(FiatCurrency.UnitedStatesDollar) -} diff --git a/packages/wallet/src/state/walletReducer.ts b/packages/wallet/src/state/walletReducer.ts index 3030dbe076a..49ade70b2da 100644 --- a/packages/wallet/src/state/walletReducer.ts +++ b/packages/wallet/src/state/walletReducer.ts @@ -4,6 +4,8 @@ import { timingReducer } from 'uniswap/src/features/timing/slice' import { uniswapPersistedStateList, uniswapReducers } from 'uniswap/src/state/uniswapReducer' import { appearanceSettingsReducer } from 'wallet/src/features/appearance/slice' import { behaviorHistoryReducer } from 'wallet/src/features/behaviorHistory/slice' +import { fiatCurrencySettingsReducer } from 'wallet/src/features/fiatCurrency/slice' +import { languageSettingsReducer } from 'wallet/src/features/language/slice' import { notificationReducer } from 'wallet/src/features/notifications/slice' import { telemetryReducer } from 'wallet/src/features/telemetry/slice' import { walletReducer } from 'wallet/src/features/wallet/slice' @@ -13,6 +15,8 @@ export const walletReducers = { ...uniswapReducers, appearanceSettings: appearanceSettingsReducer, behaviorHistory: behaviorHistoryReducer, + fiatCurrencySettings: fiatCurrencySettingsReducer, + languageSettings: languageSettingsReducer, notifications: notificationReducer, telemetry: telemetryReducer, timing: timingReducer, @@ -29,6 +33,8 @@ export const walletPersistedStateList: Array = [ 'notifications', 'telemetry', 'wallet', + 'languageSettings', + 'fiatCurrencySettings', ] export type WalletStateReducersOnly = ReturnType diff --git a/packages/uniswap/src/test/fixtures/gql/activities/index.ts b/packages/wallet/src/test/fixtures/gql/activities/index.ts similarity index 89% rename from packages/uniswap/src/test/fixtures/gql/activities/index.ts rename to packages/wallet/src/test/fixtures/gql/activities/index.ts index 46433bb54a5..a5287711e2c 100644 --- a/packages/uniswap/src/test/fixtures/gql/activities/index.ts +++ b/packages/wallet/src/test/fixtures/gql/activities/index.ts @@ -6,17 +6,17 @@ import { TransactionStatus, TransactionType, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { STALE_TRANSACTION_TIME_MS } from 'uniswap/src/features/notifications/constants' +import { MAX_FIXTURE_TIMESTAMP, faker } from 'uniswap/src/test/shared' +import { createFixture, randomChoice, randomEnumValue } from 'uniswap/src/test/utils' +import { ONE_MINUTE_MS } from 'utilities/src/time/time' +import { STALE_TRANSACTION_TIME_MS } from 'wallet/src/features/notifications/notificationWatcherSaga' import { erc20ApproveAssetChange, erc20TokenTransferOut, erc20TransferIn, -} from 'uniswap/src/test/fixtures/gql/activities/tokens' -import { GQL_CHAINS } from 'uniswap/src/test/fixtures/gql/misc' -import { gqlTransaction, gqlTransactionDetails } from 'uniswap/src/test/fixtures/gql/transactions' -import { MAX_FIXTURE_TIMESTAMP, faker } from 'uniswap/src/test/shared' -import { createFixture, randomChoice, randomEnumValue } from 'uniswap/src/test/utils' -import { ONE_MINUTE_MS } from 'utilities/src/time/time' +} from 'wallet/src/test/fixtures/gql/activities/tokens' +import { GQL_CHAINS } from 'wallet/src/test/fixtures/gql/misc' +import { gqlTransaction, gqlTransactionDetails } from 'wallet/src/test/fixtures/gql/transactions' export * from './nfts' export * from './swap' export * from './tokens' diff --git a/packages/uniswap/src/test/fixtures/gql/activities/nfts.ts b/packages/wallet/src/test/fixtures/gql/activities/nfts.ts similarity index 94% rename from packages/uniswap/src/test/fixtures/gql/activities/nfts.ts rename to packages/wallet/src/test/fixtures/gql/activities/nfts.ts index 9211244be6c..fa662ecd938 100644 --- a/packages/uniswap/src/test/fixtures/gql/activities/nfts.ts +++ b/packages/wallet/src/test/fixtures/gql/activities/nfts.ts @@ -5,9 +5,9 @@ import { NftTransfer, TransactionDirection, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { nftAsset } from 'uniswap/src/test/fixtures/gql/assets' import { faker } from 'uniswap/src/test/shared' import { createFixture, randomEnumValue } from 'uniswap/src/test/utils' +import { nftAsset } from 'wallet/src/test/fixtures/gql/assets' export const nftApproval = createFixture()(() => ({ __typename: 'NftApproval', diff --git a/packages/uniswap/src/test/fixtures/gql/activities/swap.ts b/packages/wallet/src/test/fixtures/gql/activities/swap.ts similarity index 93% rename from packages/uniswap/src/test/fixtures/gql/activities/swap.ts rename to packages/wallet/src/test/fixtures/gql/activities/swap.ts index e4839504832..01e67ee0ec4 100644 --- a/packages/uniswap/src/test/fixtures/gql/activities/swap.ts +++ b/packages/wallet/src/test/fixtures/gql/activities/swap.ts @@ -3,9 +3,9 @@ import { SwapOrderStatus, SwapOrderType, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { daiToken, ethToken } from 'uniswap/src/test/fixtures/gql/assets' import { faker } from 'uniswap/src/test/shared' import { createFixture, randomEnumValue } from 'uniswap/src/test/utils' +import { daiToken, ethToken } from 'wallet/src/test/fixtures/gql/assets' export const swapOrderDetails = createFixture()(() => ({ __typename: 'SwapOrderDetails', diff --git a/packages/uniswap/src/test/fixtures/gql/activities/tokens.ts b/packages/wallet/src/test/fixtures/gql/activities/tokens.ts similarity index 92% rename from packages/uniswap/src/test/fixtures/gql/activities/tokens.ts rename to packages/wallet/src/test/fixtures/gql/activities/tokens.ts index 9851de6803a..8f2e0cd62a9 100644 --- a/packages/uniswap/src/test/fixtures/gql/activities/tokens.ts +++ b/packages/wallet/src/test/fixtures/gql/activities/tokens.ts @@ -5,10 +5,10 @@ import { TokenTransfer, TransactionDirection, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { amount } from 'uniswap/src/test/fixtures/gql/amounts' -import { daiToken, ethToken } from 'uniswap/src/test/fixtures/gql/assets' import { faker } from 'uniswap/src/test/shared' import { createFixture, randomEnumValue } from 'uniswap/src/test/utils' +import { amount } from 'wallet/src/test/fixtures/gql/amounts' +import { daiToken, ethToken } from 'wallet/src/test/fixtures/gql/assets' /** * Base fixtures diff --git a/packages/uniswap/src/test/fixtures/gql/amounts.ts b/packages/wallet/src/test/fixtures/gql/amounts.ts similarity index 100% rename from packages/uniswap/src/test/fixtures/gql/amounts.ts rename to packages/wallet/src/test/fixtures/gql/amounts.ts diff --git a/packages/uniswap/src/test/fixtures/gql/assets/constants.ts b/packages/wallet/src/test/fixtures/gql/assets/constants.ts similarity index 100% rename from packages/uniswap/src/test/fixtures/gql/assets/constants.ts rename to packages/wallet/src/test/fixtures/gql/assets/constants.ts diff --git a/packages/uniswap/src/test/fixtures/gql/assets/index.ts b/packages/wallet/src/test/fixtures/gql/assets/index.ts similarity index 100% rename from packages/uniswap/src/test/fixtures/gql/assets/index.ts rename to packages/wallet/src/test/fixtures/gql/assets/index.ts diff --git a/packages/uniswap/src/test/fixtures/gql/assets/nfts.ts b/packages/wallet/src/test/fixtures/gql/assets/nfts.ts similarity index 88% rename from packages/uniswap/src/test/fixtures/gql/assets/nfts.ts rename to packages/wallet/src/test/fixtures/gql/assets/nfts.ts index 50b140fc75c..660ad1d2080 100644 --- a/packages/uniswap/src/test/fixtures/gql/assets/nfts.ts +++ b/packages/wallet/src/test/fixtures/gql/assets/nfts.ts @@ -4,9 +4,10 @@ import { NftCollection, NftContract, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { GQL_CHAINS, image } from 'uniswap/src/test/fixtures/gql/misc' import { faker } from 'uniswap/src/test/shared' -import { createArray, createFixture, randomChoice } from 'uniswap/src/test/utils' +import { createFixture, randomChoice } from 'uniswap/src/test/utils' +import { GQL_CHAINS, image } from 'wallet/src/test/fixtures/gql/misc' +import { createArray } from 'wallet/src/test/utils' /** * Base fixtures diff --git a/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts b/packages/wallet/src/test/fixtures/gql/assets/tokens.ts similarity index 96% rename from packages/uniswap/src/test/fixtures/gql/assets/tokens.ts rename to packages/wallet/src/test/fixtures/gql/assets/tokens.ts index 08c43e8e22f..79c7a321f72 100644 --- a/packages/uniswap/src/test/fixtures/gql/assets/tokens.ts +++ b/packages/wallet/src/test/fixtures/gql/assets/tokens.ts @@ -12,9 +12,11 @@ import { TokenProjectMarket, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { toGraphQLChain } from 'uniswap/src/features/chains/utils' -import { amounts } from 'uniswap/src/test/fixtures/gql/amounts' -import { get24hPriceChange, getLatestPrice, priceHistory } from 'uniswap/src/test/fixtures/gql/history' -import { GQL_CHAINS, image } from 'uniswap/src/test/fixtures/gql/misc' +import { MAX_FIXTURE_TIMESTAMP, faker } from 'uniswap/src/test/shared' +import { createFixture, randomChoice, randomEnumValue } from 'uniswap/src/test/utils' +import { amounts } from 'wallet/src/test/fixtures/gql/amounts' +import { get24hPriceChange, getLatestPrice, priceHistory } from 'wallet/src/test/fixtures/gql/history' +import { GQL_CHAINS, image } from 'wallet/src/test/fixtures/gql/misc' import { DAI, ETH, @@ -24,9 +26,7 @@ import { USDC_OPTIMISM, USDC_POLYGON, WETH, -} from 'uniswap/src/test/fixtures/lib' -import { MAX_FIXTURE_TIMESTAMP, faker } from 'uniswap/src/test/shared' -import { createFixture, randomChoice, randomEnumValue } from 'uniswap/src/test/utils' +} from 'wallet/src/test/fixtures/lib' /** * Base fixtures diff --git a/packages/uniswap/src/test/fixtures/gql/history.ts b/packages/wallet/src/test/fixtures/gql/history.ts similarity index 91% rename from packages/uniswap/src/test/fixtures/gql/history.ts rename to packages/wallet/src/test/fixtures/gql/history.ts index 3050ed211ee..4c24841992d 100644 --- a/packages/uniswap/src/test/fixtures/gql/history.ts +++ b/packages/wallet/src/test/fixtures/gql/history.ts @@ -3,10 +3,11 @@ import { HistoryDuration, TimestampedAmount, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { amount, timestampedAmount } from 'uniswap/src/test/fixtures/gql/amounts' import { faker } from 'uniswap/src/test/shared' -import { createArray, createFixture, randomEnumValue } from 'uniswap/src/test/utils' +import { createFixture, randomEnumValue } from 'uniswap/src/test/utils' import { ONE_DAY_MS, ONE_HOUR_MS, ONE_MINUTE_MS } from 'utilities/src/time/time' +import { amount, timestampedAmount } from 'wallet/src/test/fixtures/gql/amounts' +import { createArray } from 'wallet/src/test/utils' /** * Constants diff --git a/packages/uniswap/src/test/fixtures/gql/index.ts b/packages/wallet/src/test/fixtures/gql/index.ts similarity index 100% rename from packages/uniswap/src/test/fixtures/gql/index.ts rename to packages/wallet/src/test/fixtures/gql/index.ts diff --git a/packages/uniswap/src/test/fixtures/gql/misc.ts b/packages/wallet/src/test/fixtures/gql/misc.ts similarity index 100% rename from packages/uniswap/src/test/fixtures/gql/misc.ts rename to packages/wallet/src/test/fixtures/gql/misc.ts diff --git a/packages/uniswap/src/test/fixtures/gql/portfolio.ts b/packages/wallet/src/test/fixtures/gql/portfolio.ts similarity index 77% rename from packages/uniswap/src/test/fixtures/gql/portfolio.ts rename to packages/wallet/src/test/fixtures/gql/portfolio.ts index e70ee5d6877..ac676ed2c22 100644 --- a/packages/uniswap/src/test/fixtures/gql/portfolio.ts +++ b/packages/wallet/src/test/fixtures/gql/portfolio.ts @@ -1,9 +1,10 @@ import { Portfolio } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { assetActivity } from 'uniswap/src/test/fixtures/gql' -import { amount } from 'uniswap/src/test/fixtures/gql/amounts' -import { tokenBalance } from 'uniswap/src/test/fixtures/gql/assets' import { faker } from 'uniswap/src/test/shared' -import { createArray, createFixture } from 'uniswap/src/test/utils' +import { createFixture } from 'uniswap/src/test/utils' +import { assetActivity } from 'wallet/src/test/fixtures/gql/activities' +import { amount } from 'wallet/src/test/fixtures/gql/amounts' +import { tokenBalance } from 'wallet/src/test/fixtures/gql/assets' +import { createArray } from 'wallet/src/test/utils' type PortfolioOptions = { activitiesCount: number diff --git a/packages/uniswap/src/test/fixtures/gql/transactions.ts b/packages/wallet/src/test/fixtures/gql/transactions.ts similarity index 100% rename from packages/uniswap/src/test/fixtures/gql/transactions.ts rename to packages/wallet/src/test/fixtures/gql/transactions.ts diff --git a/packages/wallet/src/test/fixtures/index.ts b/packages/wallet/src/test/fixtures/index.ts index 67eb1b4caa1..15c26d7917f 100644 --- a/packages/wallet/src/test/fixtures/index.ts +++ b/packages/wallet/src/test/fixtures/index.ts @@ -1 +1,4 @@ +export * from './gql' +export * from './gql/assets/constants' +export * from './lib' export * from './wallet' diff --git a/packages/wallet/src/test/fixtures/lib/index.ts b/packages/wallet/src/test/fixtures/lib/index.ts new file mode 100644 index 00000000000..a2d48feca58 --- /dev/null +++ b/packages/wallet/src/test/fixtures/lib/index.ts @@ -0,0 +1,2 @@ +export * from './netinfo' +export * from './sdk' diff --git a/packages/uniswap/src/test/fixtures/lib/netinfo.ts b/packages/wallet/src/test/fixtures/lib/netinfo.ts similarity index 93% rename from packages/uniswap/src/test/fixtures/lib/netinfo.ts rename to packages/wallet/src/test/fixtures/lib/netinfo.ts index 3047267a9d4..eae4b353710 100644 --- a/packages/uniswap/src/test/fixtures/lib/netinfo.ts +++ b/packages/wallet/src/test/fixtures/lib/netinfo.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line no-restricted-imports import { NetInfoConnectedStates, NetInfoNoConnectionState, diff --git a/packages/uniswap/src/test/fixtures/lib/sdk.ts b/packages/wallet/src/test/fixtures/lib/sdk.ts similarity index 100% rename from packages/uniswap/src/test/fixtures/lib/sdk.ts rename to packages/wallet/src/test/fixtures/lib/sdk.ts diff --git a/packages/wallet/src/test/fixtures/wallet/accounts.ts b/packages/wallet/src/test/fixtures/wallet/accounts.ts index 7e974510a4a..450a08e11dc 100644 --- a/packages/wallet/src/test/fixtures/wallet/accounts.ts +++ b/packages/wallet/src/test/fixtures/wallet/accounts.ts @@ -1,5 +1,4 @@ import { AccountType } from 'uniswap/src/features/accounts/types' -import { SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, SAMPLE_SEED_ADDRESS_3 } from 'uniswap/src/test/fixtures' import { faker } from 'uniswap/src/test/shared' import { createFixture, randomEnumValue } from 'uniswap/src/test/utils' import { @@ -8,6 +7,7 @@ import { SignerMnemonicAccount, WalletAccountFields, } from 'wallet/src/features/wallet/accounts/types' +import { SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, SAMPLE_SEED_ADDRESS_3 } from 'wallet/src/test/fixtures' /** * Base fixtures diff --git a/packages/uniswap/src/test/fixtures/wallet/balances.ts b/packages/wallet/src/test/fixtures/wallet/balances.ts similarity index 93% rename from packages/uniswap/src/test/fixtures/wallet/balances.ts rename to packages/wallet/src/test/fixtures/wallet/balances.ts index 0e6e146c998..b3246a253e9 100644 --- a/packages/uniswap/src/test/fixtures/wallet/balances.ts +++ b/packages/wallet/src/test/fixtures/wallet/balances.ts @@ -2,10 +2,12 @@ import { Portfolio, Token, TokenBalance } from 'uniswap/src/data/graphql/uniswap import { fromGraphQLChain } from 'uniswap/src/features/chains/utils' import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' import { buildCurrency } from 'uniswap/src/features/dataApi/utils' -import { currencyInfo, portfolio, tokenBalance } from 'uniswap/src/test/fixtures' +import { currencyInfo } from 'uniswap/src/test/fixtures/wallet/currencies' import { faker } from 'uniswap/src/test/shared' import { createFixture } from 'uniswap/src/test/utils' import { currencyId } from 'uniswap/src/utils/currencyId' +import { portfolio } from 'wallet/src/test/fixtures/gql' +import { tokenBalance } from 'wallet/src/test/fixtures/gql/assets' const portfolioBalanceBase = createFixture()(() => ({ cacheId: faker.datatype.uuid(), diff --git a/packages/wallet/src/test/fixtures/wallet/index.ts b/packages/wallet/src/test/fixtures/wallet/index.ts index 7de7aabca25..9229c158e63 100644 --- a/packages/wallet/src/test/fixtures/wallet/index.ts +++ b/packages/wallet/src/test/fixtures/wallet/index.ts @@ -1,4 +1,5 @@ export * from './accounts' +export * from './balances' export * from './notifications' export * from './recipients' export * from './redux' diff --git a/packages/wallet/src/test/fixtures/wallet/recipients.ts b/packages/wallet/src/test/fixtures/wallet/recipients.ts index 2e6b9f307c8..a41ea71776b 100644 --- a/packages/wallet/src/test/fixtures/wallet/recipients.ts +++ b/packages/wallet/src/test/fixtures/wallet/recipients.ts @@ -1,7 +1,7 @@ import { SectionListData } from 'react-native' -import { SearchableRecipient } from 'uniswap/src/features/address/types' import { faker } from 'uniswap/src/test/shared' import { createFixture } from 'uniswap/src/test/utils' +import { SearchableRecipient } from 'wallet/src/features/address/types' export const searchableRecipient = createFixture()(() => ({ address: faker.finance.ethereumAddress(), diff --git a/packages/uniswap/src/test/mocks/gql/index.ts b/packages/wallet/src/test/mocks/gql/index.ts similarity index 100% rename from packages/uniswap/src/test/mocks/gql/index.ts rename to packages/wallet/src/test/mocks/gql/index.ts diff --git a/packages/uniswap/src/test/mocks/gql/mocks.ts b/packages/wallet/src/test/mocks/gql/mocks.ts similarity index 98% rename from packages/uniswap/src/test/mocks/gql/mocks.ts rename to packages/wallet/src/test/mocks/gql/mocks.ts index 2dc04321313..0e1e231dbe5 100644 --- a/packages/uniswap/src/test/mocks/gql/mocks.ts +++ b/packages/wallet/src/test/mocks/gql/mocks.ts @@ -5,9 +5,9 @@ import { SwapOrderStatus, TransactionStatus, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { GQL_CHAINS } from 'uniswap/src/test/fixtures' import { MAX_FIXTURE_TIMESTAMP, faker } from 'uniswap/src/test/shared' import { randomChoice, randomEnumValue } from 'uniswap/src/test/utils' +import { GQL_CHAINS } from 'wallet/src/test/fixtures' export const mocks = { TokenProject: { diff --git a/packages/uniswap/src/test/mocks/gql/provider.tsx b/packages/wallet/src/test/mocks/gql/provider.tsx similarity index 86% rename from packages/uniswap/src/test/mocks/gql/provider.tsx rename to packages/wallet/src/test/mocks/gql/provider.tsx index 991c1ef3172..925af395046 100644 --- a/packages/uniswap/src/test/mocks/gql/provider.tsx +++ b/packages/wallet/src/test/mocks/gql/provider.tsx @@ -9,10 +9,10 @@ import { PropsWithChildren } from 'react' import { setupWalletCache } from 'uniswap/src/data/cache' import { Resolvers } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { getErrorLink, getRestLink } from 'uniswap/src/data/links' -import { mocks as defaultMocks } from 'uniswap/src/test/mocks/gql/mocks' -import { defaultResolvers } from 'uniswap/src/test/mocks/gql/resolvers' +import { mocks as defaultMocks } from 'wallet/src/test/mocks/gql/mocks' +import { defaultResolvers } from 'wallet/src/test/mocks/gql/resolvers' -const GQL_SCHEMA_PATH = path.join(__dirname, '../../../data/graphql/uniswap-data-api/schema.graphql') +const GQL_SCHEMA_PATH = path.join(__dirname, '../../../../../uniswap/src/data/graphql/uniswap-data-api/schema.graphql') const baseSchema = loadSchemaSync(GQL_SCHEMA_PATH, { loaders: [new GraphQLFileLoader()] }) diff --git a/packages/uniswap/src/test/mocks/gql/resolvers.ts b/packages/wallet/src/test/mocks/gql/resolvers.ts similarity index 87% rename from packages/uniswap/src/test/mocks/gql/resolvers.ts rename to packages/wallet/src/test/mocks/gql/resolvers.ts index 221a3d62cb8..f5dbbbcd580 100644 --- a/packages/uniswap/src/test/mocks/gql/resolvers.ts +++ b/packages/wallet/src/test/mocks/gql/resolvers.ts @@ -1,6 +1,6 @@ import { GraphQLJSON } from 'graphql-scalars' import { HistoryDuration, Resolvers } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { priceHistory, tokenProject } from 'uniswap/src/test/fixtures' +import { priceHistory, tokenProject } from 'wallet/src/test/fixtures' export const defaultResolvers: Resolvers = { Query: { diff --git a/packages/wallet/src/test/mocks/index.ts b/packages/wallet/src/test/mocks/index.ts index 1bef1f06af9..c4101c28b72 100644 --- a/packages/wallet/src/test/mocks/index.ts +++ b/packages/wallet/src/test/mocks/index.ts @@ -1,3 +1,4 @@ +export * from './gql' export * from './providers' export * from './sdk' export * from './utils' diff --git a/packages/wallet/src/test/mocks/utils.ts b/packages/wallet/src/test/mocks/utils.ts index fb40cc34e81..95380b1b179 100644 --- a/packages/wallet/src/test/mocks/utils.ts +++ b/packages/wallet/src/test/mocks/utils.ts @@ -1,7 +1,5 @@ import { Currency, CurrencyAmount } from '@uniswap/sdk-core' import { PropsWithChildren, ReactNode } from 'react' -import { FiatCurrency } from 'uniswap/src/features/fiatCurrency/constants' -import { LocalizationContextState } from 'uniswap/src/features/language/LocalizationContext' // eslint-disable-next-line no-restricted-imports import { addFiatSymbolToNumber, @@ -10,6 +8,8 @@ import { formatPercent, } from 'utilities/src/format/localeBased' import { NumberType } from 'utilities/src/format/types' +import { FiatCurrency } from 'wallet/src/features/fiatCurrency/constants' +import { LocalizationContextState } from 'wallet/src/features/language/LocalizationContext' export const mockLocalizedFormatter: LocalizationContextState = { formatCurrencyAmount(input): string { diff --git a/packages/wallet/src/test/render.tsx b/packages/wallet/src/test/render.tsx index 5ea75598d13..90376293ab9 100644 --- a/packages/wallet/src/test/render.tsx +++ b/packages/wallet/src/test/render.tsx @@ -13,10 +13,10 @@ import { import React, { PropsWithChildren } from 'react' import { Resolvers } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context' -import { AutoMockedApolloProvider } from 'uniswap/src/test/mocks' import { WalletNavigationContextState, WalletNavigationProvider } from 'wallet/src/contexts/WalletNavigationContext' -import { SharedWalletProvider } from 'wallet/src/provider' +import { SharedProvider } from 'wallet/src/provider' import { WalletStateReducersOnly, walletRootReducer } from 'wallet/src/state/walletReducer' +import { AutoMockedApolloProvider } from 'wallet/src/test/mocks' // This type extends the default options for render from RTL, as well // as allows the user to specify other things such as initialState, store. @@ -69,11 +69,11 @@ export function renderWithProviders( function Wrapper({ children }: PropsWithChildren): JSX.Element { return ( - + {children} - + ) } @@ -138,7 +138,7 @@ export function renderHookWithProviders

( function Wrapper({ children }: PropsWithChildren): JSX.Element { return ( - {children} + {children} ) } diff --git a/packages/wallet/src/test/test-utils.ts b/packages/wallet/src/test/test-utils.ts index 721db2ec38e..d456fc81768 100644 --- a/packages/wallet/src/test/test-utils.ts +++ b/packages/wallet/src/test/test-utils.ts @@ -1,6 +1,7 @@ import { renderHookWithProviders, renderWithProviders } from 'wallet/src/test/render' export { MAX_FIXTURE_TIMESTAMP, faker } from '../../../uniswap/src/test/shared' +export { createArray } from './utils' // re-export everything export * from '@testing-library/react-native' diff --git a/packages/uniswap/src/test/utils/array.ts b/packages/wallet/src/test/utils/array.ts similarity index 100% rename from packages/uniswap/src/test/utils/array.ts rename to packages/wallet/src/test/utils/array.ts diff --git a/packages/wallet/src/test/utils/index.ts b/packages/wallet/src/test/utils/index.ts new file mode 100644 index 00000000000..15a6c29a4e5 --- /dev/null +++ b/packages/wallet/src/test/utils/index.ts @@ -0,0 +1,3 @@ +export * from './array' +export * from './resolvers' +export * from './wallet' diff --git a/packages/uniswap/src/test/utils/resolvers.ts b/packages/wallet/src/test/utils/resolvers.ts similarity index 100% rename from packages/uniswap/src/test/utils/resolvers.ts rename to packages/wallet/src/test/utils/resolvers.ts diff --git a/packages/uniswap/src/utils/balances.ts b/packages/wallet/src/test/utils/wallet/balances.ts similarity index 87% rename from packages/uniswap/src/utils/balances.ts rename to packages/wallet/src/test/utils/wallet/balances.ts index 75f7f2d42f1..2cad1316590 100644 --- a/packages/uniswap/src/utils/balances.ts +++ b/packages/wallet/src/test/utils/wallet/balances.ts @@ -1,5 +1,5 @@ import { PortfolioBalance } from 'uniswap/src/features/dataApi/types' -import { portfolioBalances } from 'uniswap/src/test/fixtures' +import { portfolioBalances } from 'wallet/src/test/fixtures' export function portfolioBalancesById(inputBalances?: PortfolioBalance[]): Record { const balances = inputBalances ?? portfolioBalances() diff --git a/packages/wallet/src/test/utils/wallet/index.ts b/packages/wallet/src/test/utils/wallet/index.ts new file mode 100644 index 00000000000..4997641219b --- /dev/null +++ b/packages/wallet/src/test/utils/wallet/index.ts @@ -0,0 +1 @@ +export * from './balances' diff --git a/packages/wallet/src/utils/currency.ts b/packages/wallet/src/utils/currency.ts index 38928789930..14d1f882e75 100644 --- a/packages/wallet/src/utils/currency.ts +++ b/packages/wallet/src/utils/currency.ts @@ -1,8 +1,8 @@ import { Currency } from '@uniswap/sdk-core' -import { LocalizationContextState } from 'uniswap/src/features/language/LocalizationContext' import { ValueType, getCurrencyAmount } from 'uniswap/src/features/tokens/getCurrencyAmount' import { getValidAddress, shortenAddress } from 'uniswap/src/utils/addresses' import { getSymbolDisplayText } from 'uniswap/src/utils/currency' +import { LocalizationContextState } from 'wallet/src/features/language/LocalizationContext' export function getFormattedCurrencyAmount( currency: Maybe, diff --git a/packages/wallet/src/utils/layout.ts b/packages/wallet/src/utils/layout.ts deleted file mode 100644 index f42915d59ca..00000000000 --- a/packages/wallet/src/utils/layout.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { useState } from 'react' -import { NativeSyntheticEvent, TextLayoutEventData } from 'react-native' - -type ElementPositionProps = { - position: 'absolute' - left: number - top: number -} - -/** - * - * @returns props that absolutely position an element right after the last word of the last line of text - * For this to work you must pass in into the text that you want it to be positioned next to - */ -export function usePostTextElementPositionProps(): { - postTextElementPositionProps?: ElementPositionProps - onTextLayout: (event: NativeSyntheticEvent) => void -} { - const [postTextElementPositionProps, setPostTextElementPositionProps] = useState( - undefined, - ) - - const onTextLayout = (event: NativeSyntheticEvent): void => { - const { lines } = event.nativeEvent - const lastLine = lines[lines.length - 1] - if (!lastLine) { - return - } - - const { width, x, y } = lastLine - setPostTextElementPositionProps({ position: 'absolute', left: x + width, top: y }) - } - - return { postTextElementPositionProps, onTextLayout } -} diff --git a/packages/wallet/src/utils/linking.ts b/packages/wallet/src/utils/linking.ts index 468eae80c5f..db277470141 100644 --- a/packages/wallet/src/utils/linking.ts +++ b/packages/wallet/src/utils/linking.ts @@ -3,12 +3,13 @@ import { Linking } from 'react-native' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { uniswapUrls } from 'uniswap/src/constants/urls' import { toUniswapWebAppLink } from 'uniswap/src/features/chains/utils' -import { BACKEND_NATIVE_CHAIN_ADDRESS_STRING } from 'uniswap/src/features/search/utils' import { ServiceProviderInfo } from 'uniswap/src/features/transactions/types/transactionDetails' import { UniverseChainId, WalletChainId } from 'uniswap/src/types/chains' import { currencyIdToChain, currencyIdToGraphQLAddress } from 'uniswap/src/utils/currencyId' import { openUri } from 'uniswap/src/utils/linking' +export const UNISWAP_APP_NATIVE_TOKEN = 'NATIVE' + export function dismissInAppBrowser(): void { WebBrowser.dismissBrowser() } @@ -114,7 +115,7 @@ export function getProfileUrl(walletAddress: string): string { const UTM_TAGS_MOBILE = 'utm_medium=mobile&utm_source=share-tdp' export function getTokenUrl(currencyId: string, addMobileUTMTags: boolean = false): string | undefined { - const chainId = currencyIdToChain(currencyId) as WalletChainId + const chainId = currencyIdToChain(currencyId) if (!chainId) { return } @@ -124,7 +125,7 @@ export function getTokenUrl(currencyId: string, addMobileUTMTags: boolean = fals // in case it's a native token if (tokenAddress === null) { // this is how web app handles native tokens - tokenAddress = BACKEND_NATIVE_CHAIN_ADDRESS_STRING + tokenAddress = UNISWAP_APP_NATIVE_TOKEN } const tokenUrl = `${uniswapUrls.webInterfaceTokensUrl}/${network}/${tokenAddress}` return addMobileUTMTags ? tokenUrl + `?${UTM_TAGS_MOBILE}` : tokenUrl diff --git a/packages/wallet/tsconfig.json b/packages/wallet/tsconfig.json index 91eb7943ea4..5ffa56b4a66 100644 --- a/packages/wallet/tsconfig.json +++ b/packages/wallet/tsconfig.json @@ -5,7 +5,7 @@ "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.json" - ], + ], "references": [ { "path": "../ui" diff --git a/turbo.json b/turbo.json index 2aff82dd422..d9f03d6cfcd 100644 --- a/turbo.json +++ b/turbo.json @@ -6,6 +6,14 @@ "package.json" ] }, + "uniswap#tradingapi:generate": { + "inputs": [ + "src/data/tradingApi/api.json" + ], + "outputs": [ + "src/**/__generated__/**" + ] + }, "@uniswap/interface#prepare": { "inputs": [ "package.json" @@ -28,12 +36,12 @@ "^prepare" ] }, - "uniswap#tradingapi:generate": { + "wallet#prepare": { "inputs": [ - "src/data/tradingApi/api.json" + "package.json" ], - "outputs": [ - "src/**/__generated__/**" + "dependsOn": [ + "^prepare" ] }, "uniswap#contracts": { @@ -88,8 +96,7 @@ "data/__generated__/**", "graphql/__generated__/**" ], - "dependsOn": [], - "cache": false + "dependsOn": [] }, "typecheck": { "inputs": [ @@ -99,8 +106,7 @@ "outputs": [], "dependsOn": [ "prepare", - "^typecheck", - "^build" + "^typecheck" ] }, "check:circular": {}, @@ -166,8 +172,7 @@ ], "outputs": [ "**/dist/**", - "./apps/next/.next/**", - "**/types/**" + "./apps/next/.next/**" ], "dependsOn": [ "^build" diff --git a/yarn.lock b/yarn.lock index 9fb22a38e4e..33788884adf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14295,15 +14295,6 @@ __metadata: languageName: node linkType: hard -"@types/qrcode@npm:1.5.5": - version: 1.5.5 - resolution: "@types/qrcode@npm:1.5.5" - dependencies: - "@types/node": "*" - checksum: d92c1d3e77406bf13a03ec521b2ffb1ac99b2e6ea3a17cad670f2610f62e1293554c57e4074bb2fd4e9369f475f863b69e0ae8c543cb049c4a3c1b0c2d92522a - languageName: node - linkType: hard - "@types/qs@npm:*, @types/qs@npm:^6.9.5": version: 6.9.11 resolution: "@types/qs@npm:6.9.11" @@ -15150,10 +15141,10 @@ __metadata: languageName: node linkType: hard -"@uniswap/client-explore@npm:0.0.9": - version: 0.0.9 - resolution: "@uniswap/client-explore@npm:0.0.9" - checksum: 206d3c42e724d9261fc9be21cc1ce9ef1fb4ab29f4fda510be5e14d2c1bc0e4aab6779303923bee11941d49c8e3ccffe541cca1dec482abed952ab9dcc804fcc +"@uniswap/client-explore@npm:0.0.7": + version: 0.0.7 + resolution: "@uniswap/client-explore@npm:0.0.7" + checksum: a8b60f3fa0053f1da622b91f6ddb0ccebf6bf119e6605e38be6ab74655be913a69216cbdf3117cff5eb24dab8db16bb1e15e8a814282edc124db4c648aca7595 languageName: node linkType: hard @@ -15367,7 +15358,6 @@ __metadata: "@types/xml2js": 0.4.14 "@uniswap/analytics": 1.7.0 "@uniswap/analytics-events": 2.36.0 - "@uniswap/client-explore": 0.0.9 "@uniswap/default-token-list": 11.19.0 "@uniswap/eslint-config": "workspace:^" "@uniswap/governance": 1.0.2 @@ -44690,7 +44680,6 @@ __metadata: "@tamagui/react-native-media-driver": 1.108.4 "@tamagui/remove-scroll": 1.108.4 "@tamagui/theme-base": 1.108.4 - "@types/qrcode": 1.5.5 "@uniswap/eslint-config": "workspace:^" camelcase: ^6.0.0 cheerio: ^1.0.0-rc.5 @@ -45020,14 +45009,10 @@ __metadata: "@connectrpc/connect": 1.4.0 "@connectrpc/connect-query": 1.4.1 "@connectrpc/connect-web": 1.4.0 - "@ethersproject/abstract-signer": 5.7.0 "@ethersproject/address": 5.7.0 "@ethersproject/bignumber": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/properties": 5.7.0 "@ethersproject/providers": 5.7.2 "@ethersproject/units": 5.7.0 - "@ethersproject/web": 5.7.1 "@faker-js/faker": 7.6.0 "@gorhom/bottom-sheet": 4.5.1 "@graphql-codegen/cli": ^3.3.1 @@ -45036,12 +45021,7 @@ __metadata: "@graphql-codegen/typescript-operations": ^3.0.2 "@graphql-codegen/typescript-react-apollo": ^3.3.7 "@graphql-codegen/typescript-resolvers": ^3.2.1 - "@graphql-tools/graphql-file-loader": 8.0.0 - "@graphql-tools/load": 8.0.1 - "@graphql-tools/merge": 9.0.1 - "@graphql-tools/mock": 9.0.0 "@react-native-async-storage/async-storage": 1.17.10 - "@react-native-community/netinfo": 9.3.0 "@reduxjs/toolkit": 1.9.3 "@tanstack/query-async-storage-persister": 5.51.21 "@tanstack/react-query": 5.51.16 @@ -45053,7 +45033,7 @@ __metadata: "@types/chrome": 0.0.254 "@types/react-window": 1.8.2 "@uniswap/analytics-events": 2.36.0 - "@uniswap/client-explore": 0.0.9 + "@uniswap/client-explore": 0.0.7 "@uniswap/eslint-config": "workspace:^" "@uniswap/router-sdk": 1.9.2 "@uniswap/sdk-core": 5.3.0 @@ -45062,7 +45042,6 @@ __metadata: "@uniswap/v3-sdk": 3.13.0 apollo-link-rest: 0.9.0 axios: 1.6.5 - dayjs: 1.11.7 depcheck: 1.4.7 es-toolkit: 1.10.0 eslint: 8.44.0 @@ -45072,14 +45051,11 @@ __metadata: expo-web-browser: 12.8.2 fuse.js: 6.5.3 get-graphql-schema: ^2.1.2 - graphql: 16.6.0 - graphql-scalars: 1.22.4 i18next: 23.10.0 i18next-resources-for-ts: 1.5.0 i18next-resources-to-backend: ^1.2.0 idb-keyval: 6.2.1 jest: 29.7.0 - jest-extended: 4.0.1 jest-presets: "workspace:^" lodash: 4.17.21 openapi-typescript-codegen: 0.27.0 @@ -45093,7 +45069,6 @@ __metadata: react-native-gesture-handler: 2.15.0 react-native-mmkv: 2.10.1 react-native-reanimated: 3.15.0 - react-native-restart: 0.0.27 react-redux: 8.0.5 react-test-renderer: 18.2.0 react-virtualized-auto-sizer: 1.0.20 @@ -45102,7 +45077,6 @@ __metadata: statsig-react: 1.32.0 statsig-react-native: 4.11.0 typechain: 5.2.0 - typed-redux-saga: 1.5.0 typescript: 5.3.3 ui: "workspace:^" utilities: "workspace:^" @@ -46130,6 +46104,10 @@ __metadata: "@ethersproject/providers": 5.7.2 "@faker-js/faker": 7.6.0 "@gorhom/bottom-sheet": 4.5.1 + "@graphql-tools/graphql-file-loader": 8.0.0 + "@graphql-tools/load": 8.0.1 + "@graphql-tools/merge": 9.0.1 + "@graphql-tools/mock": 9.0.0 "@react-native-community/netinfo": 9.3.0 "@react-native-firebase/app-check": 18.4.0 "@react-navigation/core": 6.2.2 @@ -46150,6 +46128,7 @@ __metadata: "@uniswap/uniswapx-sdk": ^2.1.0-beta.8 "@uniswap/universal-router-sdk": 2.2.0 "@uniswap/v3-sdk": 3.13.0 + apollo-link-rest: 0.9.0 apollo3-cache-persist: 0.14.1 axios: 1.6.5 dayjs: 1.11.7 @@ -46159,6 +46138,7 @@ __metadata: expo-web-browser: 12.8.2 fuse.js: 6.5.3 graphql: 16.6.0 + graphql-scalars: 1.22.4 i18next: 23.10.0 jest: 29.7.0 jest-extended: 4.0.1