From e2030c5af4ab862081624d7c44eae8270115e8ca Mon Sep 17 00:00:00 2001 From: Uniswap Labs Service Account Date: Wed, 11 Sep 2024 18:05:31 +0000 Subject: [PATCH] ci(release): publish latest release --- ...-screen-capture-npm-5.8.1-78e5827fdf.patch | 11 + CODEOWNERS | 1 + RELEASE | 54 +- VERSION | 2 +- apps/extension/package.json | 1 + 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 | 3 +- .../AccountSwitcherScreen.test.tsx.snap | 12 +- .../src/app/features/dapp/hooks.test.ts | 3 +- .../src/app/features/dapp/utils.test.ts | 10 +- .../dappRequests/DappRequestContent.tsx | 2 +- .../dappRequests/DappRequestQueueContext.tsx | 4 +- .../requestContent/EthSend/EthSend.tsx | 2 +- .../EthSend/Swap/SwapDisplay.tsx | 2 +- .../PersonalSignRequestContent.tsx | 4 +- .../SignTypedDataRequestContent.tsx | 9 +- .../requestContent/WrapContent.tsx | 4 +- .../__snapshots__/NetworkFooter.test.tsx.snap | 88 +- .../dappRequests/types/DappRequestTypes.ts | 8 +- .../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 | 23 +- .../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 | 180 +- .../send/SendFormScreen/RecipientPanel.tsx | 2 +- .../send/SendFormScreen/SendFormScreen.tsx | 3 +- .../app/features/settings/DevMenuScreen.tsx | 6 +- .../RemoveRecoveryPhraseVerify.tsx | 4 +- .../RemoveRecoveryPhraseWallets.tsx | 14 +- .../ViewRecoveryPhraseScreen.tsx | 4 +- .../app/features/settings/SettingsScreen.tsx | 29 +- .../src/app/features/swap/SwapFlowScreen.tsx | 4 +- .../navigation/SideBarNavigationProvider.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/ethereum.ts | 5 +- 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 44472 -> 0 bytes .../main/assets/fonts/Basel-Grotesk-Book.otf} | Bin .../assets/fonts/Basel-Grotesk-Medium.otf} | Bin .../src/main/assets/fonts/Basel-Medium.ttf | Bin 46472 -> 0 bytes .../src/main/java/com/uniswap/MainActivity.kt | 9 +- .../main/java/com/uniswap/MainApplication.kt | 17 +- .../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 86628 -> 0 bytes .../app/src/main/res/font/basel_book.otf | Bin 84524 -> 0 bytes .../src/main/res/font/basel_grotesk_book.otf | Bin 0 -> 273636 bytes .../main/res/font/basel_grotesk_medium.otf | Bin 0 -> 275116 bytes .../app/src/main/res/font/basel_medium.otf | Bin 83828 -> 0 bytes .../app/src/main/res/font/basel_semibold.otf | Bin 85868 -> 0 bytes .../src/main/res/font/inputmono_regular.ttf | Bin 0 -> 109088 bytes apps/mobile/android/link-assets-manifest.json | 8 +- apps/mobile/ios/Fonts/Basel-Bold.otf | Bin 86628 -> 0 bytes apps/mobile/ios/Fonts/Basel-Book.otf | Bin 84524 -> 0 bytes apps/mobile/ios/Fonts/Basel-Medium.otf | Bin 83828 -> 0 bytes apps/mobile/ios/Fonts/Basel-Regular.otf | Bin 82704 -> 0 bytes apps/mobile/ios/Fonts/Basel-Semibold.otf | Bin 85868 -> 0 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 +- .../app/MobileWalletNavigationProvider.tsx | 16 + 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 44472 -> 0 bytes .../src/assets/fonts/Basel-Grotesk-Book.otf | Bin 0 -> 273636 bytes .../src/assets/fonts/Basel-Grotesk-Medium.otf | Bin 0 -> 275116 bytes apps/mobile/src/assets/fonts/Basel-Medium.ttf | Bin 46472 -> 0 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 +- .../RemoveLastMnemonicWalletFooter.tsx | 4 +- .../DappConnectedNetworksModal.tsx | 2 +- .../ConnectedDapps/DappConnectionItem.tsx | 2 +- .../ModalWithOverlay/ScrollDownOverlay.tsx | 2 +- .../Requests/RequestModal/ClientDetails.tsx | 2 +- .../RequestModal/UwULinkErc20SendModal.tsx | 2 +- .../WalletConnectRequestModal.tsx | 5 +- .../WalletConnectRequestModalContent.tsx | 12 +- .../ScanSheet/PendingConnectionModal.tsx | 2 +- .../PendingConnectionSwitchAccountModal.tsx | 1 + .../src/components/Requests/Uwulink/utils.ts | 3 +- .../Requests/WalletConnectModals.tsx | 2 +- .../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 | 20 +- .../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 | 8 +- .../introCards/OnboardingIntroCardStack.tsx | 97 +- .../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 +- apps/mobile/src/features/appRating/saga.ts | 10 + .../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 | 73 +- .../features/fiatOnRamp/FiatOnRampContext.tsx | 21 +- .../fiatOnRamp/FiatOnRampTokenSelector.tsx | 10 + .../features/fiatOnRamp/OffRampPopover.tsx | 72 + .../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 | 45 +- .../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 | 75 +- .../screens/ExchangeTransferConnecting.tsx | 3 + .../src/screens/FiatOnRampConnecting.tsx | 39 +- apps/mobile/src/screens/FiatOnRampScreen.tsx | 198 +- .../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 | 24 +- .../Import/RestoreCloudBackupScreen.tsx | 11 +- .../SeedPhraseInputScreen.android.mock.tsx | 14 +- .../screens/Import/SeedPhraseInputScreen.tsx | 17 +- .../src/screens/Import/SelectWalletScreen.tsx | 16 +- .../src/screens/Import/WatchWalletScreen.tsx | 11 +- ...oreCloudBackupPasswordScreen.test.tsx.snap | 122 +- .../RestoreCloudBackupScreen.test.tsx.snap | 101 +- .../screens/Import/onRestoreComplete.test.ts | 50 + .../src/screens/Import/onRestoreComplete.ts | 24 + .../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 | 49 +- .../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 +- ...on.test.ts => useNavigationHeader.test.ts} | 19 +- ...BackButton.tsx => useNavigationHeader.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 | 2 +- .../announcement_modal_desktop2.png | Bin 0 -> 563107 bytes apps/web/public/nfts-sitemap.xml | 308 +- apps/web/public/pools-sitemap.xml | 3672 ++++++++++---- apps/web/public/tokens-sitemap.xml | 4502 ++++++++++++++--- .../OffchainActivityModal.test.tsx.snap | 12 +- .../MiniPortfolio/EmptyWallet.tsx | 2 +- .../MiniPortfolio/ExtensionDeeplinks.tsx | 2 +- .../Limits/LimitDetailActivityRow.tsx | 14 +- .../LimitDetailActivityRow.test.tsx.snap | 108 +- .../__snapshots__/LimitsMenu.test.tsx.snap | 257 +- .../OpenLimitOrdersButton.test.tsx.snap | 2 +- .../MiniPortfolio/Pools/cache.ts | 4 +- .../MiniPortfolio/PortfolioLogo.tsx | 12 +- .../AccountDrawer/MiniPortfolio/hooks.ts | 6 +- .../AccountDrawer/MiniPortfolio/shared.tsx | 2 +- .../components/AccountDrawer/SettingsMenu.tsx | 12 - .../AccountDrawer/SettingsToggle.tsx | 4 +- .../AccountDrawer/UniwalletModal.tsx | 9 +- .../__snapshots__/index.test.tsx.snap | 850 +--- .../components/AccountDrawer/index.test.tsx | 19 +- .../src/components/AccountDrawer/index.tsx | 2 +- .../src/components/AddressQRModal/index.tsx | 10 +- .../AddressQRModal/useAvatarColorProps.tsx | 82 - apps/web/src/components/Button/index.tsx | 67 +- .../web/src/components/Charts/ChartHeader.tsx | 148 +- 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 | 54 +- .../components/Charts/VolumeChart/utils.ts | 6 +- apps/web/src/components/Charts/types.ts | 2 + apps/web/src/components/Common/index.tsx | 8 +- .../ConnectedAccountBlocked/index.tsx | 26 +- apps/web/src/components/DoubleLogo/index.tsx | 6 +- .../FeatureFlagModal/FeatureFlagModal.tsx | 4 +- .../src/components/FeeSelector/FeeOption.tsx | 41 +- apps/web/src/components/FeeSelector/index.tsx | 35 +- apps/web/src/components/Icons/AndroidLogo.tsx | 12 + .../src/components/Logo/QueryTokenLogo.tsx | 31 +- apps/web/src/components/ModalViews/index.tsx | 68 - .../NavBar/ChainSelector/ChainSelectorRow.tsx | 4 +- .../components/NavBar/ChainSelector/index.tsx | 23 +- .../components/NavBar/CompanyMenu/Content.tsx | 1 + .../DownloadApp/GetTheAppButton.test.tsx | 19 - .../NavBar/DownloadApp/GetTheAppButton.tsx | 35 - .../NavBar/DownloadApp/Modal/Content.tsx | 38 +- .../NavBar/DownloadApp/Modal/GetStarted.tsx | 114 +- .../NavBar/DownloadApp/Modal/index.tsx | 106 +- .../DownloadApp/NewUserCTAButton.test.tsx | 29 + .../NavBar/DownloadApp/NewUserCTAButton.tsx | 55 + .../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 | 87 +- .../NavBar/SearchBar/SuggestionRow.tsx | 37 +- .../SearchBarDropdown.test.tsx.snap | 476 +- .../components/NavBar/Tabs/TabsContent.tsx | 3 +- .../NavBar/accountCTAsExperimentUtils.ts | 16 + apps/web/src/components/NavBar/index.tsx | 50 +- .../Pools/PoolDetails/ChartSection/hooks.ts | 9 +- .../Pools/PoolDetails/ChartSection/index.tsx | 24 +- .../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 | 1816 ++----- .../Pools/PoolTable/PoolTable.test.tsx | 3 +- .../components/Pools/PoolTable/PoolTable.tsx | 351 +- .../__snapshots__/PoolTable.test.tsx.snap | 2333 +++------ apps/web/src/components/Popover/index.tsx | 8 +- .../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 | 115 +- .../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.test.tsx | 3 +- .../tables/TokenDetailsPoolsTable.tsx | 6 +- .../TokenDetails/tables/TransactionsTable.tsx | 78 +- .../TokenDetailsPoolsTable.test.tsx.snap | 2053 ++------ .../Tokens/TokenTable/NetworkFilter.tsx | 205 +- .../components/Tokens/TokenTable/index.tsx | 176 +- apps/web/src/components/Tokens/loading.tsx | 4 +- apps/web/src/components/Tooltip/index.tsx | 6 +- .../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 | 42 +- .../components/addLiquidity/PoolWarning.tsx | 6 +- .../src/components/swap/PriceImpactModal.tsx | 8 +- .../web/src/components/vote/DelegateModal.tsx | 146 - apps/web/src/components/vote/ExecuteModal.tsx | 154 - .../components/vote/ProposalEmptyState.tsx | 55 - apps/web/src/components/vote/QueueModal.tsx | 154 - apps/web/src/components/vote/VoteModal.tsx | 168 - apps/web/src/constants/chains.test.ts | 3 +- apps/web/src/constants/governance.ts | 31 - apps/web/src/constants/lists.ts | 4 +- apps/web/src/constants/proposals/index.ts | 5 - .../proposals/polygon_proposal_title.ts | 1 - .../uniswap_grants_proposal_description.ts | 106 - 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 +- .../data/pools/usePoolsFromTokenAddress.ts | 17 +- .../web/src/graphql/data/pools/useTopPools.ts | 57 +- apps/web/src/graphql/data/protocolStats.ts | 13 +- apps/web/src/graphql/data/util.tsx | 36 +- 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 +- .../src/nft/components/collection/Filters.tsx | 32 +- .../collection/MarketplaceSelect.tsx | 21 +- .../nft/components/collection/TraitSelect.tsx | 16 +- .../src/nft/components/layout/Checkbox.css.ts | 14 - .../src/nft/components/layout/Checkbox.tsx | 69 - .../list/SelectMarketplacesDropdown.tsx | 15 +- .../components/profile/view/FilterSidebar.tsx | 32 +- apps/web/src/pages/AddLiquidity/index.tsx | 6 +- .../CreateProposal/ProposalActionDetail.tsx | 94 - .../CreateProposal/ProposalActionSelector.tsx | 130 - .../pages/CreateProposal/ProposalEditor.tsx | 64 - .../ProposalSubmissionModal.tsx | 56 - apps/web/src/pages/CreateProposal/index.tsx | 345 -- .../Explore/charts/ExploreChartsSection.tsx | 189 +- apps/web/src/pages/Explore/index.tsx | 173 +- .../Explore/tables/RecentTransactions.tsx | 73 +- apps/web/src/pages/Landing/index.tsx | 9 +- apps/web/src/pages/Landing/sections/Hero.tsx | 7 +- .../web/src/pages/LegacyPool/PositionPage.tsx | 10 +- apps/web/src/pages/LegacyPool/shared.tsx | 23 +- apps/web/src/pages/PoolDetails/index.test.tsx | 10 +- apps/web/src/pages/RemoveLiquidity/V3.tsx | 10 +- apps/web/src/pages/RouteDefinitions.tsx | 36 +- .../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 | 322 -- apps/web/src/pages/Vote/VotePage.tsx | 538 -- apps/web/src/pages/Vote/index.tsx | 14 - apps/web/src/pages/Vote/styled.tsx | 66 - apps/web/src/state/application/hooks.ts | 16 - apps/web/src/state/explore/index.tsx | 86 + apps/web/src/state/explore/protocolStats.ts | 90 + apps/web/src/state/explore/topPools.ts | 102 + apps/web/src/state/explore/topTokens.ts | 162 + apps/web/src/state/explore/types.ts | 21 + apps/web/src/state/governance/hooks.ts | 584 --- apps/web/src/state/index.ts | 2 +- apps/web/src/state/logs/hooks.ts | 85 - apps/web/src/state/logs/slice.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 +- package.json | 3 +- packages/README.md | 10 +- .../__snapshots__/preset.test.ts.snap | 19 + packages/eslint-config/native.js | 24 - packages/eslint-config/restrictedImports.js | 18 + packages/ui/package.json | 2 + .../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/checkbox/Checkbox.tsx | 139 + .../components/checkbox/LabeledCheckbox.tsx | 38 + packages/ui/src/components/checkbox/index.ts | 2 + .../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 | 54 - packages/ui/src/components/layout/Flex.tsx | 3 + packages/ui/src/components/radio/Radio.tsx | 179 + .../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 | 16 +- packages/ui/src/loading/Shine.tsx | 33 +- packages/ui/src/loading/Shine.web.tsx | 34 - packages/ui/src/tamagui.config.ts | 2 +- packages/ui/src/theme/animations.ts | 10 + 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 +- .../components/CurrencyLogo/NetworkLogo.tsx | 48 +- .../src/components/CurrencyLogo/TokenLogo.tsx | 2 +- .../__snapshots__/NetworkLogo.test.tsx.snap | 56 +- .../__snapshots__/SplitLogo.test.tsx.snap | 34 +- .../__snapshots__/TokenLogo.test.tsx.snap | 32 +- .../TokenSelector/SuggestedToken.tsx | 2 +- .../TokenSelector/TokenOptionItem.tsx | 16 +- .../TokenSelector/TokenSectionBaseList.tsx | 8 +- .../TokenSelector/TokenSelector.tsx | 117 +- .../TokenSelectorEmptySearchList.tsx | 18 +- .../TokenSelector/TokenSelectorList.tsx | 21 +- .../TokenSelectorSearchResultsList.tsx | 30 +- .../TokenSelector/TokenSelectorSendList.tsx | 24 +- .../TokenSelectorSwapInputList.tsx | 50 +- .../TokenSelectorSwapOutputList.tsx | 60 +- .../components/TokenSelector/filter.test.ts | 0 .../components/TokenSelector/hooks.test.ts | 32 +- .../src/components/TokenSelector/hooks.tsx | 210 +- .../src/components/TokenSelector/types.ts | 66 +- .../components/TokenSelector/utils.test.tsx | 18 + .../src/components/TokenSelector/utils.tsx | 8 + .../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 +- .../components/modals/ActionSheetModal.tsx | 17 +- .../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__/NetworkFilter.test.tsx.snap | 26 +- .../__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 +- packages/uniswap/src/constants/urls.ts | 1 + .../uniswap/src/contexts/UniswapContext.tsx | 28 +- .../src/data/apiClients/createApiClient.ts | 10 +- .../simpleHashApi/SimpleHashApiClient.ts | 32 + .../simpleHashApi/useSimpleHashNft.ts | 21 + .../apiClients/tradingApi/TradingApiClient.ts | 33 + .../tradingApi/useCheckApprovalQuery.ts | 22 + .../useTradingApiIndicativeQuoteQuery.ts | 23 + .../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 - .../graphql/uniswap-data-api/schema.graphql | 127 +- .../graphql/uniswap-data-api/web/pool.graphql | 98 +- .../web/poolTransactions.graphql | 23 + 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 + .../src/features/address/color.ts} | 20 +- .../src/features/address/types.ts | 0 .../src/features/address/utils.ts | 0 .../uniswap/src/features/dataApi/balances.ts | 70 +- .../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 +- packages/uniswap/src/features/ens/api.ts | 58 +- packages/uniswap/src/features/ens/useENS.ts | 4 +- .../src/features/fiatCurrency/constants.ts | 0 .../src/features/fiatCurrency/conversion.ts | 6 +- .../src/features/fiatCurrency/hooks.ts | 11 +- .../FiatOnRampConnectingView.native.tsx | 15 +- .../fiatOnRamp/FiatOnRampConnectingView.tsx | 15 +- .../TokenSelectorBalanceDisplay.tsx | 67 + .../fiatOnRamp/UnsupportedTokenModal.tsx | 61 + .../uniswap/src/features/fiatOnRamp/types.ts | 10 +- .../uniswap/src/features/fiatOnRamp/utils.ts | 47 +- packages/uniswap/src/features/gas/hooks.ts | 66 + .../src/features/gating/experiments.ts | 1 + packages/uniswap/src/features/gating/flags.ts | 10 +- packages/uniswap/src/features/gating/hooks.ts | 8 + .../features/language/LocalizationContext.tsx | 4 +- .../src/features/language/constants.ts | 0 .../src/features/language/formatter.ts | 67 + .../src/features/language/hooks.tsx | 4 +- .../src/features/language/localizedDayjs.ts | 4 +- .../src/features/language/saga.ts | 17 +- .../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 +- .../features/telemetry/constants/features.ts | 10 + .../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 | 105 +- .../src/features/tokens/hooks.ts | 0 .../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 +- .../src/features/transactions/selectors.ts | 39 +- .../swap/hooks/useIndicativeTrade.ts | 62 + .../transactions/swap/hooks/useTrade.ts | 18 + .../features/transactions/swap/types/trade.ts | 53 +- .../transactions/types/transactionDetails.ts | 13 +- 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 | 154 +- .../src/i18n/locales/translations/af-ZA.json | 43 +- .../src/i18n/locales/translations/ar-SA.json | 43 +- .../src/i18n/locales/translations/ca-ES.json | 43 +- .../src/i18n/locales/translations/cs-CZ.json | 43 +- .../src/i18n/locales/translations/da-DK.json | 43 +- .../src/i18n/locales/translations/de-DE.json | 43 +- .../src/i18n/locales/translations/el-GR.json | 43 +- .../src/i18n/locales/translations/es-ES.json | 43 +- .../src/i18n/locales/translations/fi-FI.json | 43 +- .../src/i18n/locales/translations/fr-FR.json | 43 +- .../src/i18n/locales/translations/he-IL.json | 43 +- .../src/i18n/locales/translations/hi-IN.json | 43 +- .../src/i18n/locales/translations/hu-HU.json | 43 +- .../src/i18n/locales/translations/id-ID.json | 43 +- .../src/i18n/locales/translations/it-IT.json | 43 +- .../src/i18n/locales/translations/ja-JP.json | 43 +- .../src/i18n/locales/translations/ko-KR.json | 45 +- .../src/i18n/locales/translations/ms-MY.json | 43 +- .../src/i18n/locales/translations/nl-NL.json | 43 +- .../src/i18n/locales/translations/no-NO.json | 43 +- .../src/i18n/locales/translations/pl-PL.json | 43 +- .../src/i18n/locales/translations/pt-BR.json | 43 +- .../src/i18n/locales/translations/pt-PT.json | 43 +- .../src/i18n/locales/translations/ro-RO.json | 43 +- .../src/i18n/locales/translations/ru-RU.json | 43 +- .../src/i18n/locales/translations/sl-SI.json | 43 +- .../src/i18n/locales/translations/sr-SP.json | 43 +- .../src/i18n/locales/translations/sv-SE.json | 43 +- .../src/i18n/locales/translations/sw-TZ.json | 43 +- .../src/i18n/locales/translations/th-TH.json | 37 +- .../src/i18n/locales/translations/tr-TR.json | 43 +- .../src/i18n/locales/translations/uk-UA.json | 43 +- .../src/i18n/locales/translations/ur-PK.json | 41 +- .../src/i18n/locales/translations/vi-VN.json | 43 +- .../src/i18n/locales/translations/zh-CN.json | 43 +- .../src/i18n/locales/translations/zh-TW.json | 43 +- .../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/uniswap/src/test/fixtures/index.ts | 1 + .../uniswap/src/test/fixtures/lib/index.ts | 2 + .../src/test/fixtures/lib/netinfo.ts | 1 + .../src/test/fixtures/lib/sdk.ts | 0 .../src/test/fixtures/transactions/swap.ts | 91 + .../src/test/fixtures/wallet/balances.ts | 4 +- .../uniswap/src/test/fixtures/wallet/index.ts | 1 + .../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/uniswap/src/test/mocks/index.ts | 1 + packages/uniswap/src/test/render.tsx | 149 +- packages/uniswap/src/test/test-utils.ts | 4 +- .../src/test/utils/array.ts | 0 packages/uniswap/src/test/utils/index.ts | 2 + .../src/test/utils/resolvers.ts | 0 .../wallet => uniswap/src/utils}/balances.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/package.json | 3 +- 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 +- .../__snapshots__/CurrencyLogo.test.tsx.snap | 34 +- .../LogoWithTxStatus.test.tsx.snap | 32 +- .../__snapshots__/index.test.tsx.snap | 4 +- .../src/components/ErrorBoundary/restart.ts | 4 +- .../components/QRCodeScanner/WalletQRCode.tsx | 12 +- .../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 +- .../src/components/TokenSelector/hooks.tsx | 165 - .../WalletPreviewCard.test.tsx | 2 +- .../WalletPreviewCard/WalletPreviewCard.tsx | 2 +- .../WalletPreviewCard.test.tsx.snap | 68 +- .../components/accounts/AddressDisplay.tsx | 11 +- .../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 +- .../components/network/NetworkFee.test.tsx | 2 +- .../src/components/network/NetworkFee.tsx | 57 +- .../__snapshots__/NetworkFee.test.tsx.snap | 153 +- .../wallet/src/components/network/hooks.ts | 4 +- .../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 +- .../src/contexts/WalletNavigationContext.tsx | 5 + .../wallet/src/features/accounts/hooks.ts | 5 +- .../wallet/src/features/activity/hooks.ts | 8 +- .../wallet/src/features/appCheck/index.ts | 6 +- .../src/features/behaviorHistory/selectors.ts | 6 + .../src/features/behaviorHistory/slice.ts | 23 + .../wallet/src/features/contracts/hooks.ts | 11 +- .../src/features/dataApi/balances.test.ts | 35 +- .../wallet/src/features/dataApi/balances.ts | 52 - .../wallet/src/features/fiatCurrency/slice.ts | 25 - .../wallet/src/features/fiatOnRamp/hooks.ts | 57 +- packages/wallet/src/features/gas/hooks.ts | 61 +- .../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 - .../wallet/src/features/language/formatter.ts | 70 - .../wallet/src/features/language/slice.ts | 31 - .../components/CopiedNotification.tsx | 3 + .../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/types.ts | 1 + .../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 | 4 +- .../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 +- .../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 | 59 +- .../TransactionDetailsModal.test.tsx | 24 +- .../DetailsModal/TransactionDetailsModal.tsx | 8 +- .../TransferTransactionDetails.tsx | 2 +- .../NftTransactionDetails.test.tsx.snap | 6 +- .../SwapTransactionDetails.test.tsx.snap | 6 +- .../TransactionDetailsModal.test.tsx.snap | 112 +- .../SummaryCards/DetailsModal/hooks.ts | 2 +- .../SummaryCards/DetailsModal/utils.ts | 2 +- .../SummaryItems/ApproveSummaryItem.tsx | 2 +- .../SummaryItems/CancelConfirmationView.tsx | 5 +- .../OnRampTransferSummaryItem.tsx | 4 +- .../SummaryItems/SwapSummaryItem.tsx | 2 +- .../SummaryItems/TransactionActionsModal.tsx | 2 +- .../SummaryItems/TransactionSummaryLayout.tsx | 17 +- .../SummaryItems/TransferTokenSummaryItem.tsx | 2 +- .../SummaryItems/WrapSummaryItem.tsx | 2 +- .../transactions/SummaryCards/utils.ts | 10 +- .../TransactionDetails/FeeOnTransferFee.tsx | 2 +- .../TransactionDetails/SwapFee.tsx | 39 +- .../TransactionDetails/TransactionDetails.tsx | 89 +- .../TransactionHistoryUpdater.test.tsx | 12 +- .../TransactionHistoryUpdater.tsx | 2 +- .../TransactionRequest/AddressFooter.tsx | 4 +- .../TransactionRequest/NetworkFeeFooter.tsx | 2 +- .../TransactionRequest/SpendingDetails.tsx | 4 +- .../transactions/contexts/SendContext.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 | 9 +- .../transactions/hooks/useSwapWarnings.tsx | 2 +- .../useSyncFiatAndTokenAmountUpdater.tsx | 2 +- .../hooks/useTokenAndFiatDisplayAmounts.tsx | 4 +- .../features/transactions/orderWatcherSaga.ts | 12 +- .../features/transactions/send/GasFeeRow.tsx | 4 +- .../transactions/send/SendAmountInput.tsx | 2 +- .../transactions/send/SendReviewDetails.tsx | 7 +- .../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 | 654 ++- .../features/transactions/swap/DecimalPad.tsx | 2 +- .../swap/GasAndWarningRows.native.tsx | 72 +- .../transactions/swap/GasAndWarningRows.tsx | 4 +- .../swap/GasAndWarningRows.web.tsx | 71 +- .../transactions/swap/GasTradeRow.tsx | 141 + .../transactions/swap/MaxSlippageRow.tsx | 49 +- .../swap/SlippageWarningContent.tsx | 23 +- .../transactions/swap/SwapDetails.tsx | 37 +- .../features/transactions/swap/SwapFlow.tsx | 15 - .../transactions/swap/SwapFormButton.tsx | 7 +- .../transactions/swap/SwapFormHeader.tsx | 6 +- .../transactions/swap/SwapFormScreen.tsx | 18 +- .../transactions/swap/SwapRateRatio.tsx | 6 +- .../transactions/swap/SwapReviewScreen.tsx | 113 +- .../transactions/swap/SwapTokenSelector.tsx | 64 +- .../swap/TransactionAmountsReview.tsx | 28 +- .../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 | 4 +- .../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 | 39 +- .../features/transactions/swap/swapSaga.ts | 57 +- .../api/hooks/useSwapTxAndGasInfo.test.ts | 91 + .../trade/api/hooks/useSwapTxAndGasInfo.ts | 91 +- .../trade/api/hooks/useTokenApprovalInfo.ts | 26 +- .../api/hooks/useTransactionRequestInfo.ts | 38 +- .../swap/trade/hooks/useAcceptedTrade.ts | 6 +- .../swap/trade/hooks/useDerivedSwapInfo.ts | 47 +- .../swap/trade/hooks/useSetTradeSlippage.ts | 4 +- .../hooks/useShowSwapNetworkNotification.ts | 38 +- .../swap/trade/hooks/useSwapCallback.ts | 2 +- .../swap/trade/hooks/useUSDTokenUpdater.ts | 2 +- .../src/features/transactions/swap/utils.ts | 60 +- .../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 - packages/wallet/src/test/fixtures/index.ts | 3 - .../wallet/src/test/fixtures/lib/index.ts | 2 - .../src/test/fixtures/wallet/accounts.ts | 2 +- .../wallet/src/test/fixtures/wallet/index.ts | 1 - .../src/test/fixtures/wallet/recipients.ts | 2 +- packages/wallet/src/test/mocks/index.ts | 1 - packages/wallet/src/test/mocks/utils.ts | 4 +- packages/wallet/src/test/render.tsx | 11 +- packages/wallet/src/test/test-utils.ts | 1 - packages/wallet/src/test/utils/index.ts | 3 - .../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 +- scripts/check-promise-version.sh | 46 + turbo.json | 25 +- yarn.lock | 61 +- 1035 files changed, 24553 insertions(+), 21017 deletions(-) create mode 100644 .yarn/patches/expo-screen-capture-npm-5.8.1-78e5827fdf.patch create mode 100644 CODEOWNERS delete mode 100644 apps/mobile/android/README.md delete mode 100644 apps/mobile/android/app/src/main/assets/fonts/Basel-Book.ttf rename apps/mobile/{ios/Basel-Book.otf => android/app/src/main/assets/fonts/Basel-Grotesk-Book.otf} (100%) rename apps/mobile/{ios/Basel-Medium.otf => android/app/src/main/assets/fonts/Basel-Grotesk-Medium.otf} (100%) delete mode 100644 apps/mobile/android/app/src/main/assets/fonts/Basel-Medium.ttf delete mode 100644 apps/mobile/android/app/src/main/res/font/basel_bold.otf delete mode 100644 apps/mobile/android/app/src/main/res/font/basel_book.otf create mode 100644 apps/mobile/android/app/src/main/res/font/basel_grotesk_book.otf create mode 100644 apps/mobile/android/app/src/main/res/font/basel_grotesk_medium.otf delete mode 100644 apps/mobile/android/app/src/main/res/font/basel_medium.otf delete mode 100644 apps/mobile/android/app/src/main/res/font/basel_semibold.otf create mode 100644 apps/mobile/android/app/src/main/res/font/inputmono_regular.ttf delete mode 100644 apps/mobile/ios/Fonts/Basel-Bold.otf delete mode 100644 apps/mobile/ios/Fonts/Basel-Book.otf delete mode 100644 apps/mobile/ios/Fonts/Basel-Medium.otf delete mode 100644 apps/mobile/ios/Fonts/Basel-Regular.otf delete mode 100644 apps/mobile/ios/Fonts/Basel-Semibold.otf create mode 100644 apps/mobile/src/app/modals/BackupWarningModal.tsx delete mode 100644 apps/mobile/src/assets/fonts/Basel-Book.ttf create mode 100644 apps/mobile/src/assets/fonts/Basel-Grotesk-Book.otf create mode 100644 apps/mobile/src/assets/fonts/Basel-Grotesk-Medium.otf delete mode 100644 apps/mobile/src/assets/fonts/Basel-Medium.ttf create mode 100644 apps/mobile/src/components/Settings/ResetBehaviorHistoryRow.tsx create mode 100644 apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap create mode 100644 apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx create mode 100644 apps/mobile/src/screens/Import/onRestoreComplete.test.ts create mode 100644 apps/mobile/src/screens/Import/onRestoreComplete.ts rename apps/mobile/src/utils/{useAddBackButton.test.ts => useNavigationHeader.test.ts} (53%) rename apps/mobile/src/utils/{useAddBackButton.tsx => useNavigationHeader.tsx} (52%) create mode 100644 apps/web/cypress/fixtures/token_projects.json create mode 100644 apps/web/cypress/fixtures/uni_token.json create mode 100644 apps/web/public/images/extension_promo/announcement_modal_desktop2.png delete mode 100644 apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx create mode 100644 apps/web/src/components/Icons/AndroidLogo.tsx delete mode 100644 apps/web/src/components/ModalViews/index.tsx delete mode 100644 apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.test.tsx delete mode 100644 apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.tsx create mode 100644 apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.test.tsx create mode 100644 apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx delete mode 100644 apps/web/src/components/NavBar/DownloadApp/__snapshots__/GetTheAppButton.test.tsx.snap create mode 100644 apps/web/src/components/NavBar/DownloadApp/__snapshots__/NewUserCTAButton.test.tsx.snap create mode 100644 apps/web/src/components/NavBar/accountCTAsExperimentUtils.ts delete mode 100644 apps/web/src/components/Toggle/index.tsx delete mode 100644 apps/web/src/components/vote/DelegateModal.tsx delete mode 100644 apps/web/src/components/vote/ExecuteModal.tsx delete mode 100644 apps/web/src/components/vote/ProposalEmptyState.tsx delete mode 100644 apps/web/src/components/vote/QueueModal.tsx delete mode 100644 apps/web/src/components/vote/VoteModal.tsx delete mode 100644 apps/web/src/constants/governance.ts delete mode 100644 apps/web/src/constants/proposals/index.ts delete mode 100644 apps/web/src/constants/proposals/polygon_proposal_title.ts delete mode 100644 apps/web/src/constants/proposals/uniswap_grants_proposal_description.ts create mode 100644 apps/web/src/hooks/useIsExplorePage.ts create mode 100644 apps/web/src/hooks/useShowSwapNetworkNotification.ts create mode 100644 apps/web/src/lib/utils/searchBar.test.ts delete mode 100644 apps/web/src/nft/components/layout/Checkbox.css.ts delete mode 100644 apps/web/src/nft/components/layout/Checkbox.tsx delete mode 100644 apps/web/src/pages/CreateProposal/ProposalActionDetail.tsx delete mode 100644 apps/web/src/pages/CreateProposal/ProposalActionSelector.tsx delete mode 100644 apps/web/src/pages/CreateProposal/ProposalEditor.tsx delete mode 100644 apps/web/src/pages/CreateProposal/ProposalSubmissionModal.tsx delete mode 100644 apps/web/src/pages/CreateProposal/index.tsx delete mode 100644 apps/web/src/pages/Vote/Landing.tsx delete mode 100644 apps/web/src/pages/Vote/VotePage.tsx delete mode 100644 apps/web/src/pages/Vote/index.tsx delete mode 100644 apps/web/src/pages/Vote/styled.tsx create mode 100644 apps/web/src/state/explore/index.tsx create mode 100644 apps/web/src/state/explore/protocolStats.ts create mode 100644 apps/web/src/state/explore/topPools.ts create mode 100644 apps/web/src/state/explore/topTokens.ts create mode 100644 apps/web/src/state/explore/types.ts delete mode 100644 apps/web/src/state/governance/hooks.ts delete mode 100644 apps/web/src/state/logs/hooks.ts create mode 100644 apps/web/src/state/migrations/15.test.ts create mode 100644 apps/web/src/state/migrations/15.ts create mode 100644 apps/web/src/state/migrations/16.test.ts create mode 100644 apps/web/src/state/migrations/16.ts create mode 100644 apps/web/src/state/migrations/17.test.ts create mode 100644 apps/web/src/state/migrations/17.ts create mode 100644 apps/web/src/state/migrations/oldTypes.ts delete mode 100644 apps/web/src/state/user/utils.ts create mode 100644 packages/ui/src/assets/icons/alert-triangle-filled.svg create mode 100644 packages/ui/src/assets/icons/app-store-logo.svg create mode 100644 packages/ui/src/assets/icons/bell-on.svg create mode 100644 packages/ui/src/assets/icons/download-alt.svg create mode 100644 packages/ui/src/assets/icons/phone-download.svg create mode 100644 packages/ui/src/assets/icons/photo-stacked.svg create mode 100644 packages/ui/src/components/QRCode/QRCode.tsx create mode 100644 packages/ui/src/components/QRCode/QRCodeDisplay.tsx delete mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/index.d.ts delete mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/index.js delete mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/src/genMatrix.js delete mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/src/index.jsx delete mode 100644 packages/ui/src/components/QRCode/custom-qr-code-generator/src/transformMatrixIntoCirclePath.js delete mode 100644 packages/ui/src/components/QRCode/index.tsx create mode 100644 packages/ui/src/components/checkbox/Checkbox.tsx create mode 100644 packages/ui/src/components/checkbox/LabeledCheckbox.tsx create mode 100644 packages/ui/src/components/checkbox/index.ts create mode 100644 packages/ui/src/components/icons/AlertTriangleFilled.tsx create mode 100644 packages/ui/src/components/icons/AppStoreLogo.tsx create mode 100644 packages/ui/src/components/icons/BellOn.tsx create mode 100644 packages/ui/src/components/icons/DownloadAlt.tsx create mode 100644 packages/ui/src/components/icons/PhoneDownload.tsx create mode 100644 packages/ui/src/components/icons/PhotoStacked.tsx delete mode 100644 packages/ui/src/components/input/CheckBox.tsx create mode 100644 packages/ui/src/components/radio/Radio.tsx create mode 100644 packages/ui/src/components/swipeablecards/SwipeableCard.web.tsx create mode 100644 packages/ui/src/components/switch/Switch.tsx create mode 100644 packages/ui/src/components/types.ts delete mode 100644 packages/ui/src/loading/Shine.web.tsx create mode 100644 packages/ui/src/utils/tamagui.ts rename packages/{wallet => uniswap}/src/components/TokenSelector/filter.test.ts (100%) rename packages/{wallet => uniswap}/src/components/TokenSelector/hooks.test.ts (96%) create mode 100644 packages/uniswap/src/components/TokenSelector/utils.test.tsx create mode 100644 packages/uniswap/src/components/modals/ScrollLock.web.tsx create mode 100644 packages/uniswap/src/components/pill/PillMultiToggle.tsx create mode 100644 packages/uniswap/src/data/apiClients/simpleHashApi/SimpleHashApiClient.ts create mode 100644 packages/uniswap/src/data/apiClients/simpleHashApi/useSimpleHashNft.ts create mode 100644 packages/uniswap/src/data/apiClients/tradingApi/useCheckApprovalQuery.ts create mode 100644 packages/uniswap/src/data/apiClients/tradingApi/useTradingApiIndicativeQuoteQuery.ts create mode 100644 packages/uniswap/src/data/apiClients/uniswapApi/useTrmScreenQuery.ts create mode 100644 packages/uniswap/src/data/apiClients/unitagsApi/useUnitagsClaimEligibilityQuery.ts delete mode 100644 packages/uniswap/src/data/connectRpc.ts delete mode 100644 packages/uniswap/src/data/rest.ts create mode 100644 packages/uniswap/src/data/rest/exploreStats.ts create mode 100644 packages/uniswap/src/data/rest/index.ts create mode 100644 packages/uniswap/src/data/rest/protocolStats.ts delete mode 100644 packages/uniswap/src/data/tradingApi/client.ts create mode 100644 packages/uniswap/src/features/address/avatar.ts rename packages/{wallet/src/components/QRCodeScanner/useQRColorProps.ts => uniswap/src/features/address/color.ts} (78%) rename packages/{wallet => uniswap}/src/features/address/types.ts (100%) rename packages/{wallet => uniswap}/src/features/address/utils.ts (100%) rename packages/{wallet => uniswap}/src/features/dataApi/searchTokens.test.ts (79%) rename packages/{wallet => uniswap}/src/features/dataApi/tokenProject.test.tsx (77%) rename packages/{wallet => uniswap}/src/features/dataApi/topTokens.test.ts (84%) rename packages/{wallet => uniswap}/src/features/dataApi/utils.test.ts (97%) rename packages/{wallet => uniswap}/src/features/fiatCurrency/constants.ts (100%) rename packages/{wallet => uniswap}/src/features/fiatCurrency/conversion.ts (95%) rename packages/{wallet => uniswap}/src/features/fiatCurrency/hooks.ts (92%) create mode 100644 packages/uniswap/src/features/fiatOnRamp/TokenSelectorBalanceDisplay.tsx create mode 100644 packages/uniswap/src/features/fiatOnRamp/UnsupportedTokenModal.tsx create mode 100644 packages/uniswap/src/features/gas/hooks.ts rename packages/{wallet => uniswap}/src/features/language/LocalizationContext.tsx (92%) rename packages/{wallet => uniswap}/src/features/language/constants.ts (100%) rename packages/{wallet => uniswap}/src/features/language/hooks.tsx (97%) rename packages/{wallet => uniswap}/src/features/language/localizedDayjs.ts (96%) rename packages/{wallet => uniswap}/src/features/language/saga.ts (88%) create mode 100644 packages/uniswap/src/features/notifications/constants.ts create mode 100644 packages/uniswap/src/features/providers/FlashbotsRpcProvider.test.ts create mode 100644 packages/uniswap/src/features/providers/FlashbotsRpcProvider.ts create mode 100644 packages/uniswap/src/features/search/utils.ts rename packages/{wallet => uniswap}/src/features/tokens/hooks.ts (100%) create mode 100644 packages/uniswap/src/features/tokens/slice/types.ts rename packages/{wallet => uniswap}/src/features/transactions/selectors.ts (80%) create mode 100644 packages/uniswap/src/features/transactions/swap/hooks/useIndicativeTrade.ts create mode 100644 packages/uniswap/src/features/trm/hooks.ts delete mode 100644 packages/uniswap/src/features/unitags/api.ts rename packages/{wallet => uniswap}/src/test/fixtures/gql/activities/index.ts (89%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/activities/nfts.ts (94%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/activities/swap.ts (93%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/activities/tokens.ts (92%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/amounts.ts (100%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/assets/constants.ts (100%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/assets/index.ts (100%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/assets/nfts.ts (88%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/assets/tokens.ts (96%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/history.ts (91%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/index.ts (100%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/misc.ts (100%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/portfolio.ts (77%) rename packages/{wallet => uniswap}/src/test/fixtures/gql/transactions.ts (100%) rename packages/{wallet => uniswap}/src/test/fixtures/lib/netinfo.ts (93%) rename packages/{wallet => uniswap}/src/test/fixtures/lib/sdk.ts (100%) create mode 100644 packages/uniswap/src/test/fixtures/transactions/swap.ts rename packages/{wallet => uniswap}/src/test/fixtures/wallet/balances.ts (93%) rename packages/{wallet => uniswap}/src/test/mocks/gql/index.ts (100%) rename packages/{wallet => uniswap}/src/test/mocks/gql/mocks.ts (98%) rename packages/{wallet => uniswap}/src/test/mocks/gql/provider.tsx (86%) rename packages/{wallet => uniswap}/src/test/mocks/gql/resolvers.ts (87%) create mode 100644 packages/uniswap/src/test/mocks/index.ts rename packages/{wallet => uniswap}/src/test/utils/array.ts (100%) rename packages/{wallet => uniswap}/src/test/utils/resolvers.ts (100%) rename packages/{wallet/src/test/utils/wallet => uniswap/src/utils}/balances.ts (87%) delete mode 100644 packages/wallet/src/components/TokenSelector/hooks.tsx delete mode 100644 packages/wallet/src/components/buttons/Switch.tsx delete mode 100644 packages/wallet/src/features/dataApi/balances.ts delete mode 100644 packages/wallet/src/features/fiatCurrency/slice.ts delete mode 100644 packages/wallet/src/features/images/hooks.ts delete mode 100644 packages/wallet/src/features/language/formatter.ts delete mode 100644 packages/wallet/src/features/language/slice.ts create mode 100644 packages/wallet/src/features/transactions/swap/GasTradeRow.tsx create mode 100644 packages/wallet/src/features/transactions/swap/modals/settings/configs/Slippage.web.tsx create mode 100644 packages/wallet/src/features/transactions/swap/trade/api/hooks/useSwapTxAndGasInfo.test.ts delete mode 100644 packages/wallet/src/test/fixtures/lib/index.ts delete mode 100644 packages/wallet/src/test/utils/index.ts delete mode 100644 packages/wallet/src/test/utils/wallet/index.ts create mode 100644 packages/wallet/src/utils/layout.ts create mode 100755 scripts/check-promise-version.sh diff --git a/.yarn/patches/expo-screen-capture-npm-5.8.1-78e5827fdf.patch b/.yarn/patches/expo-screen-capture-npm-5.8.1-78e5827fdf.patch new file mode 100644 index 00000000000..cf90925ef03 --- /dev/null +++ b/.yarn/patches/expo-screen-capture-npm-5.8.1-78e5827fdf.patch @@ -0,0 +1,11 @@ +diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml +index 42d06e3881a66499d627e549f7db36e1cba43c38..3879b1c3fafeb2455f28cb58c7629eb85846fc70 100644 +--- a/android/src/main/AndroidManifest.xml ++++ b/android/src/main/AndroidManifest.xml +@@ -1,5 +1,5 @@ + + + +- ++ + diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000000..f70773659eb --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @uniswap/web-admins diff --git a/RELEASE b/RELEASE index 30cbf44bcdf..5be499ed5c7 100644 --- a/RELEASE +++ b/RELEASE @@ -1,7 +1,49 @@ -We are back with some new new updates! Here’s the latest: +IPFS hash of the deployment: +- CIDv0: `QmUT3C4vpZnekvr6tpufvmko2T9KRR8VfDvMB3ddJhEC8s` +- CIDv1: `bafybeic2zedotxnbrjgoh3kki7g4oatccgiqwag5xsmcuk33tijqgv2zpq` + +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://bafybeic2zedotxnbrjgoh3kki7g4oatccgiqwag5xsmcuk33tijqgv2zpq.ipfs.dweb.link/ +- https://bafybeic2zedotxnbrjgoh3kki7g4oatccgiqwag5xsmcuk33tijqgv2zpq.ipfs.cf-ipfs.com/ +- [ipfs://QmUT3C4vpZnekvr6tpufvmko2T9KRR8VfDvMB3ddJhEC8s/](ipfs://QmUT3C4vpZnekvr6tpufvmko2T9KRR8VfDvMB3ddJhEC8s/) + +## 5.46.0 (2024-09-11) + + +### Features + +* **web:** [multi-explore] disable not hide TX tab on all networks (#11527) 54773e6 +* **web:** add info popups to search results (#11588) bc09156 +* **web:** memoize most of explore - staging (#11748) fae44d0 +* **web:** update the columns in the explore pools tab (#11492) 7fc1c8d +* **web:** use Spore radio button for LP fee selector (#11284) 33c77c8 + + +### Bug Fixes + +* **web:** 09 09 fix web remove vote pages staging (#11700) 60b48d3 +* **web:** Add unsupported style to Explore Table network options - staging (#11708) 1fd4a47 +* **web:** connected account button toggles modal (#11343) 8834682 +* **web:** fix missing charts on PDP (#11312) 3dae6a8 +* **web:** fix uniswap wallet connect QR code (#11507) cf360ff +* **web:** hide scroll more on midHeight (#11509) d121ce1 +* **web:** landing page should also have multichainUX (#11484) 49e7ad9 +* **web:** Show all tabs when multichain_explore is disabled (#11532) 1e5febc +* **web:** show share menu over chart (#11513) 20035a7 +* **web:** update chart header z index (#11608) c0adb87 +* **web:** use onchain instead of swapping (#11779) e0020fd +* **web): Revert "feat(web:** [multi-explore] disable not hide TX tab on all net… (#11775) 5a40308 + + +### Continuous Integration + +* **web:** update sitemaps 0fdba92 + -- Faster wallet imports when importing a recovery phrase! -- Faster loading of your NFTs on the NFT Tab -- Added toasts when hiding and unhiding NFTs -- Better loading states in the transaction details sheets -- Various bug fixes and performance improvements \ No newline at end of file diff --git a/VERSION b/VERSION index fefab4e35ed..1e8233dc2df 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -extension/1.4.1 \ No newline at end of file +web/5.46.0 \ No newline at end of file diff --git a/apps/extension/package.json b/apps/extension/package.json index 9993a19b51e..73c7a8b4665 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -14,6 +14,7 @@ "@tamagui/core": "1.108.4", "@types/uuid": "9.0.1", "@uniswap/analytics-events": "2.36.0", + "@uniswap/uniswapx-sdk": "^2.1.0-beta.8", "@uniswap/universal-router-sdk": "2.2.0", "@uniswap/v3-sdk": "3.13.0", "dotenv-webpack": "8.0.1", diff --git a/apps/extension/src/app/OnboardingApp.tsx b/apps/extension/src/app/OnboardingApp.tsx index 6cec729150a..00e698b188b 100644 --- a/apps/extension/src/app/OnboardingApp.tsx +++ b/apps/extension/src/app/OnboardingApp.tsx @@ -38,6 +38,7 @@ 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' @@ -45,9 +46,7 @@ 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 { LocalizationContextProvider } from 'wallet/src/features/language/LocalizationContext' -import { WalletUniswapProvider } from 'wallet/src/features/transactions/contexts/WalletUniswapContext' -import { SharedProvider } from 'wallet/src/provider' +import { SharedWalletProvider } from 'wallet/src/provider' const supportsSidePanel = checksIfSupportsSidePanel() @@ -174,20 +173,18 @@ export default function OnboardingApp(): JSX.Element { - + - - - - + + - + diff --git a/apps/extension/src/app/PopupApp.tsx b/apps/extension/src/app/PopupApp.tsx index e8d9b541be9..a8019aab03d 100644 --- a/apps/extension/src/app/PopupApp.tsx +++ b/apps/extension/src/app/PopupApp.tsx @@ -18,6 +18,8 @@ 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' @@ -25,10 +27,7 @@ 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 { 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' +import { SharedWalletProvider } from 'wallet/src/provider' getLocalUserId() .then((userId) => { @@ -128,22 +127,20 @@ export default function PopupApp(): JSX.Element { - + - - - - - - + + + + - + diff --git a/apps/extension/src/app/SidebarApp.tsx b/apps/extension/src/app/SidebarApp.tsx index 814bdea941c..832a636f750 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, ScrollRestoration } from 'react-router-dom' +import { RouterProvider } from 'react-router-dom' import { PersistGate } from 'redux-persist/integration/react' import { ExtensionStatsigProvider } from 'src/app/StatsigProvider' import { GraphqlProvider } from 'src/app/apollo' @@ -38,6 +38,8 @@ 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' @@ -48,10 +50,7 @@ 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 { 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' +import { SharedWalletProvider } from 'wallet/src/provider' getLocalUserId() .then((userId) => { @@ -205,7 +204,6 @@ function SidebarWrapper(): JSX.Element { return ( <> - ) @@ -242,23 +240,21 @@ 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 7ba406b366a..0213f88aaa9 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 2f5f28ca040..f817ec2fee5 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 ac94f03c820..18e25f007b8 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="buttonLabel4" + variant="buttonLabel3" 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 fd8190f76e8..de0b281bd06 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 dd38f50df86..9904e1b2a71 100644 --- a/apps/extension/src/app/features/accounts/AccountItem.tsx +++ b/apps/extension/src/app/features/accounts/AccountItem.tsx @@ -7,6 +7,7 @@ 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' @@ -14,7 +15,6 @@ 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 215dd4975ef..8f0e5488ac1 100644 --- a/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx +++ b/apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx @@ -190,6 +190,7 @@ export function AccountSwitcherScreen(): JSX.Element { address={activeAddress} captionVariant="body3" direction="column" + displayNameTextAlign="center" gapBetweenLines="$spacing8" horizontalGap="$spacing8" showViewOnlyBadge={isViewOnly} @@ -246,7 +247,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 174d0b56392..990425cb41b 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 @@ -125,7 +125,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` class="_display-flex _alignItems-center _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-center _gap-1481558307" > @@ -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 @@ -359,7 +359,7 @@ exports[`AccountSwitcherScreen renders correctly 1`] = ` class="_display-flex _alignItems-center _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-center _gap-1481558307" > @@ -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 1fd4394ec3c..c1edbe5114c 100644 --- a/apps/extension/src/app/features/dapp/hooks.test.ts +++ b/apps/extension/src/app/features/dapp/hooks.test.ts @@ -6,8 +6,9 @@ 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, SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_3 } from 'wallet/src/test/fixtures' +import { ACCOUNT, ACCOUNT2, ACCOUNT3 } 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 35d4e569039..96bc38eb8b0 100644 --- a/apps/extension/src/app/features/dapp/utils.test.ts +++ b/apps/extension/src/app/features/dapp/utils.test.ts @@ -3,15 +3,9 @@ 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, - SAMPLE_SEED_ADDRESS_1, - SAMPLE_SEED_ADDRESS_2, - SAMPLE_SEED_ADDRESS_3, -} from 'wallet/src/test/fixtures' +import { ACCOUNT, ACCOUNT2, ACCOUNT3 } from 'wallet/src/test/fixtures' describe('isConnectedAccount', () => { it('returns true if the account is connected', () => { diff --git a/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx b/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx index e1b83a4c126..9b585185c9d 100644 --- a/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/DappRequestContent.tsx @@ -6,6 +6,7 @@ import { NetworksFooter } from 'src/app/features/dappRequests/requestContent/Net import { DappRequestStoreItem } from 'src/app/features/dappRequests/slice' import { Anchor, AnimatePresence, Button, Flex, Text, UniversalImage, UniversalImageResizeMode, styled } from 'ui/src' import { iconSizes } from 'ui/src/theme' +import { useUSDValue } from 'uniswap/src/features/gas/hooks' import { GasFeeResult } from 'uniswap/src/features/gas/types' import { useOnChainNativeCurrencyBalance } from 'uniswap/src/features/portfolio/api' import { TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' @@ -13,7 +14,6 @@ import { UniverseChainId, WalletChainId } from 'uniswap/src/types/chains' import { formatDappURL } from 'utilities/src/format/urls' import { logger } from 'utilities/src/logger/logger' import { DappIconPlaceholder } from 'wallet/src/components/WalletConnect/DappIconPlaceholder' -import { useUSDValue } from 'wallet/src/features/gas/hooks' import { AddressFooter } from 'wallet/src/features/transactions/TransactionRequest/AddressFooter' import { NetworkFeeFooter } from 'wallet/src/features/transactions/TransactionRequest/NetworkFeeFooter' import { hasSufficientFundsIncludingGas } from 'wallet/src/features/transactions/utils' diff --git a/apps/extension/src/app/features/dappRequests/DappRequestQueueContext.tsx b/apps/extension/src/app/features/dappRequests/DappRequestQueueContext.tsx index bf5adb0674a..e4a0ed5c100 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: requestToConfirm.senderTabInfo.url, + dappUrl: extractBaseUrl(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: requestToCancel.senderTabInfo.url, + dappUrl: extractBaseUrl(requestToCancel.senderTabInfo.url), chainId: lastChainId, activeConnectedAddress, connectedAddresses, diff --git a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx index 85ad5e1dc01..f9534bf8d15 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/EthSend/EthSend.tsx @@ -8,11 +8,11 @@ import { SwapRequestContent } from 'src/app/features/dappRequests/requestContent import { DappRequestStoreItemForEthSendTxn } from 'src/app/features/dappRequests/slice' import { isApproveRequest, isLPRequest, isSwapRequest } from 'src/app/features/dappRequests/types/DappRequestTypes' import { PollingInterval } from 'uniswap/src/constants/misc' +import { useTransactionGasFee } from 'uniswap/src/features/gas/hooks' import { GasFeeResult, GasSpeed } from 'uniswap/src/features/gas/types' import { TransactionTypeInfo } from 'uniswap/src/features/transactions/types/transactionDetails' import { logger } from 'utilities/src/logger/logger' import { formatExternalTxnWithGasEstimates } from 'wallet/src/features/gas/formatExternalTxnWithGasEstimates' -import { useTransactionGasFee } from 'wallet/src/features/gas/hooks' interface EthSendRequestContentProps { request: DappRequestStoreItemForEthSendTxn 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 3bf51d909e6..21b448b565f 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 992c91821cd..14013600245 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 { AlertTriangle, Code, StickyNoteTextSquare } from 'ui/src/components/icons' +import { AlertTriangleFilled, 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/SignTypeData/SignTypedDataRequestContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx index 1f6e481081a..cc5d7585df0 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx +++ b/apps/extension/src/app/features/dappRequests/requestContent/SignTypeData/SignTypedDataRequestContent.tsx @@ -49,7 +49,11 @@ export function SignTypedDataRequestContent({ dappRequest }: SignTypedDataReques ) } - if (isUniswapXSwapRequest(dappRequest)) { + const { name, version, chainId: domainChainId, verifyingContract, salt } = parsedTypedData?.domain || {} + const chainId = toSupportedChainId(domainChainId) + + // this check needs to happen before isPermit2 since uniswapX requests are Permit2 requests + if (isUniswapXSwapRequest(dappRequest, chainId || undefined)) { return } @@ -57,10 +61,7 @@ export function SignTypedDataRequestContent({ dappRequest }: SignTypedDataReques return } - const { name, version, chainId: domainChainId, verifyingContract, salt } = parsedTypedData?.domain || {} - // todo(EXT-883): remove this when we start rejecting unsupported chain signTypedData requests - const chainId = toSupportedChainId(domainChainId) const renderMessageContent = ( message: EIP712Message | EIP712Message[keyof EIP712Message], i = 1, diff --git a/apps/extension/src/app/features/dappRequests/requestContent/WrapContent.tsx b/apps/extension/src/app/features/dappRequests/requestContent/WrapContent.tsx index 96088ec04fa..50e083a6aea 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 { useTransactionGasFee, useUSDValue } from 'uniswap/src/features/gas/hooks' +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/dappRequests/requestContent/__snapshots__/NetworkFooter.test.tsx.snap b/apps/extension/src/app/features/dappRequests/requestContent/__snapshots__/NetworkFooter.test.tsx.snap index d39af9b3c6b..8947f280de6 100644 --- a/apps/extension/src/app/features/dappRequests/requestContent/__snapshots__/NetworkFooter.test.tsx.snap +++ b/apps/extension/src/app/features/dappRequests/requestContent/__snapshots__/NetworkFooter.test.tsx.snap @@ -34,12 +34,12 @@ exports[`NetworksFooter renders without error 1`] = ` class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-column _borderTopColor-568007293 _borderRightColor-568007293 _borderBottomColor-568007293 _borderLeftColor-568007293 _borderTopLeftRadius-8px _borderTopRightRadius-8px _borderBottomRightRadius-8px _borderBottomLeftRadius-8px _borderTopWidth-2px _borderRightWidth-2px _borderBottomWidth-2px _borderLeftWidth-2px _ml--8px _borderBottomStyle-solid _borderTopStyle-solid _borderLeftStyle-solid _borderRightStyle-solid" >
{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 6c4b943416c..4aa18b97021 100644 --- a/apps/extension/src/app/features/home/PortfolioHeader.tsx +++ b/apps/extension/src/app/features/home/PortfolioHeader.tsx @@ -13,6 +13,7 @@ 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' @@ -23,7 +24,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 { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' +import { 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 7a114f2cacb..dce2b2bc9b9 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 6342b8974df..810a6fcdc77 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 { AlertTriangle, Lock } from 'ui/src/components/icons' +import { AlertTriangleFilled, 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 9e9d151ef60..9db21a56879 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 1049a33acc4..2d33e4e04bb 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 'wallet/src/features/language/slice' +import { syncAppWithDeviceLanguage } from 'uniswap/src/features/settings/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 9eee86e24b8..119c71b38f8 100644 --- a/apps/extension/src/app/features/onboarding/Password.tsx +++ b/apps/extension/src/app/features/onboarding/Password.tsx @@ -41,10 +41,14 @@ export function Password({ } = usePasswordForm() const onSubmit = useCallback(async () => { + if (!enableNext) { + return + } + if (checkSubmit()) { await onComplete(password) } - }, [onComplete, password, checkSubmit]) + }, [onComplete, password, checkSubmit, enableNext]) const handleBack = useCallback(() => { // reset the pending mnemonic when going back from password screen @@ -88,6 +92,7 @@ export function Password({ value={password} onBlur={onPasswordBlur} onChangeText={onChangePassword} + onSubmitEditing={onSubmit} /> : undefined } nextButtonEnabled={true} - nextButtonText="Finish" - subtitle="This nickname is only visible to you" - title="Give your wallet a name" + nextButtonText={t('onboarding.name.wallet.button.text')} + subtitle={t('onboarding.name.wallet.subtitle')} + title={t('onboarding.name.wallet.title')} 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 dc1a48af1a8..a1f2c8ead6e 100644 --- a/apps/extension/src/app/features/onboarding/create/ViewMnemonic.tsx +++ b/apps/extension/src/app/features/onboarding/create/ViewMnemonic.tsx @@ -3,10 +3,11 @@ 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 { AlertTriangle, EyeOff, FileListLock, Key, PencilDetailed } from 'ui/src/components/icons' +import { Circle, Flex, IconProps, LabeledCheckbox, Square, Text } from 'ui/src' +import { AlertTriangleFilled, 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' @@ -42,7 +43,16 @@ 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 @@ -53,10 +63,7 @@ export function ViewMnemonic(): JSX.Element { } } - // 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 + useSubmitOnEnter(onSubmit) return ( ) : ( - + )} } @@ -126,7 +133,7 @@ export function ViewMnemonic(): JSX.Element { - {t('onboarding.backup.view.disclaimer')}} onCheckPressed={(currentValue: boolean): void => setDisclaimerChecked(!currentValue)} diff --git a/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx b/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx index d24c3e56805..0c56db9dcab 100644 --- a/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx +++ b/apps/extension/src/app/features/onboarding/import/ImportMnemonic.tsx @@ -123,36 +123,15 @@ 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 = debouncedMnemonic.join(' ').toLowerCase() + const mnemonicString = mnemonic.join(' ').toLowerCase() if (!mnemonicString.trim()) { return { error: undefined, invalidWordCount: undefined } } return validateMnemonic(mnemonicString) - }, [debouncedMnemonic]) + }, [mnemonic]) const errorMessageToDisplay = useMemo(() => { // If all cells are filled, but there is an error, display the invalid phrase error @@ -170,6 +149,29 @@ 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 ( - {errorMessageToDisplay ?? DUMMY_TEXT} {/* To prevent layout shift */} + {debouncedErrorMessageToDisplay ?? DUMMY_TEXT} {/* To prevent layout shift */} @@ -239,6 +241,7 @@ export function ImportMnemonic(): JSX.Element { handleKeyPress={handleKeyPress} index={index} word={word} + onSubmitEditing={onSubmit} /> ), @@ -276,8 +279,12 @@ 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 }, ref): JSX.Element { +>(function _RecoveryPhraseWord( + { word, index, handleBlur, handleChange, handleKeyPress, onSubmitEditing }, + ref, +): JSX.Element { const debouncedWord = useDebounce(word, 500) const showError = isValidMnemonicWord(debouncedWord) @@ -312,6 +319,7 @@ 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 842ccbf3c07..423ba1d40b5 100644 --- a/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx +++ b/apps/extension/src/app/features/onboarding/import/SelectWallets.tsx @@ -4,6 +4,7 @@ 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' @@ -24,7 +25,7 @@ export function SelectWallets({ flow }: { flow: ExtensionOnboardingFlow }): JSX. const [buttonClicked, setButtonClicked] = useState(false) const { goToNextStep, goToPreviousStep } = useOnboardingSteps() - const { getGeneratedAddresses, generateAccountsAndImportAddresses } = useOnboardingContext() + const { generateAccountsAndImportAddresses, getGeneratedAddresses } = useOnboardingContext() const { data: generatedAddresses } = useAsyncData(getGeneratedAddresses) @@ -32,7 +33,13 @@ 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) @@ -44,10 +51,12 @@ export function SelectWallets({ flow }: { flow: ExtensionOnboardingFlow }): JSX. goToNextStep() setButtonClicked(false) - }, [generateAccountsAndImportAddresses, selectedAddresses, goToNextStep, shouldAutoConnect]) + }, [generateAccountsAndImportAddresses, selectedAddresses, goToNextStep, shouldAutoConnect, enableSubmit]) const title = showError ? t('onboarding.selectWallets.title.error') : t('onboarding.selectWallets.title.default') + useSubmitOnEnter(showError ? refetch : onSubmit) + return ( } - nextButtonEnabled={showError || (selectedAddresses.length > 0 && !isLoading)} + nextButtonEnabled={enableSubmit} nextButtonIcon={buttonClicked ? : undefined} nextButtonText={ showError @@ -82,13 +91,13 @@ export function SelectWallets({ flow }: { flow: ExtensionOnboardingFlow }): JSX. ) : ( importableAccounts?.map((account) => { - const { ownerAddress, balance } = account + const { address, 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 a2d707b5d03..8a7bd3e8587 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 { AlertTriangle } from 'ui/src/components/icons' +import { AlertTriangleFilled } 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 0e64b2b9976..6b185100c61 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 7e0c93ddb42..c7c618c798a 100644 --- a/apps/extension/src/app/features/onboarding/utils.ts +++ b/apps/extension/src/app/features/onboarding/utils.ts @@ -1,2 +1,22 @@ +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 f6c9df13cc4..8b5055a4737 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 6fb7dc7a372..38dcde7e66c 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 9206f0af929..6623b437250 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 9e6d19542cc..b6e80310332 100644 --- a/apps/extension/src/app/features/send/SendFormScreen/SendFormScreen.tsx +++ b/apps/extension/src/app/features/send/SendFormScreen/SendFormScreen.tsx @@ -6,6 +6,7 @@ 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' @@ -17,7 +18,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 { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { 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 d7e8ac89523..37231f99aac 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/RemoveRecoveryPhraseVerify.tsx b/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseVerify.tsx index 27684050a46..b27b7af6d87 100644 --- a/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseVerify.tsx +++ b/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseVerify.tsx @@ -6,7 +6,7 @@ import { ScreenHeader } from 'src/app/components/layout/ScreenHeader' import { removeAllDappConnectionsFromExtension } from 'src/app/features/dapp/actions' import { SettingsRecoveryPhrase } from 'src/app/features/settings/SettingsRecoveryPhraseScreen/SettingsRecoveryPhrase' import { focusOrCreateOnboardingTab } from 'src/app/navigation/utils' -import { CheckBox, Flex, Text, inputStyles } from 'ui/src' +import { Flex, LabeledCheckbox, Text, inputStyles } from 'ui/src' import { TrashFilled } from 'ui/src/components/icons' import { WalletEventName } from 'uniswap/src/features/telemetry/constants' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' @@ -119,7 +119,7 @@ export function RemoveRecoveryPhraseVerify(): JSX.Element { - diff --git a/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseWallets.tsx b/apps/extension/src/app/features/settings/SettingsRecoveryPhraseScreen/RemoveRecoveryPhraseWallets.tsx index c6b25f871ba..44489fa5c46 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 { AlertTriangle } from 'ui/src/components/icons' +import { AlertTriangleFilled } 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,7 +101,13 @@ 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 10a827d9c7c..b3963b47dcc 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 { AlertTriangle, Eye, Key, Laptop } from 'ui/src/components/icons' +import { AlertTriangleFilled, 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 b9d43138a68..89e0b00e1ae 100644 --- a/apps/extension/src/app/features/settings/SettingsScreen.tsx +++ b/apps/extension/src/app/features/settings/SettingsScreen.tsx @@ -14,6 +14,7 @@ import { GeneratedIcon, ScrollView, Separator, + Switch, Text, TouchableArea, useSporeColors, @@ -33,18 +34,16 @@ 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 { setHideSmallBalances, setHideSpamTokens } from 'uniswap/src/features/settings/slice' +import { setCurrentFiatCurrency, 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 @@ -116,15 +115,15 @@ export function SettingsScreen(): JSX.Element { /> void + checked: boolean + onCheckedChange: (checked: 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 8e49713f411..45e983252c9 100644 --- a/apps/extension/src/app/features/swap/SwapFlowScreen.tsx +++ b/apps/extension/src/app/features/swap/SwapFlowScreen.tsx @@ -1,7 +1,6 @@ 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' @@ -10,8 +9,7 @@ import { useActiveAccountWithThrow } from 'wallet/src/features/wallet/hooks' export function SwapFlowScreen(): JSX.Element { const { navigateBack, locationState } = useExtensionNavigation() const account = useActiveAccountWithThrow() - const valueModifiers = usePortfolioValueModifiers(account.address) - const inputCurrencyId = useHighestBalanceNativeCurrencyId(account.address, valueModifiers) + const inputCurrencyId = useHighestBalanceNativeCurrencyId(account.address) const initialState = prepareSwapFormState({ inputCurrencyId }) const swapPrefilledState = useSwapPrefilledState(locationState?.initialTransactionState ?? initialState) diff --git a/apps/extension/src/app/navigation/SideBarNavigationProvider.tsx b/apps/extension/src/app/navigation/SideBarNavigationProvider.tsx index ffca19800e7..6d8943d4a76 100644 --- a/apps/extension/src/app/navigation/SideBarNavigationProvider.tsx +++ b/apps/extension/src/app/navigation/SideBarNavigationProvider.tsx @@ -39,6 +39,9 @@ export function SideBarNavigationProvider({ children }: PropsWithChildren): JSX. // no-op until we have proper NFT collection }, []) const navigateToFiatOnRamp = useNavigateToFiatOnRamp() + const navigateToExternalProfile = useCallback(() => { + // no-op until we have an external profile screen on extension + }, []) return ( { return ( @@ -122,8 +127,11 @@ export function WebNavigation(): JSX.Element { return ( - - {childrenMemo} + + + {shouldRestoreScroll && } + {childrenMemo} + ) } diff --git a/apps/extension/src/app/saga.ts b/apps/extension/src/app/saga.ts index 567ac497b60..78e34786e9d 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 47e9f920ce3..db4c5b27284 100644 --- a/apps/extension/src/background/backgroundDappRequests.ts +++ b/apps/extension/src/background/backgroundDappRequests.ts @@ -30,7 +30,6 @@ 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' @@ -205,7 +204,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, RPCType.Public) : undefined + const provider = updatedChainId ? walletContextValue.providers.getProvider(updatedChainId) : undefined const response = changeChain({ provider, dappUrl, diff --git a/apps/extension/src/contentScript/ethereum.ts b/apps/extension/src/contentScript/ethereum.ts index 7864cb1953f..6c57f444052 100644 --- a/apps/extension/src/contentScript/ethereum.ts +++ b/apps/extension/src/contentScript/ethereum.ts @@ -48,9 +48,12 @@ addWindowMessageListener(isValidContentScriptToProxyEmission, (message) => { logger.debug('ethereum.ts', `Emitting ${message.emitKey} via WindowEthereumProxy`, message.emitValue) uniswapProvider.emit(message.emitKey, message.emitValue) }) + +const providerUuid = uuid() + function announceProvider(): void { const info: EIP6963ProviderInfo = { - uuid: uuid(), + uuid: providerUuid, name: UNISWAP_NAME, icon: UNISWAP_LOGO, rdns: UNISWAP_RDNS, diff --git a/apps/extension/src/contentScript/injected.ts b/apps/extension/src/contentScript/injected.ts index 84bf0e7816f..34fb02c62a1 100644 --- a/apps/extension/src/contentScript/injected.ts +++ b/apps/extension/src/contentScript/injected.ts @@ -31,7 +31,6 @@ 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' @@ -204,7 +203,7 @@ async function init(): Promise { if (chainId && !provider) { const chainIdNum = parseInt(chainId, 16) - const defaultProvider = walletContextValue.providers.getProvider(chainIdNum, RPCType.Public) + const defaultProvider = walletContextValue.providers.getProvider(chainIdNum) setProvider(defaultProvider) } } catch (error) { diff --git a/apps/extension/src/manifest.json b/apps/extension/src/manifest.json index 8be99fbcfa9..0532e617ce2 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.4.1", + "version": "1.6.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 8c6b7c93b73..c187d8a8245 100644 --- a/apps/extension/src/store/migrations.test.ts +++ b/apps/extension/src/store/migrations.test.ts @@ -6,6 +6,10 @@ import { initialSchema, v0Schema, v10Schema, + v11Schema, + v12Schema, + v13Schema, + v14Schema, v1Schema, v2Schema, v3Schema, @@ -17,6 +21,7 @@ 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' @@ -26,15 +31,17 @@ 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' @@ -78,8 +85,7 @@ describe('Redux state migrations', () => { dapp: {}, ens: { ensForAddress: {} }, favorites: initialFavoritesState, - fiatCurrencySettings: initialFiatCurrencyState, - languageSettings: initialLanguageState, + fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, notifications: initialNotificationsState, behaviorHistory: initialBehaviorHistoryState, providers: { isInitialized: false }, @@ -235,7 +241,23 @@ describe('Redux state migrations', () => { testMovedUserSettings(migrations[10], v9Schema) }) - it('migrates v10 to v11', async () => { + it('migrates from 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 3b750fa4b68..662873d8aeb 100644 --- a/apps/extension/src/store/migrations.ts +++ b/apps/extension/src/store/migrations.ts @@ -3,6 +3,7 @@ import { activatePendingAccounts, + addCreatedOnboardingRedesignAccountBehaviorHistory, addExploreAndWelcomeBehaviorHistory, addHapticSetting, addRoutingFieldToTransactions, @@ -10,6 +11,9 @@ import { deleteDefaultFavoritesFromFavoritesState, deleteExtensionOnboardingState, deleteHoldToSwapBehaviorHistory, + moveCurrencySetting, + moveDismissedTokenWarnings, + moveLanguageSetting, moveUserSettings, removeUniconV2BehaviorState, removeWalletIsUnlockedState, @@ -30,6 +34,10 @@ export const migrations = { 9: addExploreAndWelcomeBehaviorHistory, 10: moveUserSettings, 11: deleteHoldToSwapBehaviorHistory, + 12: addCreatedOnboardingRedesignAccountBehaviorHistory, + 13: moveDismissedTokenWarnings, + 14: moveLanguageSetting, + 15: moveCurrencySetting, } -export const EXTENSION_STATE_VERSION = 11 +export const EXTENSION_STATE_VERSION = 15 diff --git a/apps/extension/src/store/schema.ts b/apps/extension/src/store/schema.ts index 2242d5ad78d..5e7937ae5ab 100644 --- a/apps/extension/src/store/schema.ts +++ b/apps/extension/src/store/schema.ts @@ -150,4 +150,41 @@ delete v11SchemaIntermediate.behaviorHistory.hasSubmittedHoldToSwap export const v11Schema = v11SchemaIntermediate -export const getSchema = (): typeof v11Schema => v11Schema +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 diff --git a/apps/extension/src/test/render.tsx b/apps/extension/src/test/render.tsx index 3cf8d43db20..5635c454690 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 { SharedProvider } from 'wallet/src/provider' -import { AutoMockedApolloProvider } from 'wallet/src/test/mocks' +import { AutoMockedApolloProvider } from 'uniswap/src/test/mocks' +import { SharedWalletProvider } from 'wallet/src/provider' // 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 95e7789aed8..b14cea828f0 100644 --- a/apps/mobile/README.md +++ b/apps/mobile/README.md @@ -121,6 +121,37 @@ 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! @@ -184,6 +215,13 @@ 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 deleted file mode 100644 index 42328a43c8c..00000000000 --- a/apps/mobile/android/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# 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 39224d4db9b..762e948f5c3 100644 --- a/apps/mobile/android/app/build.gradle +++ b/apps/mobile/android/app/build.gradle @@ -90,6 +90,10 @@ if (isCI && datadogPropertiesAvailable && !isDetox) { apply from: "../../../../node_modules/@datadog/mobile-react-native/datadog-sourcemaps.gradle" } +def devVersionName = "1.36" +def betaVersionName = "1.36" +def prodVersionName = "1.36" + android { ndkVersion rootProject.ext.ndkVersion @@ -137,17 +141,17 @@ android { dev { isDefault(true) applicationIdSuffix ".dev" - versionName "1.34" + versionName devVersionName dimension "variant" } beta { applicationIdSuffix ".beta" - versionName "1.33" + versionName betaVersionName dimension "variant" } prod { dimension "variant" - versionName "1.33" + versionName prodVersionName } } 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 deleted file mode 100644 index 136d64dd476835469eccf8dcf46c396fb40f16ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44472 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 = PackageList(this).packages.apply { // Packages that cannot be autolinked yet can be added manually here, for example: @@ -39,7 +42,7 @@ class MainApplication : MultiDexApplication(), ReactApplication { override val isHermesEnabled: Boolean get() = BuildConfig.IS_HERMES_ENABLED - } + }) override val reactHost: ReactHost get() = getDefaultReactHost(this.applicationContext, reactNativeHost) @@ -53,5 +56,11 @@ class MainApplication : MultiDexApplication(), ReactApplication { load() } ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager); + ApplicationLifecycleDispatcher.onApplicationCreate(this) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) } } diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicConfirmation.kt b/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicConfirmation.kt index 63ec163bffc..995266bf9a7 100644 --- a/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicConfirmation.kt +++ b/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicConfirmation.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicDisplay.kt b/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicDisplay.kt index 540064365e7..09a14ac488c 100644 --- a/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicDisplay.kt +++ b/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicDisplay.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import com.uniswap.onboarding.shared.CopyButton +import com.uniswap.theme.UniswapTheme import com.uniswap.theme.relativeOffset import kotlin.math.abs diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicWordsGroup.kt b/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicWordsGroup.kt index d0effc62bb0..35b7f237435 100644 --- a/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicWordsGroup.kt +++ b/apps/mobile/android/app/src/main/java/com/uniswap/onboarding/backup/ui/MnemonicWordsGroup.kt @@ -38,9 +38,7 @@ fun MnemonicWordsGroup( vertical = UniswapTheme.spacing.spacing24, horizontal = UniswapTheme.spacing.spacing32 ), - horizontalArrangement = Arrangement.spacedBy( - if (shouldShowSmallText) UniswapTheme.spacing.spacing16 else UniswapTheme.spacing.spacing24 - ) + horizontalArrangement = Arrangement.spacedBy(UniswapTheme.spacing.spacing8) ) { val size = words.size / columnCount for (i in 0 until columnCount) { diff --git a/apps/mobile/android/app/src/main/java/com/uniswap/theme/Typography.kt b/apps/mobile/android/app/src/main/java/com/uniswap/theme/Typography.kt index 0d0b5235375..4ee804ca101 100644 --- a/apps/mobile/android/app/src/main/java/com/uniswap/theme/Typography.kt +++ b/apps/mobile/android/app/src/main/java/com/uniswap/theme/Typography.kt @@ -14,10 +14,10 @@ import com.uniswap.R @Immutable data class CustomTypography( val defaultFontFamily: FontFamily = FontFamily( - Font(R.font.basel_book), - Font(R.font.basel_medium, FontWeight.Medium), - Font(R.font.basel_semibold, FontWeight.SemiBold), - Font(R.font.basel_bold, FontWeight.Bold), + Font(R.font.basel_grotesk_book), + Font(R.font.basel_grotesk_medium, FontWeight.Medium), + Font(R.font.basel_grotesk_medium, FontWeight.SemiBold), + Font(R.font.basel_grotesk_medium, FontWeight.Bold), ), val defaultLetterSpacing: TextUnit = 0.sp, val heading1: TextStyle = TextStyle( diff --git a/apps/mobile/android/app/src/main/res/font/basel_bold.otf b/apps/mobile/android/app/src/main/res/font/basel_bold.otf deleted file mode 100644 index 40efff33fbea13d64b59fbe6e19806aa3109a871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86628 zcmc%x2Ut``_W+E~y>|=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 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 deleted file mode 100644 index a29a6258ac08d30eaed8f4f9a4cf4e5b0079caef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84524 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 bCVDp&?Yjx>QH8jLkV(nw>z5^-%b5QMMXG{j 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 new file mode 100644 index 0000000000000000000000000000000000000000..77dc33d7b2c733d7e8dbb7bf3aec7652a0253360 GIT binary patch literal 273636 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

T&+TF}4*b4_a!y(JT8BQ}l=OVp=`UTmU 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..344235fe1c3f55b8a14182aacc3b4e1b6215610e GIT binary patch literal 275116 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 z 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ⅇFBYqjT zJkabLbtK@LX~&L5zwENS;nMg-CU4-9{h@qGqU8+pVYqJGTXigv$Q;H+KMIapt2?kL z)`fJb4}7+0&=HE5amP3IFodz<6qoerx<(4eP*# zw4|peq#nw7>yJW;epnA_ZbN?U7=CidZb|M@haXv)pNhmsU0OnUDsQgRS!Y-s0uINJ9MYDkA(&eP+A4)eAY_^$dxzngqp&oqzI{N9 zPdc6K5Pg9^ya`qcWLbZvEvk|7ebd76~Hx`6F*7S%>dTiu`UKzntXb<=RZf?uk6Y*t&nf0#PPAtheptg9b zG#;X0;X8TiX`iW}Cv#N)aS4k8>9>=13%tS33}a^mKjA88)MX$cWdZ?R$^I zV4S<4>7((ra$z4rasdVU5dCkYAW=6-?1`qwt-W~o9-8ib116#idpDze-HX0)kXMj; z1~%zO)erf&lgAU{E?r6-+_PK1!EK3FO1yvnP`?hXyA6Q8&b*Mf1P3IG-m4)B0H7hs z5tG{qD%|1T<#$Ozex~-rVf&YFLJFENLO9}1<~^HseRQ&A(CvoDO2QViH!<*sZrx5i zaozIm2^Sp%YP;$=@y1ATjOqTcN2!eHg>T65H(!{ReM9$z>(58)p6w*~`WNydF6EQa zD9NWKRfl}CEW2vK%Eexn4(&XDY0IbqO)3qiUcJo42kQ)TY1_A?ZzgH}7GtI$Y(9!) z42UdjtSMvW2yJU5<+JXQ{13V&by|OcPu!Rk|GK!H!_UeT<-jlXcX*{AFX}V=}BA zi9`D{L=6*leCR|;7KB4u;dABYR&W+5wmMn}&;J%qO2 zEs?!-_@6MdVXx62J?`Rxxh?t~#J*LGX49J!{YLZC%ke+aj#(LjSCu(_(mBVE%5!T= zy?V4u;oI;n7eXcN5-7X+<{=u_FstO z+}rjUJ(|tv_rze7FH$Y{il?_}18R`_!(y}{l@Bpy@UJCC!A2+)Y|pc&PxdGjY()9$ zAgavN!LO)y7V4GtL~oQ2d2>g3=$F@_dbu~z>kZR;NYfkg)5q}B9kgtEWq$g1X&G8N z{qJa59HV8kLCf|+9QhX}kj~CJ6k68jBQ2|~(6T=F87(WT(6T=jT2^*=nJN~;%7vJB zckL}-h?dI*U>rief|dhWr9!$6qZ-qUGGIB~g?&*0YN>+W5X>mt1W-7}@@5q72q>J{ zPT@+{28COM(FzL3tRT;iSnHLNaKKLC3Ni{;!Ca-2&JgXOaP2_h5-{mPnPx zfx;~Ug)3;HRkNk|l%83pMQ5eOpm2$79wbIecR}IY>=Z7FQ8@oh((XN)?xb*qpk|NR zMOedq2*)U#1{4nSGOQfRP~X>)p3%zAdooCLq0y~ctZT8%L#*ecJDu^4M^M} zkhs1bT6Z4+Bb|#t;(S2jh)T`mAru<7+d<>X?UE)l8V951d{ZZl%lDDSrPyg4Re{JI z{yin}IEY*-pIgiLTFT%p#ay;V&zcrxp-pLqZdT0PgkxT$BqoH}I?g3<%Hoy57VzaC z>K2dsdFUW7S^^WqY-q#NzEnKVQ?U_Gul-3>5{#~z17^@%Dc_={eQ~+2wmG}Iz_AqDVVXSVbpftKg zs@(7(L((9l{}(B4>;y>~vtA5Xhoh&MmT8OBkq zWsU(DHcbj+;DxP~WCMea#NHuOVCfg;N43nnE`wBFkfMgG2W=~cDv~&rhxPa`fkiF{ zsz@vYmsqdya!ZCR61#?%W50$4ZzU4TpphQ{mfUg-77{xRFBvo>cCD0Km4PFdInT>w z7!bJ{AWN=n?=QLXR37(V0wI@i0wI@SK*$pT#0dt3TxJcQTjpyZ@K%z`Fd%ZfGaxoG zAmlRB@R9)`mjMtvOG(y_;kjkiP`71CG--Y+c==&sJiU+U*mEHYxU(TI( zqFi4Zfvp69dyl~+v%y4qqB~)Wo4DK4PE$;Biy!JkzP;*~zCiv}o)KAars`8 zyJXmXj~GYUWRyK4cw`yTG4^hF8I4*p*q9|1VKL*a)1SgOCErUz(J!N?&kmn%YQjaV zgi7howbKK}O_?%g%;YsY=2=QZEg&Ph>5@}}A3?3XmUGOJf_9+ar-?^fNl@vi(UvFq zt!telFqnFJEukv@T@)V#}-5x)Zbd9R zf489E8@&%VF;ArRjg!Vl?bsf@erwd0nS=eu!Em~PFvBv3Q^SC3^TqaIhy=lw3Ra>@3 z%@{W!FnEFmah-S)$%;IG=f~UE(OrF=1!kTn&0sbB3;#Q>Te0ptUx{ByV?IrwZ>oI| zgK9I+quK{C->o+DJgVK~to9Su2RJK#z4-f>ziJ&}M7tjPp@P?o$MPRr3u|0{b&1O8 zY?`yF!1ZD}r5P+MIPf+&#UnnGWH~E>NXb+TsP*sTUmbhudWR-augufWxj}V%`2EI5H?G zpA330iI09G-I?Qob!54Y%%VPY7L4&PvvwzvME{_T1Lc#XAd*3H>LT;-Q4rg?f}Hs1 z6yKK>;fLkl9#SBd6tdYuLsd3aaH#4qjGU;3@N+0u;!jY9Tj@fs4 zsg#7W3hL*!Cu%8pRM(z`d-!(kQ`xKN-6cFtBLmUWfr_x{b<%^>12eO(7PcUI7!Sw9 z96B;I#@Bb)&^~?l4LyuyLlanCKMm#VWM)vD8gJ`o5cShmu~$nT%sx2eO10Ljh+5ZB zzly4>T^Z6k+pnZwY^$eNb%y3r@gq{CJWw0yNsM~(n0cBq!exW~r5xZ%9k0k^XlMgv z@zMi^3UEO$GKpjdCbEDDwu~>hl=LSMQdExk08)TG{l z>Y5Pm;|l#>rJ;pK|7 zEGaEsyKNsrQT8EJnhl{xH?0GWhj#8tJYYXJ8PIRn$V8TxHVTvvk#Zk1tHeh*e*DFV zvz2}WkOp}UBqEPRyw-&dG)|?E1NkyA&(x*{3gg;M% z+Vh6KbO2GoT1hz!O|RXg0%U73er4#Agd6*f8rk1(r&7(q1Xj%j+K-LEkzIRz9Dxl< zIhaWzJ{fn3j|GcP-88O#-vKS!4cm42_|BdCW6YS~~8b78e;6WefBr=`Lq z`!n|KMYK4BDm7mM=ggcXQFB*bx#M#ic9UppT8b3nX{kp%yM3LTFH=oAlKfh7g_bhr z-lAK4h|h<7)TcB!vuA7M-f~n>gO$%79p%?x#n;c0>a)V@XYskySlJCxbVF8hlx{=t(jbcpe_ek~cIyHCAp1ITO^k3kIvf6^bk zp$aMZB^+6RBmK>1KxkpD(-=-mJgZT$<^qfeIIP%3im^A(YgAC)06c(zf&fmI0#4Q& z3E9pfQAvBYk}MnOM!6}ZCQ#TYfi%+oMk@~D%gLSuR_E<+$k5z|Gx$|Iwr||K+LesD zHiM7cv5nmu%E_BQ%P1Ea#M8^poZ2t48R#vR7MvkQZ2W%1xr3doTpzaAK~$m@uMrDy z){|hMI-sa>v> zjdm5QJ!cAL<;rly#x}1+J>h2LTBUbm&EnkZ%*9m8hn!gYdGx7Yw>)q))FXNClL`0L zzh;tFnOeCsxoV7^xo`3g^Xbza&UNXciyAXx|GJH&2qZ)xpSRQ>(=d9u`kYxcA{Eir;$f4Ufgx` z%<0{|+qLuW)7fJ9wKVC}FmPj_oI*N4hun0Pn9dP1b%i8rec6VI_P+UXT6BlG;yPWu zwL>FMcpW*qFU2f2cyOeD!^IY2UK{$Z$qlNHE}TwHRXBK(YtX2?7u7uIMLfrvpH0?@ zQ7O~*P3q&-zVnb;yx}u8Nb0Hnc)KC zSn!WdJOtZAt$xDzL{mvWW83M&1~xUd_KUka*+OdTH$Bo(U;Tm=3sjld9Gc$?6i*dxAzbp5E8@4r>@a?wzkS=a1G4bNi zsB8$p*sGb86p>g>-!dpMk+OvOw%6q zlxM!BvEcQ0eoH$))<4)Bf9~+6p{W_+#t?R6*t(ER zs+^Xb=7A#-FEK!-3{1#RR-y-KMRE|P_L$UUqONFVn3IVbrJF#TRVJ|h7X#HP2;&5R zcho$MHs8cW0VUPaym6Q~7K)Ss!v*A0GUwNUtVLQKNR<>FmmlIVv;qByFW3q=gd?Ts3f8T35d6cH!AJJ`Z%_H(9!XcgYu4AkLiHtD_vzZzlH9rN zkrF1VuicuW@%LL#mh7`8cN3d4n=xnJ$Z5L$%h*h5$7agr9KM(}O*asR&Umpan;)AU z^W#T;xJ1C&kJ-6ZvtbQq zxpqIc$nx@RE2oD≺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%0A->Ce-~wvgo3C5B!vL)LzyC>&^=Qn`1>f+fHBbC ze?XZo!T*LbLqZvWl5`Qkzd%X%1^62%vn4n*GAua(ejQ~lP=Y!yqJ+L<<8gcyWtoIR zdTWA&5`q$u4uTSfa*_nUhO%4&x`wgI8Vo2afGI!_P^lptWt9f9C8_~LL&P|dwk1$s zr)i+Rk`5;n0Mj)Tp`>{skj|b7%mS$Gvo+B3>wq}`{cf&?dX)1tEJQh9!y=Rm0J^pe zXaE|44#1|N8zt2P_}eI(BzQkctVj{~Wt1%vN-@gC68v?PtrF0yj4jddCd#Ei8}L40 z*8n?-wQKkkCADce04t8I(C|-`D>YCXR!MLp%GDCw7bW!p;AWI-fVDU#npr2oX|6i~ z^pD4&Tra^BQErgnpg*=zf)jmh0yd*QjeifY1;<1qTO~Nn`7ILs9hBQ7_yEdVCHNmv z-X;Nifw2cQs3;$j;9sLW4SWZ*N3{H12?YgYy?{dXACXXq2EQkv)S!G+g46N$CHP-a z{y;(*h4L{8!7o3=F`!IC`M88qj?y8a5H0meC>E4X;7719b5Nd@P{3EvGXhF7%5xG5 z@x_x8iV5XY5(OR~I1vvEK8`>cBmujW(YT1Q0nfpDl&D8Z?Vve~K}pXBXk3Z^g$#&ANzb6M#2E8% z30Sv`(=z}XZyqVZtSCWG1lYa|cBugAK-i}Ou!kA!Q~}a^BwvJ#!CY~A9zZ&f(=z~? zH*S?6eaPuv0L>xnTLIFIB%6eMx`vYO3kV%a_X5Ox)9(S2H?V~z=AcZIAbm)3O@QV$ zU4nEYY-S0X=S&HfhcZh8%{k~v(9~FzbT5JrK)(lAK1%uxVJ<-R0FrsI!zJdSERbM@ zD0L9M6iKjRlsbrB#%Y+3vP44Y@=_cVh<3(HkZy;SDnWEKK|<*Ji8v+@O-+(ux1%iA zumI&`3AP<&g@%PFr$~@3K(byS7-f|NqkB|q7>RPK1lb5Aiv>bZLdFR+poEMNa^en@ z(={}roFPH>0r9`UD3suB!QXU`*&2xM>Lkc+fR83YG&o0s?LbNML9hWd2LRa+@WLdl zD5?Jd*%a`^BtVPs!(?^`J%`#yNC49*h?cu0$gV-gi3HL01_`oj_(lz-C^t!v zox(S3s6g2xK{gBDB0)9_->QLV@D>TOU-&i+M2{p30J3E`@gad|ljxp6b9F>Qp*CNW zfH%xY*9v|69?I(y!UpQcF@fmRB|&x&**XHCA0<+PY)mCeg5(g{AHoK)p^TOwc|*1% zf#^kfMuLBc@+IKsKpF504dp0*uVEs}KLBq57%Sy%4Hy&UvW7`0-_bB0whM+sHQ-ri zQ5peX96ycH3I9xZUs_R~1D?cjJIbd3j6LzFdLF=d6VIs^fS=(Q z^sK%FVD5>I)t4oRN7Yv(i1yW2C5X?|UrG=kP}GxvhzT>Gs|Jn_JX=H@6&zy>3?K*s z*|P>zGWg^8zflHAknL#*lpvebFhT-x7G?+nLQo%LK(S9l7>?0TLpTtLWAx1s1&qS+ zk5NVgi8#K1G6~4RG5Tc41@h6(9ViQcLL7sp3`IZ*j`yJ~l|arKGk}f_Q*a&gYp4Wf z-B>wtP3gYFD-B={pJ=SuLqP|gDup$_KW&?Lbz?*{N5fgeJNIV14=Cy)I5|MfGy}R-S2h@{v(vzfjzjM zgz{nF44y@GK+^;T^koHK6BN){JjRuv%s`3pAt-b$TtYFT#8?rOnJCdmf>MhTeI$^- z8lNqp%t8tJiYNNHgz_+O4D~U7@y8_;&}%&ClAzQfB%(+t7{>%WkD%Zg2|*GH<}?BG zNKnwPgpm>oeUJGh(D)=^4hiIMCSVQ;3fh+t3xHmfRFq>R6e=?$lysCe5~RBlS|vz# zB`lFpsIDDo$9*t1i53Z^9wpjMP%=?IE$}M zzoUFsLirlyPbHLppnMs41;4$9@-+$NI?9hElzxQM&{l$iaY!kbPzF#|NT_H_3i?G* zIm$K(6=R=*KBX+fbyP}OC87GDMB51}#v~PVK_H!(x?DoVIQQYceSWw;4y9Q_or=;Q z!2GCqejmn)pkj>sFoy&c_eN?X(%yQeVAtzW7UT_Ca89l$pFSxZ90FyPr~(eD9ZudPwhcjD?xgEP+{Sq?SRTJ2DitLHQ%Hd^;u_fE6#wN_hKEU`Nb$)dy;?Ry(@ ztPVD}VI@B2HN-p08>8Ka?TwA4Sq=l;2ERb1+sCtTTufwfSB*sV61+09>qlJx? zSq{I<>2n*Z(8TygkO6ZbpyTAeV9O_YMR8_ADD%yDQgI)t3o8oJ!s(j9ea)wSyjIWX zzGiYC`A*mF!km6SrVIy@eRq}z^7YP6`f$*PHIQ#`w$jHX`q&;wMtnH4A@*6#=CkQI zvNO;&Gb2CF%yXGhX<%m6%D@}=7pDE!0G+rEw%UV;r@e$2(I@OHtTry=KjP2xUt`Vl zORSwtR^}>4lrzdX<)ZSo@>gX*4OU~Yinu~OufD4OQTo+Vr9C1mDBHr+t6ud%-WkufVU`Z;qecuhZ|8-x)F%!2FhfvVXDvH2+2ZYyEruKk)xDz!WelATyvjU|ql+0Y?MA2=obD5cspe zUyq0!v2w)4pix07K`lXNErFKlmbsP|%QDM8%d?iBT3)lfX?fT3N$`Z=s^Gfdw&2yl z_Xj^5{Qcm+1YZpv7@0M)aAe2G4I{UW+&%KXk*7yKI`XTKg&|8rR)stjIwCYYG&VFZ zv?TPQFdkMJc6-?FuuEaT59VEx?u$Jc`+1xi7Z#TqR~k1Xt|hKBZd=^J zxVMo7am0GYdd_+=J|I3eJ~zHBz9xQNd~1A1d{6vN<%yJ^r~D!1(-c>#B{dxR-~Ox zdnxS?X`iO`kI5cWK4#7s`bzCRgdc(_u{x$O2(AzFX=6LvD8u; zS(;utq4fUoe&eghH;i93{;~1Tmnmg4$_|#DDEn#It7Wg3U7ui>5I*7HgcB29p6EZZ za^miZuTRRGw0Y8-<)!6E%KtIBX|jEC=j3gZ4^F;Tv7};U#hHp%r$kN3o-$?1(kb7W z^5m31R;rcdm76Q?tvp}(TIB~-=Blw(hpS$$PO3gq{hO(AQ+G~v)@0Y5oHn60e0tc7 z{F&!w4b+9!W!FuqYp7dOx1;XKx=-pu>nGIzV9uyH2j^Pn{?9z)yrOyY=WUpGX5Me- zy*=-Pd4HMjKYz^p=J^Nbzq25H!RZA*U-16I^o1)H{-VLBVM@cL#*D^2jgL0I()g*( zY%8-l7tLSvc~eHyFPe*+7d7AByu0~m^Zm^aH~*md*UcX_Uul`rvaRKzmY=k|w>W(9 zwAO^y^{q!+A87qa>*q^CmrPl*eu-q?N7E(Y(KNC zaM?r4t}UOmqGY9gdRHG)uz>!)lsVxR%fg(SUq8N_3GKH8&)q_ zy=wLQ9jzVbI=)`>yR}o+-oN(J+RJONuk%|MzAkZH?z*Y#TGrjN?&P|&>wdlNe>=^c zqdL<&OFL^jZJnz+w|4IBysz`o&hwowcfQs6N$0gLb5~4PZdX;8t*fK!j;<43k90lL z^{cKAy1wrA@3wXqcGq+->hA2`)qSe_``s71-{}6h`=9GA>yy`yTR(k$>-vrB?_U4l z`lr@kTL19|wjpvu?uOb8_6@gfIJLpC;o^qA4PS4xY)sf#uyN|f#*G~tZ{K)q<0Bhi z*!a7RpKda2irSR5se03*O`V(eY z2hJaO^+4Z&D+m1!#vE)o`1GN~L(2}GIrQ1#ro;R0G2OHJo*&=y+CA^x^TiRLBaufk zj!ZZ*`^cgrFC6*pkv|>z`%%B6!ABF179O2?wDD-i(c6w5K6?77^XR)r|L5pGjs+Ym zIX3;+!eed6)*budu?xq3bL_)oUmf>59(_FP_@v{rkM|tke*DPs?;QWt@xJ4KIsWwt z!-+{J>QA(t*mz?1iTh6c;KXw$E}iH*X*d~hGWKNN$@wRjpIm?P_LKWgzHsulC;xQv z@2C7ujXsrqs{GWPQ%g_Xck1-1v!{N3YT(}Bdt>e$b8q3jx83{Zz3<*P`o4zyPTb!L zt*NlF14d;pY(tg7=8OoA4^EB`jvuQuxB~cLSLZdujDMcBQ+P&UY4|t}eXBs@&Tw-7 zfZ&lO4sLPyUV_a~)!^{WiSG3cp4cc(j5sm+X(wi!m~jHL!iXO^6;U{poL&RJnw!T} zm8Zs=5_vx7udH3iCseuqTD6QTE4hLsnsu&wTo*q2NVQ(?!_F|-3d0O|9|rg)CVmz% zl#9%d;qeat%ei^O)p_Ekb(-DxId{`K3*2>{ylEXjcb#WModB&pj;KqydG1!9ch`FM zU(^b7*Lv!v&ztS8^Yn0a2F57AQLVBLGx48L3{Y={PmgvzmCII`_!Im-tlF!vub9$_ z84hOAaIxk(m6TMPW5wbKxkR5a+DvoIC)Z~>7$?Crxg&Wn)gGDCo6N5|%_EZ~ee{mv zR~^BY-qAGG`N8>P!^6Ttji#`0Q6{SSV~Yw43sMpj@s)OD|N7R=rTLR*?A&wzx2H~? zJoVeo8P(M@oT{~{H7mc$FUGi_GHZpMzgk#2y0ozW*!T)-#dr_{t3xL5b~PQXpWyhgi(9_nTcBHpW`rDdPks<%+ec%mPd-~xp_VbDQH*`8XRFtNl8pF zqTS(WV{wGh$XD#&zyHAAUA}hn%;vWG`nKkoX1nh$^P$66j@)y{L3794MQg8gG}f;& z@4uZ!zHT6mT85E_w}u&cfg*F_I$A8K8P`G0Pw>N%noT*5(Hb?2UKxl|Wu0^Qt)TcJ zb%+XOo%1)XGkBlpZma{&CJN{P1^6LPtkM>YoR7|7~_owFjR=w?>}*5_bqpr?7p?LmdtHf)->xmp0MA1eD9V0C%4^hZl2ZLab>k_`Bq!Uq5Iri zPjrB|3@F}B2jJ*9FRrKAlXcv)H>3{Do~+}^_3rz)Ue_cK>R|RRfOd6`qCM6A(B;a_ zILZec<)aHuF@nTir0jKGbE;fOQ8hqBR=hYy+4TuI^b@&LLcbG1LiX496lKeun0@DM%5@x@6 zkzc)d(WZ3RZ2iYvR$l8##p1kRui0@^cr*2w@C`Zr^#b66mVB~T|8x0W?9lGZ}t23mUkHEv2R4kuMwNHY`+2AX!~ohG}fx_QC8 zi#&6mdB-0A&KZq1{-Uk_!#nqZX6Tvw1kE7IE@>0G5ki;0SlS zRJ2Rg+vOz&gcQ;#+HIuzsGNA;C#N?6O2p5H?A+YE5Rf#i7qU?k`9-@uffsIYeUH!U zalOH}xpsoa&+%H zF<~-6+MTfT7S-BcDri^SMbPdzF&a-`tykA0MooU4KnvsyqmF378ZpE4+hw9<;<^gM zN3^UO*EfmLYjzqvM$drJGYmU=3cgYF(bHwPlPd=F${Ao#Xb=N(oW=m^rqf?s&&^9# zX&^&FNJOYS`=D+2v7r2}n9&A%i_tWssR(hqELAp)yB392pZ%^ua(U9XXduV(q9b}y+hO6VA z1=JC>e*YBsfGK9ubeab=$4Co;_P%RaJjhwXR&Xbk$1N$Go$ovZ=BJ z#0qMOhaaDgy(I~-wZamUs10EjhgoZb5N|pk3z0~y%P%`rizAqnW^ah;Do%)a9A?d3 z^D(BRrs!UfaNEMei<7-bN!fes0d@P%J$LQ8dr_m((&qX=BdO=D%{}Uoy;lw$J9g;G z`u*Wk^Fp3q(0*lkL&Neb?F+O~BYEuy`*eXbB5D-1IKtw<;-)Y$0w7-k^cL&VS$q?Q zZ^F=gCkrssj~G<8rPmh?hYJ@0p&g1yh7j6r7X%!yjjJgnQBAyfkp}XjooC&;ZAsfN zyI(oT500;%SW(MAB5YG@PH!O2 z3?|aA4#=et3%T0Ph*9F}h#VmTbVXYrCeq8B4GoWg4-VzK+V-u9HR&7cY8TB~e`M9Z zws|K@tI~QVPMR@y>)!S=#?qOUCF82bmrO`VUus*iYW(!7l5zQEg%c9f7TebMkc<$0 z5MzY(88Jp$OeQ49k)n-}tV8@S>$u}BUUkxFEMy&w;|qvw4Bmh6x6kP@56|CX4m^K* z0i24)u(4o{y`VA^%XTtfaxCQd4z&u1A3*=Ym;_(PYt|#ryrwi`Oj zjc#&Jpv^>dLL3-*%dNNCtLp2k?6)E&q4@WIxf*hv%EO1Kwc?3l#ukazx}`ekNZ3=u z)NxzCL+a4X$osgZ`j9##v1J{%#1?fNBtzX#BiS!&xn=*5JCRhEb=*>YNF9>uvW{D- z52-`ZI9Ug~)umJ)(jvRZ82y;f^Q;xFw_CTQaWBy9Pc;7uzKw{M8reATsIQyugw>?; zwU;}iGr7~i$aVq+A|eVyi633*a&^4=>Pi?Wixt|F1%F#Xd;)r?*~xEat9c20FI!Cr zRuZ2kX{4EQoZLiKu2Wh_PCwmHQdPv~&;7zrferCA_OcG~s;uLlpCNTBo;bV58K^q?DdWc-K|`5xSee@FA-(P!}l(P#LsqR(2y4PLcwqsuzfA6duKpY^Uo<09+0CAWSb*edv^ zApVRPc?i43BQ9#tY!xpe8VS`slC%j0O7w*gtbL5cTv8a%SB5HJa$)&{>@V{rXMp?` z{?g$9idEv{Y0t`U|mVjJ;1t>>xNrY!h^KmXZB zAAROJr(6?6$>`5SYbQ6hfsh_X10 zS|7b;PG}>NA*zqCKM?;R#R(Umnu~c1mtBh#@feC)QZ&XL{`UwDQ#b5(yJv{_#0kF7 z#>acaiQls!83;D+w?I=nvHlc>T^BQ*hTJ?FQUk@O=`&nwX(A>dQD>%boP?vL6nk*6 zOO8Z2>?1EZ!Yz)`bnX~~<`svyWBd`)z)e-d!y^(>Qca1)ZW}nFINu}}E`IT@B`F+H z{|B3AT7o|unKe4TG%C|RDJgm1&gi`GG4}D9S^G{YIR+mr1f)$|45uo;HnRUkldsLs zyyk(VwKed!jHcyBk~Y=D=^~vhdMD;+3#N-KP4c2-OrE@pKo-HKIsGG}sL%cuN08QA zuUP8fyl`z^oc@6#p5dR<8zkn0rbdJn!nC!R#Kf>dx1nseKe6rB+qStqjUB63G_78H z;(y0iH&qmCobZ2{N+caWi}6x1UK^cEj+f4;LZ<7a5d_i*(oY0=>s&kNVfd5ihlk+| zlt+O%y$XgAamGN3GtwvAC%Hr>y${5SNN~a90KpgLhs6WLs)@mfZMj|tt&6xQK7Y95 zvg-#*uI&W=+4?WRzEDJ@3xN={K8!UweWWkxV*%w#ts$1%^fr4L6T({5JD^Ker!Nz$ zat0B5qjfkC0cM{9AfRpUFx-P^Q{=*xh{UB7j~{~&_7beR{;vC81ml`3_?u|rhP#MT zDTeg$U<`?$S7zazq0-i-cugRi;53d1!obNk4=*`*pwz0e@D+s&5atJ)3X5UT7KfQc z=*w=ub`9J5SH{)F@#U_kX4TDd{l=sD9!l zn#CCTLo%3@tBz5ST#5{vxJL!6k_iaXVXVUPi)bM*jAE6YNi#D;)5>GZrdQ>aPS3O3 zV@EA5TiCYiQb=HHQ1GlpiqDM6l_mX97d>UwU2Xlp+rAC+YQ~rmRnppOt20DO*O0+^ z9X6mtE0b8Ga{9~V2!Ch?f6@;4I9u*t=MU`wACSCWVr_^t1RX*l%;L4B%Rw!X4DqYQ zenxEFyJstZ{2Knb=Gbft=g$4soqycKI1T?Ux=JArEx<|( zN@6hy3rYQ@xQTfFF>xnftb>|_)rQG%s2Ue~F`h0tGy{>08E{x3EcdWfRZZ(($&Jf? z^J|;(62iAOrKSJ0-gdMVZHG;a7YH2^ZKodMoO<{Ns-;;`s0G_Z>oG-jjnqQ?Y8QUh zAjSpf^sCoMPmYB@NwFZ(! zc=ZM6vM+j%Jys;#7U__+6N<`*$9?lP<{Yu8KUX!^f z%H#d@dKQWnEywf9ZkQK}^TJZmD3P*iXoXF#S(A;zgr%bA%y{W;-QUnCb8!9IYq>gv zjA9LS%IN-n{z-qoGMWMut_#3cIl5Z(7%i+2qx%+UqDxRpg^w8BB%NbOVw=cI^@xsm zwaXnXBzsnHKWQ1T4_KTG32-&7_VKG?tqHrIbCDXtct?s}R3(8eoxy3IB)%k>^{%2+&& zVl76B)8Jh5!f+1H2Gj<>5ndVb8_tQ^dfl}Iwf!sqN8>Nt>t%6o&CkSnhv=z3`w>`! zmiC8ax#68Wg&B!EkqzaK2&~cK2)IP%9k><8km;~3$nT0zEQA>w9%|c*(Yl`PJ3Y+1dkv`V4G>Tu5e%ocB(E2$WmJqS&RlnRQI=td7{I{7kMh&K1e5<#G$`P9@wVPPWsrw}csJRhlrB6#LU zJF3eL?Av#sta`^sGYjV|T{@?5rp*?1+q{m$M~@!vn0H&4&Gu2?;%ObU8qqOraUf>x z14RYS@Wk^liZk&@u#aC?^0q|^S0tG1#_LoQPFPAl z&}mYILPMZGNH|}lixFEUf)@(RZ9Nxi@$kgpvnTk~Ydbb}b!{xGt}fd_Ecx7u)k{~e zXegT6GPTH6hqmeY32|%|ECiCvk~X};H9E&RN2nsejd*-8MnB9<;Q&Wi4mE_DikvEE zoTviV&}d9_i)eSo5(Zw&T2i)~4&J%%z=8dD9x&Pc<}@yy^T7vmmfGg{a=vr-;X_vr zAKi18dBws-Yg27qt8EL~F|HzJi+HS&VzxLZ{VKJOkl6D4-^ylfy%=}F+AUKC{yOjv zF*}rF*6fTDbVz=tu9!w(E=K4En?4d^mLl;@q&7>)IdWP?MACRzavUQ>?AsA3hQwj9 z^d`|v6=O)Sf6JQQ?TT^kT=0GbE4**AbFK_JlJ?o(1Lf#!%0a-K`hqDI~$5YYnq% ze^FLpVOG)ArlwO(MJ=t1TaMa9Ytvm@Wip1=4S1L`N=Dog0xOz{j4w%%Ub@mtD(Fro z^qFvmjF+6g2C?eknr0D)+ZUwiNTcL$4A(SKlXQTu#ca*pP1wF>J_d(V|zgf zT45hpMYIKN32Re})gd*HM#hV6y{u2K1$=!8+O3&<3SqfJGl5~lU}=)qb@9XrT18i0 zy54t!DB8=;#9R`EV|85fwS%PZ7&I6I@zRU#VUU(2^tEugVVHP@L4=A7i+9TlkGwek zwrkH*YkM}YefkWoM^Vn%wPlM7+Sl4js;pB=be?nDxEc>iyK%RhC*|5J&P5b#pN#Av z&?IsJ&?_^>_7U{Tg#9$NP9;Kc4b+MSrl6l3V+%;pqBEU4WI`bwFcZvV460_wOD`h~ z8mSm&bE0ZQE+-^@kz_C&KFP;?uJVzq?UUl;xyqlg+t)`a9j=v?jYm#=7PYdGf7)OA znHYV|UWa55Hn6ncMFa%r=*!s~Gs^V-3z;M9JR|CO<;Q`V44B8K(c>_--Dwg&^e{B- z6}0nOZS9+LKi=TeR{y@5o-{HC)uZQb&_43&QluSa`?hv|L%Ld3| z^PMa^2hWi`io?Xk=@X}ODfBc+A+j5tmN>zgmKsxMJQR;8v6t-eVtFs4U1xbc z>%^Vm5zLA8IsSLKzC2{(!Fz_!@Sv55XEa)))g9!K!?w{Q!=iNtT1ygjRI|rQgl8SM z=b_Q3TrVyX_kDt&miI+$T&!^5We)w?dS3{#1!Rt`oJ%j|pgSZ&1nOi*0UTmVqlFxQ z*jj=Cq4%|z1t~dx73{aTJ|aCh*b*I>ok2XPyyQyWzR~2<;Nw%jP)QT(H8=NRgl{P< z7380QJ1g9hMr!|i-RExm9zEAA8`QUm@4YN=%ys6#fN}^t848ayC@kDf!Cv~&OAhJe zEa=!DF$m~G#6W`l=_ogkg0nJ!Ra`9BsbB;BBs4QTI3mT8n;&XO`NDqbwN_Vu(sFJz z*nE8Q^8J;D{=X=p{kJquL5oF;#Qa{Qxx)Nvt0u@Q3!_yN4_`Wh#baaS3TISi7BvI* z3cp03iJCj@Wwq!;>SPLW7s7{UAIJL+lx8?Guv$cF6s#5)`jD>RM>4M|O+MigOc+NJ zq(*WgB&lxCQ4~=#T_8L()sK|`J)+YaZ?|@>T-jx{$9Jt*(Up=isi^3~p|Owf9D+pkb5?-Tl-nh)bZn|_Q2qCecZlw>DqRiOj;U@ zlK5j}qS#XBNa3qtvCH9ei9Q1~-WqCk-8dP7I(0>joMhppLgKX_d%1g=aM;?&t<7I1>u7Npty>G#|X-(6{(I}EmfYcMYUKLJ* zjL*Xd{@1x)UM)geDYZyT_d=Vr77Y%b-G26tEnBufakg?!eHGHZw3bLCo+xV2i)_%M zds2f4KUNa+v+Y`>e@vMSD4{)p15*sA4ZRS zLE51chK%)A=ZGY+M`(n_5v$F#7rT40gWef2)4FbSn&nP1SYfo33ep5klD{sTBoVPB zV+%v91tSnJp-f2fM-YdAwBSE(Z&}*Zv~+QMdvo)$aXC5T0P}$jM_rg?*R#_$A3V6( z^_vX`7R+kq*^6h-UhMi!^DLr+G58>VMP{%0%j`9TZS-{-v4W(}gr0FB8Xp0RErLu) z7ACgPA$u)M`cY^1m0 z8G_>qs~)(jd|O$H6^#tm;mnZwFk>)pF9!XK3A)j%rN<@Xn`H8L!IsQ$)fpTk_%t}j zxh|M@_ZobzI$|(|_$DfxOz5+vQMFM}nuuB_l1{|lE9gWc0vb^LG^3bSu|%U8sF=^< zFgW~)*q{|&&|p2AQIeNEWApN=OXZU*CWkZxZ??DXEGwJ1#wT=i=Zxg+*3`U=+y(Wv z*|r6_<5H(Y&R^Kr?7CVMZEo^QoS9t?-6;Ah;!SUog#eGF7BLK1i7`2jOf9eC#yU^j zw9au@lJY+1u+}&HeGaCv!QN8GrdP;Z$on4D(0UShs+ zKVg)-9wiepwXmo=KsUIhu;b2MyLN22)wI-5J8e!~{oI;bb*X8ad41>U?u{$kjT6hN zYED;G=I0xmS}?kH4SVWYyjfrnCH0aG|c#K5sr1WdCm~Iu7*`yeP^r} z&FZmBXQYhVM&_LTTjW5b(%d@&k`5L?2qay2i0}|V#W4m7?0NPe3{fLVAIZof5TZ`8 zMX&ANymMb?*WIqp>C z8ke8u`bkl4eSOXJ+!8~WF*`S-$|uA!IX1e=W{Vi%-MK?h$6?r>}7s2s;MjXPu=qD5JUa*74545>r3DCyQcTAd6l?J+Brqa_tLdx1biL*%wwZPRV0*mH}#7aCzfQHZ#5vv}eYcq8dW zx{j7mTv5M%f!_YC)qkCIu&l3+fZn}`7K-={j*}2E@J~*GfRa*KgbsBM5g{A>#7ka# z4X2x3$UPB`3-Jzua#64`5+J2R$bHnZzasP`FtMH`GsA>ZKGoC|8Zt2J_0euniI0#=1-p@UJPP`T-RRBl#Iv#v?RXqghh~%XE!6>^ zUhv{O;tly*+VSZ1TisT~SloQaqdo?@(e071BqA0bNe6@GKfSkuw`{p%$CjQu?$|P; zwsr@iHMUElM%;>bWB(zw0@5@ zZ%V>ME~fDGwOkQ$-6+m4Qr!oAJ3fEj^pZ(q7i7jw$xN6Ib3Qg|aj|XXzFC#iPghME zTTBjI1I&5V3R1si<-@CPf$)LPBwI}$Cvvi+$BEcoq-HINFpb_&A@KBu3fV#p#Xdt? zKMM*F>u1Pw4;H>>FhULup6PMcH|-CejfYv}W=g=x-_rUsAJIJY+%z z_#Lg3b%@^~qlJDEza{FIzkN=(b@bn&hZMzZLJyPK1}F2#NAfbMbygqT_jvY@^#QBW zeKyXTV};4O*oth}zgY*YaICa!SX%cq1d10^U^!3U7-^*)rsu{-OpjO;p?XI+|JC-$ zWit+zW#w&|RIqr~inU#L+os+*E-SlZeD3UNE4sT+nX__cr;V`|WF!R!&YWvol$$v_ zIWsADOmbl0{246^F^Zy>ViXg#QEZa(#AElOtV5$E>zt!E$P@Q^)k&k#l65fBFHjx# z{Re;h+;G3eEP4J`-yKoWaZ`5dU-hd+|YU?1z@qDg%~EH zGEx`|4+jxM#1IF=951x3ee_W~H@L2smZVg~h9=DPTiVXcZFoJ0>ldZt{QVZ0k?DoV zTN{W#MXjX<1HVHY8El5_4A*KkmA{q8to;U;iWa zyb0cVB}>yQ<#LWeqHYcA);+Qg?Ew*VFr*I6x2)sVD?{p#&X9H7Iz!YE(Nv7F)ET6G zWG%P$8FDAmE3%GTuMDX}dPUZ8>y;sO5R=sE(4I@7SBA7`t>6`TryqOQ(%zo#Xfi`}kjKsY-gQiltFxSKGxzwju$aVchpKFgjmvUp@w{Cr7%_EN>C8_@(^wMii ze=SBij(ZQg=Tg6&7pLfJc0$wXD*)b^3LZN!hu?E~u3=txSL=*fo90hz?c%##ThO4- z`S)GzNFsOyGbmamJPy1B0211h7WDm;vJOdcSx0zaBwH}@H>=~eXNJ@vnv(bNq^ZF@ zm-8`B%P~%r^=!Iv&!s+2LWt-mUgM-2w-_hyJ(t*qg)|!Mzfwc^7xy1q_nTKbkDpxk z`lUbpiD&VQ%a>hmxqc;RU|_7EflxeuNS1;ANH14G&;aRn;&*+Xh~G(z1c@#TmurB; zryoRSM+T3|3dx=tq9(tw=6jE(n#E2OYIVrJxR=z zdxZ5|19u%7VOhsL!lI7Owen8H|FV{Q&WGHI=3Lfs&$(U)6y1ZFs>Do@r#EDWran?S zgZ%3qnw9Wt>RpfXSAlvPKZ7)MvLD0~M4v0Y`>gM*bl0Ii%R25D!jL-DV_AoGXbP#Q z*MV)fj!%aDn=V$Rx}0HhRSNIF(BCE@oI8Y;o&GVI(l+X4s>c%4xuD><;GAH!%b6qA zqExvSg(})wR9VyvtVNx(MXie38l{RwsU(r8oeYzh?7e@vGzAyLy)>1OI(gKdLo%qK5u>27UlY3*)VG&8@XyQH`nANj;>WAXNi@2P2sL#}Wp=j7r^(iiv2 zN*mUk6Wk`;1Yu)KZZnwZbyChT@(mYbM3R#ODQn^I#$m-JQqz6hSwApi>Fp#4HOd75 zif@TsT48dHP`=&b7n3%n6(=kjn>lq-#me^EY<>$TjBmBy-@f6%(w@57=Egn7tn}G& zS&3OWNdY1ADrYa@CApRL{l8SoH+A39o}FBjkq~HUs9ijd;;ymK&kw+2&BkBTs$dT} z(i=3d*+DjoPdPzc14VCgMHA|gT;CHM}@3FU*!3A7+e-pP;^(+F*` zOkZYD!?YDuRU>BP8YvH$>*tND3$;X478kU(Ou8jEJ3T3Q)`)p?$4m(eugsWdcYU0l zmzU;y;klgL?7X_gV~P?p5(*E`o}QVVnqP0LYg|w;F{v!FrY=4qA--+J?Mo*XC*^Zv zRaxc4@vg^j%P7t*OeF~^##Ts+>6)~-M{@b-9LE%qjV0F%_o{`+#mYfuC(F$fUH1%j z>#Ik);3BUy>=LCln8HNX1KxHZSL&P=nFfK($RJ;l1~JMPi|;|?B{+jEB4r{{7SZA& z>4XGWxnQC(x`|6;iWh|Dr(mCOA?T12(ju^LQEn2xF$U4O_xAQlb(V00HTH$O;v0%a zP46D_^c@*Vd)L)hR@MXN?hQ4qotd%a_T+_iW#LI9szM8_bL&cr4%klK(q*fvnnWx) zsj3RJXvc2o2IX1zZfKJn4P^9S!yP`oc0=pr=T7aV%n$Vv?S_V$qum_dyP>hfu5E}8 z`A>F3UknJiFd{x=R?Uf7H30!Hj7SKH9vhx-uSrPR*NN@W;%M(5VzMoKhrv)e&Gkmb z)YGv!7T0!z!G>MXhej_Pe|lrLII@+U-mp&E%jln=2P9m;%99#X^Wx#NQ0$@gKZ-r* zH1QwA9-P4=h)VDl9r7M;7K!j!W#;qe%q*Pi#$URxDJUFll6%@WvFXS3Dy??rHzW0qu2%xLUfw#3AuB~lxBCGdL1U)}qxgJn1y zsUT{w@Y}JG)CXN~?;u5YN0I+U0aA2zov=t2&ej!;uo|(s9?tz|P{GY_RVfDBa8#2%5LqhkclZ9T6!(V&c z;!GKvPqUIDHjLxba*2*;h({v2<6Y z4`Hhq_#INtYUxeI9{^MRL@mDLFYQDLJ`(o_63m zX19MkVRA~SwP^IXsvRHQuDlc(Z%T-YN-)Jo4jy4kMZ@*qn*&+{%*EyW@3#Ka%iD;D z#cBt}*+_qV4CgfJUwFj&&nw?{b?UPLeh6lrcysjNJ0-m`FLgek*>DEX~Q|a zE%d|*gy!&J<33~R#_$N6>(TVObXOnkTOGI}sGMwTiewwH!9kA>%ba0~IbdHptb}3r zrRy{66&3yeV_*8gnDT_s(S;E?r9}7?i4bhC{!)Os)f|9nIRMHpbS)F%f3U(VOwpi4 zlYnfl5_Z&SEFDjSW2BTT`pnjptC!0pw20mjFN;R!7^hJc226-7k}Sf$NrC~BG>`-X zW|TBw;$Xle#ECb*CFDQ_^^SoJgW1BnZOD|#Cn}aH5vg7Q)|=WbUdzhDbSan-7BMY* z){>>OvTMS_YqB+aWsHgJm7Ltib91Q3y{oo5B{el=-3I6(I*^7+TsF5zLuFOftkbim zO~XeO=v9xK#j%x6e&a4aePD#T(NBb9sY`U-IKc{=ut|(Ee-Tz2y~GaU0Rs<}jL>wb zh^R%;IKc2NEF{q<#UG+-w5?K05Q#t#3X!!PJG9u^M<01a*KD@^6kgkJtJmUd=)qY~ z@e+6svvNB&YY^ zPPzi?sr)Lu&tUj2ejXe@G!zGcCv24AULT9ZR7fqZq|C?&O`dF>T!(ieZrgXsFR(Sx zZ%_~^%r@|a$XN`;Ujv@y&yQ#3%}!6BomW&;bTxML;)(Ox+vgR}kBYUA9b4Bjzp&tPLE+Sz!&7Ub zN+xYybEczbe7@aPQ#8u2$xIo2qW!`ag6E5!3IY7Ew2hI0km|OLvATg7jeu=za}HXA z@frumL&?PJ6zJYcN$N)^8H#`)tBSTB`o)XY4L@O1IN~i7(RHTzd0RxF!a-&mT&2-G zF!_f62ztHX{MoanP0!DoG-*mzWkp=|n6#Q$`|h^3-328T)0FSbnp%@yHol>-Xyl}c zH8rjRZQaIaTi5cIQAN|uF{b$?`M0bB#nfW;hN64JzDG-EGq1q4U^CK}K7J&Az(R?| zBD|;a`+CgpuYL5pE8n|#S*dgt^I!Bo3x?1lqE9`42>j93N-6xJVAeU?#HgQ-u!}rX{g@ISCMOa-p(w@6?Ktv1?a9{q&>>6Sgm( zzZZF4b?fsn7V9=Nl{UwWs>+{VXN$>BNKUgh*Dc$y&Q?BcS<(2o$l3W#)5?jr>S0~3 zhW^RIK5x&xVj`HWkCeLuF+oBG;XMyl_&>feWI;Md%8Mh#?q_7=Qdd$TtTW{GjKO3^ zk?y0pK^}i60isFn^ahoPznHLe|E^iH%4@gXxp|AJ%~Vx0Z))Z2apM|i)HT=7!i62? zg*J2k44-gAaqfuvnGH?8ML9`hMkL48WfhoYV6GUpXB)kQ|fE$ry~iC zEDE`DNvjy1QB5zc>=k_$qFXl{g{?sh4xMTcs~9o^-uvA){Hnf$0mET_`$eV6Z7_^2 zYn$7@Us!O|5;6YEyvHB03u*t5XG&|)6q%wt$+`ObM}#iJn*xS$3f#mPB$H)>U?>C) z1R?hu&Nenm5c$!bcck`5>$*@2_K^J7vm=GCO2G`?(z$nEXXl>1u4_D#*85M)sCB(w z3l8F|Hg^GR9Z{395{9=SdaQ&A8q)QGm;2)tnRhQPb04v|3{nz*K7-zd7?O`b9Qa+^9ug6v z7_fNqhSfBpq&OriIyfpXqGtW*PZi!jpfrSM<{ORJjW>B#|0)_C8z|}+VE(c8GdxuKVwF{8-L$2R4NL|UkmE0E$qkHms`Q!ko( z%=W6htSO|4r_DBmMlGy}D-I34OnRZCEI%!gKP45hf5F6zDUnfVvA)h^rnjbuzk?)O zEXGThuU_-%rtiUbdqNQvjV#VLD*VXGcUL}HGsk~v$W~h3xswOo`aRcg@Ej{frUP=U zl&yB=jxTe|u_S2nBz?vN5uyLIHOv{1M78L(>!an-=p1L(XtB*CE2kG0moqGjqO?fq z#EVxc*q8{}jvztGCGwoc3ErYiPNCd2`3B)$TqweaB}Zn%Cr^ri?gQJ3BlLCAbLWxDWWVpdAudU zFuNioFE?;@XJK4;UQBv|ZE|+>*on1L?$A2!Qh1WcT>-C28ADze&V@y!=>d_aLVGvy z79d!Cn}m%y*~`Whj-)570S}Z3*CG#_46E%mY5k+Lowk|oL-(Nt zeqA!L^8cQD-_w#fK<78p|L4vV@I0J&zV)glEzLi!k2K#8THZ<4b+<{%j9GL2Dgc+~1NYd87}jEtD_8#_D6 z6TD`_&q?-OwZ3DlIIyOF;J*I8zW&cQHzj`}FDBvlv8xZZHvzB>6ry=WcwqD^o(vC+ zta&92b_)}S(Yia=79sutYyboR$J+Mr(^{}-v;}Cnm(}_Z_)=bO6D&y?sCO5uqQqsYr$i24*C7%RN~tkI z<`3jG7>@jvdA7goZ-_5~yjvZ%&cEqEVQ{$2L@pxL{pG#h9 z*g;0xGSEGhibk!-F<;xsq3P~nM4FD0EDcuFD!(_|-HCG0D) zBm2h(hsTEp$M+wZK5f2rC%YvmedYKj4MI?Zgf9m=Jt(fIP> z)nV^Cdu60D93Bscqc9q*^M+S1o;PUAw+))F-?x3k!_l(fiQ(;oOXqhpQ}R#U^Op{8 zA3hN*i$1(z`@ZWtdV4#-^CISzc>X9KMfpIH&@6_0#ey_yOeL@r5FeOYht^3&uvcIm zD(n?rbqr)#Wi-u#qDyk26*>U;3Hgju_{t!y3mmkXBkeh5Lc**;(>HN`+Mn{`jjH$V z{AR&7M@K!j(ZMTs-Fc0+KXuIwEOf&`M|f@6x@IC6sNK6|@4joXFSUdArFMvYDKr3D zG)KA&V-&~&;R$>)$0>rE+|q2j=~Dzxz2-RYfTb`@s&4u)L8vR(3h>kBW-4;}tq&9Y z{kv{n+OuNC?RVaN|7iE34R_zYZE4@;`{ngRE3EY``a;7%qj_{SyR4+rS`$pJjmFK5 zVelg9>?GCa#FEr%&9!A>ziceYlW>Ii5Ge&RNl~5?UopL#`k$X5!TUc0p{EiE0i**H zLeGk~KPvn^+6^_JyJH@3EpEbdz~xCEw^>ux%52aSNk<_$Yci|Q&n&25z<{z_|IX;o*= z*42Y+#5hWbjuF5*{ZM^90FRd1TZjY-cex*+WgW|2jFcW8g z;mF^r{bLX8y6WVZeBDWQSuzKV@E}XfKF0oUlFqo$xG+yzpLGHtANE?EvaA)nf*P4p zeuSy>36)75yXMqs-HZ;SPCfXOgL9)!>9Y#u^)J7SIsm6zm365#XGWdoL`&7`#F26aL+=icIkg>>kWSV&oNI%_G( zmt>mdLX(eNljG7wBO4beTqWj6j-<)KIw25}(4tFVBSkUM37fMMY$i4**yCm6W!tW~ zW}EnWv$%NSqD5ckpVQMvaN7D2^=l1#Vr0d>6)PxUYXvUo)CAR+6*TI?$fcDYkde>_ zmqJF$>IUtHHc!osj8v0s6Uazlf7lH$>7pEpJC3MQ!I*)_m}TJ2@~YDc!Go!7A0N^BT38p(h7k#3%wmi(r3qK zf5b78T27u!*Mj1z@edy~$_OKAL@@}ABm;r*&S8^G@vnfvOk*USI&GXWa@-Ogp9T>v zpps}PrjWeS*hB2^lD|87_LJN8>`A_Ha!FU$l9L#v)0qob29%XreOj^V{gPDM@moDV>fts8|GI60B@`m8Mw|U904r^|}B!DOImb;G{Dk<7NLoO=O(b z>Z4JSNgMcldl_~mfHsw}Z=bdQtMx1Q8PS_~n7bYaKxn8*%4Q2i99hm=kY{Um?J%pXKMY#lalE%Y)GSMam4N@VEopkCo={%y;PIXJegs+!{ zq=aD$!z~;p#H`@K!8zJdE-H#rb1XKy_47A;e%-{5Ed-)e{YrI1VN-1V%iqv%8ZF#F z>Jemjsl#(oZ4hEg}Z=KUc^uSDTfO-e!0r|=DI63 zRS2$uamuAyrP8{7dUFo)f+PkV_M^t|W49~q=!5Y6O*Q12r}@04oqaYUj4z(;`*su# zKWGhE&Y@Xg4D3|w8Dk)8cG0w$H0JcF*WBmbVED~I2UDJN117@iCY-8CE0l9#Yy=KZ_32KDH&-d1RT;=)Yw7H z&4`%8Z>}$<;`dc7f;sNywIViBq0b!z2y^b%F!PN)-yd zVwP97*()5be6QIZ0AjU&bm`i)gHz)@^J;45^+1cbdw9@j+@d%7qwMMFiQ%s08*p`sW)2Ng+0tX9Qw)|`>GQ}WK>s!yGE&N!iBXQ5UrlLe%F7tCNwcTNOr zNSM^jh{m$xqAeW3TC{F$Wo6gAn*8Jpspx8>>Z#{x&gQtJY!xnrmPXR$Qb^L8V98q0 zXbKb`z1k9%%sTvxgDfQJx)%va`bAP6NM)OS3hR#BM8fuo!z|wYMVAoQwCm zD-qDsG~%qT|nJVafzCGIgr zKNWdmU^4QAe7fh}dwceQ_CRoXL3&wt7r1$zgosT=Dj?ru@{GkWGs3_Ehb@3+!a@Z@ zs2jgw9Hvl0@_*&~)*gz9=8pX0SaNg-B5lfJ4o9iO>1WHAbVnNOcE8=}TfRhop`y@T z5pK&X7)n&Q3;ETuZKy@7{Dw5GTMoLIi7ur3);H*|_L^oV&^7y#qc@53^|=reU_sa<)uatDOO=!=f1{h zT9!X?JnPqWB^4DVB^BWp)$h#m(q6+<@)r41(!;vfK@lJRr&eS{EFlPsB9?R@B#4sH zjBI=L!20zA^jBG3U0GFy*wFr^WkZ95LuE_*`^ziKV86#lIhD3ueumjNN1DJbf_v#~ zPU;Ii)6o@n6KUD(1cL_gx2*N}P04TIgE*CQb(&WLoL7y4SB)46M!rj<=U*UDw8aBU zdkD<>IPojEbzjfD=(ocd7ke)~E{;90af>=G4r7~k@A(J8Qx?uIOiy)0)~MOBEhisH zzJe+t$Nuw`I3b9YR>6 z3p*Ry%+3NYB6N`3$Ie$t55S9%=SGmP{HS3b1WCRCv}-23DcnY5OZU2Eb-r?MxZKfV zbGCoGyR~7NqsZOp@|OT}S#RWP7ib*XN#<493zxW07HuA3U}}>o7sr}1rD>}f_#R3~ za9;>9Qt!}wh5ME>CFNK3nU^1}-wKGF6`hUwm*p;40-zi!lh*%4 zuOOoG^UFiXP3W6^$*+|e#MW036NzE~<~Pbid>qzCN;RuCy}%N*sZs$-F8Pq2m9P7H(nX2 zv^6$X^|tjV%y(S7ednT~G3=Q%FI>gz+^6<2`5am=w1{hU*19!q2Iq)qkjmJbSM&v3 z=)>5nq16As8pKEMzuJ^AFWQtCS+*&WSiQJ^!-}4qgz1Ju8cO}O*OP{oj0}WO3lf%gRAWcDfwoKV1_Twq%;FV zy7(csY6vI^z2+oC7EUz+L!4sPGlvq%+t~024&h|iIZt*iLr0*-n)3)eh`Ig;l!!rFFSIfzwDeNnglwI2vrKj zXfBK?c~-txMG)iMU6#TCxHg;~;^`$rYVn*s1F%i+d)NDJJ$T43; zkKej()v9&)Ge2sE@pSSVuRwOwT7{@o z!ecDfDUyh>2yppVtLoichG+$8ov8$bzil8!u@Fj5oD>_SFu>!9pxlJ9cmUN9E|HRm z8UDC@T&vi7y0o)4gg1ATie_)&LI=Xsk`|!bAZ#_8NzI64`yG9o+8l}I@LqnVK zXWnsb;m{USiD6`6+2tEIUJgfloZ_%`Y2mdy*!SWKeckbRw{KxQdDDUw_TjFsVf%^& zncQIkcdS#~!kZc~*&0evmLHqut)rAwaNPy|$OH)l>_PI|0YH!&1aP=ZXiPa`N^waA zuCTn%ZdYpYgiwjhh!G+M+q`CUbPfJi5u+6J433Ss{9_CEA3A=^``&d6yM4uoWn=~a zNbUi%ENjSc0zkj4lHEix<6FiT?be5*D%MVSW%OK4GlJCl>bj ztVZV|e3j$^UrK5HTL$4>Ms6N%`#fq8j&yQC*?~@* z-2vl<8)tvRx>m6I0}~sQKR!5-{P2_P{=x6M%JTCqL#&{{Iunf!=9QXA1-bLz^-;Ru$haow9rTRcMLMr>2dLAT?Xnf;?xw1EuHW!&kv2dx+Cc+(yW>x#@S+Y4_67G>-ADdino7#ZU zuxbWZldETxb?Y}!?(1xmqch6d4a6SGFV|uythG(9nNhZi!ndM}x1z|g@vW44EH=4m zW^&9nl|Y$WW+oH1$?Y@Bj;-T(2yw!fgk*q0?_dupqxbmkd&Y0El%A_MA#&4wJNGbR z<1NdIiada(HRtEogvx6y`DSyzr8?Nu^=jEe^i#(p*SZ!Z%vEO3J z54nq?)&d+&vcMV(de)m zOKY&C&&|sV`)qbUN|qgRzB$)dU@fV}V*mb&hAUR)5>R*2vTrrcO}t%tYVI+sIk3VS zeh1N96>tBqW47%MK4#m{p>60;TN_wvw2iOzM`NGaJi2G}$f#~&>IN`P?G2;E4Sl0G zQ2A}PsjcX3$iLn1VC-@hpv46`n|nM1WJ3JP9<*8AjQRCK-k_-!e1PM`FY)A(gFX58 ztt&hpm&Ia+=2~44QTXR9pi7e}#XFkhc)#=y(if%g z%`H2|AUno{?D!J(U6$;4Td|QPGn6GIJgn!>lpFh7c)|O@X8XZrC-#p~Jx+kbPV6~x zR&1b6;Vim3m2hW;OxbbrB7 z5P_AlL28z+lHM(S6eq||Hi;QjLnz|f;(UyP`Fs?Vd`ygjQ(L6H*x^!wC4A-##^#tb zae77oT-XFG7|fG(Gq?gExB`SB$|G)@te;UDo12Jlf7yt6ve7o#Fr%y#MXZb|wv~{m zM^}RBcdeXHuj~TT@7lBL$SyGbJz)AJ_w1sVH|@HIp02b_U611C+oq1aEz_%OOvppN zDlrA^X-_Wztz`^>AuEaUR+}M%N~AToZ9z6F6?TiEoh&gX4zx3?CT=#~lF2MGp+q%L|7OP*LFQag>d1 zvnx2qarIg(ze#~M{r|vJ4olEo*dE2HJ0FO27PMB1M&UN7R`~$8MEev;PsS`^lT3x5F%#xJ4-6rFay@WZxZR4?$_Lm9SU~Kl zcW7gTQqnQzNQs@a1X)>;a{XJROt3fAloC=tbBUC8G=6N_9ib0s0SG(WsNkgq$!4CXtYr=9xOCOjDo}Ml27sy%qZ*S72)4} z~aQP5X^yapTn-zrn6_K zbw3|FcX|c#Jb50$fjrNcB4?ZwpJgA@^5iuq8yVT9JY@O?PQyu@WwB{`g|27p939;X z?6_*wvQCQQbe&p0LkW)Jg62Z1!~2G&EkfJRKSSdm&VUM(RJwv`fvVQft#wA{Ftv43cb?PE@-cVs-SA5NC{g|#g=Bh3a#{8{qdV{&A-CGw5)c6}~ zb(~(+I9GyNw^+%`XdPb~X{}2Q9)Ra6)dAkZ>eyt>8O0{HNU&lN00Qv4X)a8+h#UE| zwwjvf(1!BtVVvSAHR6NzM0D^WIi~2vDL8uDq^z1UvrJu_ zCp7;Z?jKK^7EXckgww4ls8HujVLpKqb7$Z}qMkNvnZd>eA)@fpbmAX1?Y2yt_~0n_nNx`@l&v zD+hk)_p!S-b_O^p;*0DZmFIsce^A#1x!^-f=Sdy#mdNc~Ks<+Ys!%C>mh#VX{@J3o zKg;mVO?}j4$;3@@gv5xwUfS2pc~dDdQNS*CZuwWVjME{CgL!OIbx0M3CdW7Qvv#zy zZQnZPVQEu2X;<0Lzu3EWZEx?IHNAoI@<1RIIwaS(%zmBScfoCTdf9O2$nxbQox{sk zmPdLb6&3g>Pu?fn+h?*vDWxv?HzTvvef!wZSAi)Z8nF)W^;Z}yI`mLmyQe#3=EAd?SFr;q$D^REG-RI z%)Ztx+h-e~v=;H_F!~hnH1DP~J1Nc1)D>hZv$7NH2|hA|sTr4y&)mHQQYX_{gX!Wr zRvUOYfOk$HQc#u-!BJref7>KADU3^b8f-?juQGC(d()h<3{tkwBirQORNg#)CVd4Z zCDq#LGIWTHeD%aO+?51pWq;*Iqr270L83m3OJIjV>I4<`4&Hut_m_X9y)8>|v`xq? zYMVF*5mR|;FCwE3muMR*6vQ9f{G+A2lOBAC%vIVoBL6#7+BGPWpxrwsoR;~f-Jkza z@=knYWDXyvPvYkffSYEN+qt(JW_b1sX&T;dnDBu~_BG7-Vf;3+pPhe@$8=0Xry_hM zc+}vm7-|w`SE1JPSqJ_|@XHIszHdSlck&fh`}3bCrW4bfA9w(?&U{i50)BGXsWhuQ|po|-~l@YC`U^r;%g!(1;ssnV&!ca={_&j$ z4(xpNcd!2)zDa)?L7(qJ?FyvL3eLtBJ*;g&Ywl)QZuwdB65nqm{SSH?pMwoN`V5XR zdEyEiva0if!H$U)7$2BUogo4ms7+Lk1fDh>GCds_sZ31EFT6}gk|tky83%-B)XXQ{ zuNX7-t5e-UA}Pyxk~fs#Ut)|$UD0w1aCE{rqCI9(>&BP(iuV?RxVnW)lBhYdivGl?9t<| z(syzk-)Qe^=YP+>hP@DYbt#gn)vKJ&b$PTUwLPmkbh6EjU0sch3%bnn8vG5h7(V79 zCv{vy#ucYz9Nc-R?V7F#g&M+QdhE+D!LJNr8zYXFFK^*`O2?c?&>B0WHd!T;>L8}L z#T7ZM!xTe?MYW3A{#~gGH>ee7$Es@TYpbhk>uai#d(+pb4{rspj~!=-3#hYMe|bZUQQ4Q3Ti3>|c~Kgb`H{tu@`6_9SMs;?1g zr`SaXWLruKX??@Vt5JskNTF_mcicRRJOsIstz-qWh?V_IUS3*RSqc}UsFwscJ;!GfyVRoSx!fTrK-z30CkgO^Hd*l>n&WYLP@pF<3185E^8?2N z(Z*P;v9T@&4->eSBwwtm@ly}_YpSSR4BhAW+BBorG=Mx#D{X*k?oNtH;;v3`+Ovx* zJN26IG=v{BF_Y67a4marFmEj%QK)Y&r#J$tia5qdV_MA!^r zvKaYi6KD{dg9d#4tci?r*iOqy<2JDvNeLQ?e9>T-nT%0~3i^v@I`|zLmIOwpI6hwoM2e01*rDLlgc#wPx&m(C%VKK`lNI0maPu>k{a_8)eh9$|j8ctXZrfA?Etg4BYv@QR zmY~gB;IxC~>EL%_7nn-2-J;ls9{$L&+poXHI6AU!^~%oj>b!uwYVGCgb{}ot7ztli zP+1!bSJu|-e&PeH`i@UL{O&hLhc~V~JhCNNc=?{|uTFkz-%(5ckhy@>hTHbGG&Hnr zZ;6rrYb8d*V`ysxmXn3j4N7d$Vrng95ikYuso4#({9d#eEiU7=sY>Z|80pnc+hjg) zO~j9C?sEjQB&=YQff*%eOg7ZhT!Hs+j~b7Rra7Q+#9Ib z)gA4-qJCJGOMAjY_iQ%v|0f9J0QiPzXqeX-ZXm-XFMKym#zW-0AIc|Amqq&aU#^Kd%;%iOc zyXqU`6YVXl_Y7Qpuy1~6&pl)6t@aV^)}1fPdYR3eACKf~7s-tc^H$bWSI2we1%)GP z+WKw2)!jSC_|1me%$wT)%|YIyh%ARJuu5GDDMlQ zM=qmDlTb2Lt%u_0-bCEr@%N5V+}!BwPi6mxT}`_$CkZGcy6R8z2sqv=El14fz=~m% zIysQ`n4O2dny2+u8Ge+}d@Tvv4VI}e*QiIiwS%W&#_5;Ay>!Y7ShQt6u_H}g;8l~c z5POPFTyeg}gBB;!Xpt{?o_-P)iG^EF3mf)C3an0DM6b`y4f{Rts&VQnbq2FJ{Ap*@ z?VjgpS?lu`<_?>pC4s@}#-)XY1*V88?DO|lI)hfLC%3?mUr-P$wN<#BHHB={l#^5J z_`W*`e~p~n9G~+)93^>qdC9NjSPTY(-{)Ii&%RK(z~ypzi#&^~zhBwma-!Y_d*0fT zdGM-$BZVaw(joyoG3u{e#2|+e=^GSrXF+aD!)Kn#?|cH$XsCInDon?t?huzF>1d6l z7(`eDEUHkUFkEsGHzdv@N3>88Hq#J%R;mMaodnK6B0H3=Ic8fEpB>xJ!ecjt``4}O zA6UDtKOBjK@h49wUk3EuH(5>caB}_7^5zxGm#=7EJ~UKO)m(}HnyV^^7hhxL>}%{C zv~y3!N(tJ3DqJOd4U$@Qu=1>R(r2Y#!xj>Mi+sXa>N(pyG%+zWG`{KA3lh4}N zu#lh0rq%~}nYdkr#>xTM6`~CAc(8&P=^OSJ)%FB?%YO)a3#>h1vd6HWJxI^{fb($x zr_z}yy?z;uI;j%Yi4P(QtwfPj959?|fL$^&ZkyDufMB7Ra1b4aYOJeYeKqmwtCcWC zkdtI0d5(|Yceaa0wZPCjApa5A0akeDnPlM8BYs4O`^C8bF;L46J9d|b$7-Fy^vU4} zp&=t+z#$COaIQ_Q#z=3po1l7$MVa@aMVSFxZWnafrbvA~ogt9?qFkT+x%xx4mIm$R zWo6~|VCjz&iR6E#e^ML!r8;@Pd>5$I4LpBx03_fzm@vf#4?zC)B!`te@g*C`%tDJI zQVffQbeNwNq?a&d$K9`#H4X=VG5RA-NFE{8*Ny4G=G+GHTN{x|uaIx50pr zK`eNZjMi|@(c?>2{#CBQ|p%|30`D`ND#Y+(=a4&EVnHv?u zuB)l5(Vh;-J)fWo_l`l{oJ50|J_f0vsBe&xM!Dm-qKgv8O!`Dvj8i;w#*{j7RTooM zimR2esYRG%;Kee5c|Rd;CIqKrIuZZGY~$u}f~m;`6A%80>7<#*3}Uu{@ceJQ#lBZu z?QjHbE?-`r$A-Bj$2?Y4=vffWvxH>;C7kBH*#>L&_-ajWbmrx{kz=2Mz+u5b?O1ObVv-|L%evMN!;10!M zruaF+u9F}p^`y4aq=k7Z2fu9?-Ql3R!v_XZclUzwf#j?8iF)N|K+&sMSr8cr{8E^KiV-6pF}{fKWlNKvVM|?XQ}U4^*5P6u z$=@WBzd360PA4XIo%8c$kKGS;MAPo*e7P=soW)gNVFoBWNMEqmTYg}IVl7t~Qw z>nLU-#l%$v)R8wCxiG36+r-}Gm(u+$>U$NrVK%p@);A=#hh8>qWuBa zaTiUQMBEe+MBSMal4}uGU^hb|M6v$rQ=(%16}3%PL8eeExM5l2$5bmUJ}yEmv8iTA z2D62G(P70|$(K@moI@E+E1NhVo{#+&E*DhQ6Y3MCnL}x1(e{lc0e60Zxh_<`Azs?- zb`={uxfY-Asx{5qZZ0d!b(UJ<;mDTyss-*sUyj9ODkzv=Rn_Ho`;3+xV}W(P+3)wS zZS9XOEB5(eMe-Fa7>`6cJS%+5o0{*~_`%Ng{u1AMyWQRx>MDbu5dOEt%DUj>Z?{8V zsKmJaAZanud(_Bzu~L{5-%6v7X1CyU)7Jk`EJdWe2f`|ZKWsiF5S&UD5#3$quH|D; z-LJ?euM`U@e1i6Tp{wQ2O(a-)Okz2Uxry?{1c8MsAl@0+$Q?wl%e!X3%dSq|BS(@; z*+BB~-LNivg53pVtA|!3Zz6q+_C|oz1pRE!@2PAYRw)0S?lznq0i`0BG-PR#0$b7b zn&}Yxokn6bz4$WlFYvAohXXmu^t|#@*L>_@E5S;ZPi*QMsxX4Lf`U&o?hF6+7l;dH(XEqQVlmXpY`rR^kr@ ziYyD~-_Y*J$xS~+Uz0wx3lY`^DWJ%ztXKC?G+8eklSqgJ-3e$^@-wp^f$pK&-4F|3 zB6TVz6^mZo$;sLv&`g%tT;irly{V9T&CI_DnUwqHs9lf^zTmbeLc!p8TibXr7)m%D z&elkz6<=(sZ)d0+|Alt;C5PEmW4{NkvW1@h#^f++){paJ_hUsJm*y*;41c1z&$OV$ zGw|@E;1*AD6jj5nk>G)rOr0gOnq;#8lcrQl#*pk+ruR-JP(N8Vx>e=Kh*ggRXB5*0L_7G1z5ov&X7(%36(JS3~2^J zJExTh{lTe_G<2?|!$JX9MAaJ+6l5nb%lf2B#hbA!$qzQrFOJ3 zC}TwkdMcd^R(v5itq*97(K}rhwflLtO zi=!PCS029yXDL_=U=s{i@>gx-4-R_4Fa=yV2E&zm{(KYRVUsP(L%7)BT&S}6LHvMk zk|3XNAM6-leVs#{LpP0d?5hma?5sb0*^aA5<|jgd$oiU_5_@*a&EdwvZ^$*to1%?{ zXXNIeZ8cQ*SNhA1zbM_bV%-+Q*2@fm!qsk{{zv5-mupDrD5lKV;TenwcxoT;lL*9HHv{J}iiro#D~ALGvy^k&2%N)g*y1fN$3rFH zqd0icR6AVaoEqkLx^ckz=H^cKbob)L-G}z?*tu_HX98gK9SawB=qF5xoovCP9wYmV zVd0|LU)_~^=*p8j59ZwUKGRi~8wXl-$)$39iE-OD69JJ*rRqLShqPbu@x7}#Gz&g= zYU>uwWHXg-LVx)P*a3jO6rxRw792FHl$MK|w#iDa3s)15Otm6;ywyj^<1wX!UqOY_ z%wHxr69`Ks3=6zJNerPgF|x@q5QYZPsh;^XSdc&+I>d-jD3ELKP7(#FEe8%krYv7+|M zE&H$7XC7J5xiH*TJm#ENTs~T9cfh#j?-)UES4pk%J@U_Cg@{WF6p70)U_eO39OivawiXfv8hyo<%ZnET*Lfp!x2!V&;p-_)u8 z*RaaJu6sKyho&9f>q}NP;P+bkZ8UA~UQ@E_RL|feI2LB$5kUR>{2RJ=LOwj=uXkV3 zJ?8h9P*PXD?~&pTm6iT}kEBAXBJwNvv2cdSck z=s}1ag*$_p;UcdtdcXo!nOi{eX=4NnA@Z=t=AV;@Ai{F_ac}|(p76Bdz`O$**z~=> zy80(S+4akN`N^GQyT`EDUW0Svw~y^cjqxA%9I;c(euiI5mKSnrRc6cKHO4WyY6T%g zP(e5*n^D1h@iZS^jog%=)`}K9{D1geLH;J>99S)|wwV6n7r!_r>&9LlyNN~(!>IWP zX0@B7JCwGYkAO0Qc5PVGw`nq2+X+!@M%pD(oZ_pb%}A6)oH#aulv?qtHpVxC5b)QB z%FS=2v(sXMWZT8 zLn@m3hY{8kX^u2yXNTJT7E*IPcK?saF3^w&2I*LyrCJ$IuyQ^BIL5@j3M(A;@&XJ>2ciJ2AG-@j6UjMpL9PLt0jm};7Otqca!K#y<>g^rLI+XZQ{T`F zre};5{z-?3JcG`VYtZNDo}Dt8b1VG$m?`W*XMUa4Qfe)&!iKf(JFRQ{B_+8gy~CQD zFY8QZjOe^bk*BFBXT*@FH&}JWwp@L#eng+6$G`evzdul1>>F)2S2f#h2t+N21yO+B zq#rTl8cn%|9D7cVGk3%pak;CUc5^N>8TEDpY(Q9rL}<>ZbDkf=cqu^q@CT(Ql<>VL zsUO3ftMK_Qhy+s17k~#AXa<9Y__0v?!7V=8k7hh+)>uW`{pJ~HegOPO9LeHjC2D}V z6~#5c7K@F;W}s2vYk`fQJlSlU?4Fq%v`wwWJ-|@x#204Uqcp=zy+==)hGy;Idp@BM z;~kl)UyJKzJ5FYVOuTIRN)D`NT2ff|bOrY^95D7YQCQ2`!zMBKS@4SPLBz zf+Q-pv~cd(9WYxF%E-?r_-SWjQvi7EQV6jDnoP3X7$n6S4SpfxyU~05%(} zog*VAS6;rapulIb6kF#ZOxR>GOEjniA?47!~4SMwY8ki%Z)E-G<4>-=VCZm!*w zJZdXKv^rz5PUke|>h*d^5|=vv)<`!g5=UeZTr@YVhFQRB;Jmkt6F9MfOr|D$!Rk#8 z2hKvi?80dhki5lQ@?yi*ND39%p36u}B?u0sk`T7rCM#hy%?MmKVLktwau6??la$WlRUC}M84_XYp*i*4kSkT zuQgkHmzb~IL(;SV{8_#x=)fLZrp}QSW1v|xNTUUE2yam#;3hEHAi4nO1cT8h8#xSR z6Q-59R9>|$m*85_CgSz)*(%+xh^7*kMDp{^FTY$|RJ6GA!UuVIXU-s|d9g8L$pC3o zS$bydc%&QAV_Ektm4R!=ejn{FEG$B+8{w4+s|9rEn8GyQ)C}vhB6EW?hmq6M)CI3h zaw~>p=SP(>x%pdPgSnaMr`dld9Rya3Tsx(gfvma$D?c3muCDwpf|A25k>VWcdpB-) z1uN0k2=<&XR(W5~fhWg))HWC`jrx7zv5kv51}jUVC3N}n;*A6G=7k^r==Q6ZO!UT^ z7kvmRUzkfk~yLo<} zCtQ8pd9Qq0ZUE|@iGAjxJI|_j4#-c*eL$=;v42wU9G71}wA5X=^I7%IN%;*q0^~ar z`Yzm7D|sCWMEd?kQvaas%ef_mrt z`6~7&*j7yJd2xriV2AxRwE}0LidGy#yO!`f;(Q_@p+*(!%k?X#6#efiV0At;_$I$o9;e#?4G;d zeeCXQuDtRZ{B?GF3k$v73y-$62g~}GF0Q)s-Wxx4(|z~d^r;)~ZQH%?!w2{5Ir!my zyIG^F(C;sTtNQlV`TlUseDfi!D$Hy%_v<$yg7q@R%+EC>ajm&4X}e!j3|rj*lQikv z)F$|t<(T;D3TtL8IrFfp)RDm+t4hV<-G)GXsR z2_1|3d7#m0wMUJ3f~?JcL1E z5fD{!ft!;9^os&$7rEb3qogiK%ire-vR{&Wb4u%BUw1m49nsEcr_<$xvAw=52M8F@ zib=ESf$cOm2R2w|@){9Sm5~_f@m910w^pJWKBV^Jt&A7ZcbRf63Jigjiqy!5qZsGV zN-)l8OXC9hRw70;z;>cS(nVuRILdu3!?CFovzYA-XQ+G903*diI9g{E$CB zxGxfDh7Sy{S~W6%J|Gq==g%$2KEeLDdL*)R*@u5#7LCjcV`TWxzbQYYi(w3xNXr$Y zKqQ8uRjhJh)*gYT(I{>s*JiME&P5wAA0x0%v0IJAj9AnaYb_#K?C>B=Ta&`NAgn>O zLSq~5{Iv4^_fF}PEu~$RD|UzKYu^1+W(jmvM;Dgn|MJx5{v(8w1185BF3I;_-P@=s^|Y!mi0@njlLC~7<7$qB?cV1u!XozNH4 z6YRi+D9~D8e6|9$Ig2OHiziMzIXgYgA0TA}<$RErLl$1i2?e-C{fj*K;4k<;luQ5d z)X?pC*>92h1S!eWlAhI`UyS;^3-3{Cc)Ns=GxwxXzo~}ezm_-U%hZ1)1<&Hm=QH1= zI%U3z7Kr~cU(^Hl?X3KXRBKRTW_u_P_ieX5sr^%%g@&O-H>moFRLkD(P0>WccBNKU z!fsukZl&RZx~5y1`*rqX^`B^EC3`;eO)~z?*~-ipc|UXB0Nxz~Z%|Le>*RC-4Vqmd z_<(cBMbA%6&mIumpuGE6Y`zvbJ7$&Iofa;bh`mbWbzG?~4yEuhQASsmp9)?GD z{W9|-9Ufe$mdyEtlkeg>W|z#VmpLluE;+l+Tz2sKac-fx3Cu#{ADow>AD2L!GGu2K z^?Q`_C{mtiq@=1WNT+O0rR?DXjq+?HMo^^+PdQh~B$-luGFSax=LCGa`h5#*&r`l_ z{j6MKQm4FK{X~B0`l+%<>tD2(qzCJv>79=u&RMDi(>M#Mv~}vTDUoq=DsUM|Fz79$Dw)NvFs|8cPRsGbG zGwP?x7U(Kk{j@QxF_$Ka(p&?sev9;?vYGt&*69UFGr97u(~HWd$0MijMfKqn5yMCo zrSG8rg00_CdeJv2aU+HTmk+!?mNY$~gQ(JkdXvjCwLdRtL&iIJ0~j)bQ)uQ$^(?)@ zxlipk?HwGcp-F|FL}O~)ku=Yi4WKQ5hkIeC-m$9l4j+N)6!6ycO4Ik9^#_efRTyab zr{vXK{hg-oJL9Kx`gg`p>GT=(m!)-(Cs6#j_Q|zf(y`Y)`6Sy!f26fjnrWn=6$8dT zX~danNR^djXtD3dsGSyR!Zb_ZPiU@>B!8o8gCitzI*U}#YpKY(LaDeet|gM8{hWjZ zCSOcdQghiw>leO;d0y0M8am{gprcwR*lCcHa0a2JiQx>bTZ9gSydVcj(-k};v|T>h z8RaJM6o|h-2c(3~N*s*;r{$b8NT5zkP>T@z%+oy&-HTQ`oS#H`q)m<|rdiLK1ahU> zm@-yp`4gfJkT@6_fP@dK8ZT5X_WZdU<@KPmm}}n@b>Jy^9b9q_s&Gaqw_<(-ji~j= zlh;DzDl{)j4f)=K7m%;6jE3oY)B-v!s0w-!CAjWIv=DmlX^?_+-^Ylugbg9IW1>tlSuQ-dK$r}lPEL*Qd|D`FB(ttTzsKlWDQ+ph><||gbL2IlKY8Ap-`^*{gK2o(( z&T~4!A)GUFY0XM}Dd+-<6Hk%D5=cXgA~=;3K7&{At|r}6+|q-11nMWSi@YBCBQXrM zUL6IzZk$pm0d))!tB=x5Bwgwa9XJ8CqqI0>h&YW?4Q*2ShbTw&qwWTF zn;;)Ak&jMZVwCeg+(GfJX>l}2&w};o9ntIR$l`6%Miy!)|CIU@jLoMK!P&fiJb&s> z)DJz1x`jFAXatk4gLV<|lH4|i zd4qR#Mvtp3l9m&EEK?ro8dD$g|3%GJ;_~hjODl0H>4^vU`$S_qqR`Y<2nizEB6wA_ zhErT)S#?^Q4>Q2N~ z?(QOF3nB5y5PY@O|Dd0> z>?;$=`Rv7sWJ|JTf_()aT8sHC4XzvG2*_Q2=*jFQMYNLG)FY=C%$Q#NH$%qR&j(Oc*|velp@l7yJ+c|oEijPw&? zmTyK4o6#;>xAA31Bds}7c1Nyva0wNH#h_6&7x2=_T9VF(Mmnbt$x2%2AoWH0@KJIW zt85r3)Fn33a6C!$G-^r`jYf-Z)$Dia3Gu-B_tO)~ot|8Chjt&)9k}1DzTqW3M}0$j zB=gB5Ns=}qFYsbUDXcbK3VSN+$y2i{wRhz1%qMd9xi6=lkk*x|vpju{M}??-oAE@q z>c38@?<6wXnV5Yry7^lc!U{{W|U|4jOo^qTaB^ats`r1Lm>-Nf=( z0doSa&&NtJtfQ<3hwa5#3+rIrY%%L+Lu{C>X6x8S>>zGqJJ?lh54(;XWH+!Q>{fO= zdoO!GyNBJ!9$+73A7_8h{*gV&K8;=Yr`dDti|otnU)k5$H`uq?_t+2EPuS1cuh?ts z4fY52U+lcBlTC7-Tp&ATkL;66<&YeeYvh<5ms{ixxm#W=_sc`_u)JDchZ6@jDSVFm z+kEx6`Rczp@BVFm74z!<79A=p8~^t2uZ04%&U>f-pDTLDNfV8K^@+9l>a)77e_LPu zZGH9MUnl-=$?3o4E9Sv@^BVv5@2`ad|FrPBcl`gk=sQk&-NL{6#N56rPjh=cw|fd( zt!@>0TgizGDcv)`2?nr$~T7x|gwBU*~Ldj4Oh=zVIDMu~LYxkXz} z?Mm?7b6!JUOTq@yTCZQ0Ro4sJg1jT#X4?ofy*uGKp(DgUEoKQv2ub{;2N_XQI0!x1 zNc(NDn?HvA)btxBoW(89FVgU@RU8lQ4vqj&1U#v*vr{-h2UsYmYFK0kTrmL6CMe%A z_9*rISEVHTtz7;#HTf#5NS=|)lV?zqN2PDcMe zoKqD{6pLMyJkIuwyz`yqlb%Px_#ll(Hm z36X|}^GzIvoqo&R)r2>~H+ecm5A;B_;PJ_ja;TKtnx_(ki62@&ocqu+qn*up-rSe2gL# zm5+#-e2$3$5FMPZGMTR)6EC9fvLZ)#NQoK;k{JfVV@TMRCHrb>>gsB0_AObmubQr^ z_brJHmz0#2mXr*~>PG-hQd;64S<4?>ka&GCP`bLYadl}Rn7#r%)Aa_Q7tv96YLz)w zkCciIyttlo)@RPL$=l%lh~ul1H)2;Q4jd(;Kv6(%l&QVpM2L=)hKA9}Ar*|VsWPyp z(>67aSTi$TIXig9kP%>$9Xun~aq!ZH6~1CWT{Sc;2Y6g^%H^=v`FuEg$K~W#bq>3W zU0K=XCfpi#SLHxeH$pBDXwzLafY@LJ2b&QlJWv!e10N{Q9O6i^hVv2m6T0<4I$bW^ zszd}*Y(yZTcw-cMMzP==&R2{0E<+Q`v>zNPfI^a(gF{F|LIBp+h`>yXmt*}R5<@*M zEGkk&k*jU8>x?oaehG2Njl}4D>@o+->tuxM(H?L!?N)neui71N49EtAzF_~^ zP5a6`5p5JVVs{zX0DNEDDSvE@oL?L+O8%^&x7seR(HWf;zTQCFnwGq9yxei9x-afY zK3!8Wzrs;HylY|CM2C;9&-awM>_r8pCkx8rA~;1iBy3S@Fa4wxuVh)ZI z5d#qoAs#Z!fetwRIKrk$cphvF_8<%`#bhIlVTz{oiYp9RgiX?kY+=l3I4;Jd;vsO5 zLKP7q8gjxJ?(stwUu$zktHbGFzNO5E@79XuR-a`IaBljOUUy+@**M#he0aR9wb1Q7 zDbR2UZRH8@br;Z+jNLsbUCcsR5n^FfI7~vp8m3?{#bpdrHC-{KOk9-#U`bpBV?dsm z0+==MWt1v$uPUb0h^v~I(ju-}V#)%Z85EX`uEgm{8E_6N zPN$30<8nsePQS9?X}Qh!O=1+>$THWqqgWphE12QT%`SiA;z)U8(B`S>3imJ8&wpU4qpZpsw-vkc*prd^72afR zsI%5%4^(Tv}FIu^ItT)`#TwB;?DfW}bMV$L2+HE70UOUZAf^#{rr&e1&)cACk z%K^K9> zK_#Gf9R^RlulkUqJRZ(#S<@Ei^;I~Hx;3)By0;s>A3wI4yJ22_hu>CD-+e*MLhwNpwez{?|CEyIjaTasFr=~M9 z{_P0f&MgSkl^S9=i6OS`VE;3f^MeHx6Zvn50sk7#qBSwZA0R4{NqOf#Ay4YeQV)J$ zaxr=09-ux&L)y0qap#2M(}J@h)$b@kIy{)PTbiT5jPkSqFUsWhpyl%T=;-sYd+N$U z<>BoGORa%WMSghg_H_|+xFTR3D%epGDlem z+xNBG7HoL9XUu)9Xli7w{gg#VElESYmk01#Y1O9_O_y?|G2@iA9s&0hiyNd_{glcMflr zOA-Q=?K*I4OG}roxjEG00Td60vdO9ge)H|4qZVJ4{}D%##c=fTM~|A_!J>!VMOJ;{ zo4V+1Y4YRY_E@EJSH8y=bUpptbI+AGRh8TJTK%OJo?p;-I(FVFw*c$Hz$6+X%ID-J6sly0W1*c~T+RCX zW@~0^44(we|5<%*L|3`tkHn(#U9+`)l&p{aX}A2PeoESpl>dg5FNmDr!NlV73uf|| zHRJX-0fQ`3=wzfoUb(UdP`y~yBSqhAt^A5e)j!*@d$t2F;6Ivdv?HwQ8<6HCPeXadGSg^^Fi&#=y(w($@Bk(^8SD{O__OVX}F3- zd5OAHUd@?#X|tYaU#jl&c^dBpv=YDpwJOCq_`tc-?@y1rmKRJE=q4s{2x2kn1mr<+76z$oK%$_9FyRECa;oSfRA)E5JWtN= zJ{$^EcXfsJ8}*}CUb((Iez>%P&1dyH=MP)FrqWVpS-2{0TE1eiyS%N#>@@}|%XkY; zuxijPg7bt|Db~7Jss;RPWUU3fpNVdul%hA4A{Br@Ihp`~_^haEDL=gfK*4lViP&h$ zfG(4oBzV;^$EheR*^MAvPbjNweD|1s%uw08q_%d^s#WuATk9KY^&1Ui6QjGEs$-qo zSoPq5v9=;oZVQJ73d>yO#bsgRKv&bCt#Y2;p>M0T4lW_7cn{iCts zScgn@3Q$9e()huXpPSg2{P95?74XyKw{E_<5035JvL||#&}EmX?H6Tct(~%Z)n((| z3CK^70)5Qqe89IlREnsRz1olDx2&=t+q7#FdaZ6@XJdW)X|^Z%>%*ht30B>+-q;ch z)p)DQlYLh&?rZ2=4oaM4HQ=_WF$e#jQpEw7O3 z)?;bUTbehPcV*t;ygT!Z69l+X0*V1AuOhn>HMCJT!O;lJkPG|tip`sLZ5g#}$*FE$ z6g4`#>$Z$+zOuWne!+tJd8}s3%9E=v>*_3s`WG~|x{FpWwk+DvS0B!aHZ(+Yq7dYo z94Nz?7j=r6pF|<(&AV0WW8UHDV;bH%;y3gsgPg(g8)tu+n4^68Q1V6gfx$I}tp5H7 zcQ0FZ@E>lYS^A_pMoZu$+y-n~sl9{frU^<>)Wy(p#7+T$2NsA;#X-8900Fcph4BEr z4_vu0@tAF@HiKgPF!!`_#Sf^*;LJXn%##|&1ZKlFUAwk97LH#wHg;J&T;II*x_B%W zr&AUOB9VcCa2Nx($6D8hF&c}ydfHnTxuP-r=%}?W>SyzO#in-|pAb%Pl?wyen)9Aa{C4!PorEt}*T&I6nqlIJgA63#ei zM*=Iu_3~wq0|BX5VWnL6#e@@3+u=q#+?ok7J+nbENS!x}`s2hfn1u+77Um4#ciB~N zHyEu_0t?C?wSdj9+tldq2(C!XFB!f3ksI2sZb$@5H?HaGW>uz~?U%1yzHIZ6>sR0O zsM|67r9)jyFmv-d60(b~6%1`+r`S%cWpbrSoNiZoMrbb=rg@6NLvYSC_onjs%q8== zE0yN6mrS!TmF8)lCSR@3RIOi6rF!NqQY}xV`rIYUyFHcWpXN+cB`fk}A`PLy z$%sbc{adg0FY#%a;M217Ni>z{-%722Q)j^iYsf|bykXw6l>%irbqE}t6DRsvfCKSy z2CQ!~V2O1X789Ag%6jTI)CBv(Bg5FfxbHnRTWXw@>mute3lxvHO>BS9;hrP6H#NWM zboLMIUc8t+G@HEksJ#Hd%ENsJn%WQTx@On)LDJw7=g}4&_1_}S2ONu!`nWPSS(D-e zN<*{~X;QShC=KrkhNB=}nC5&{nnF^P2?`NrAr8L4T*WDfFxy;Meq{9o7FvYxxk}?w z?R*zHjGNC__=3cuDGRW%6#Wk67|_l*X&W1wV@Y`oeX|Cx{l z1JWvAhSR2bo>&2;)Bm%q@N;_v@0QV-k&5haVuXu%EX(G`51}TDHYl&?>>R%xUNG;&0mQ><4=__s*&)FspWf1P~`oLohfcRl(s{hIePk4ckvLNd%u zlF5^pOlFcy2uYaCAo}FnV#-R-|oqS;06Rl77$SbxPS=gDn6Enx}fMPD66Qr zviN`xSyV)271;eLK0b*1ud4f~?jHE~eRF?vyXw@bQ>RW36(Ivk7~S3+v!Ktf{VfD80O z$qPnKP@LN$&!JWA=NJIUg{$-SO8O_qyBBE+02c&!#j@%wdLuryeU5Iz?)aJMMvSWM zJ87f0m7BvWM$ELlIwR&C^2#1}`;QzcSQ()Ie38yoBSr5U7%3Uq^Tp~x?1Hm5%qmm!~Zh7N{$pI2k|ry-~8Ise91GD&iw;ECZC&x%Vdn3sElF$6mr)F ziIo58(`bRyr_lx%Yl8$_9z(r;CFho-_6WIA^?n?G7qCZ&zmNFdpt#xtSxkcjOI0Cr_0!IuUa9u2SZYiS#pSUiLJGW>!aF8W@ z>$*7Z+@j$e!w6|{IFchoNJxy3lX8Se>0pHT$=SArh#DdCEIwy$ad(Y;wf8fznmr4j zxMFNPntX}wn0{Qm!Z$k8CQ$gkySxK#F) zFVgjDG-%R-b3;)UI08=Tyus(o(IDX%4G%c;25g`_{4cYyl6fNrZ_rfkBPgksyfbrn zhB1>g1j3030gQyOj7b^mC>po>C@$7U=Mcs#^o#_Hfu{~iF#+2kT{}$D;#~6 zcq<$+ugYfyXp2%DF$NSJeU>Q25v{6l^jV_*IT)JAF`&2>V?bf)vqUK+F$NTlK1-D1 zh%umW^jX5gS>j2kWR`eRjseLF#y}k`V)R+QWR`GROLzvw3?UxEBMd{qk4HH9$npBLH z|Bsq5-=Q}@?$tz=C&$zc_L%Z!7+3n3VaDYc0gfC~SF0HYy#8K}DGA4zx>U_DfU6ls z;kz@8UAH!}=>axF*h{D}RWidkt@MD8l*}$FhBj+(+H93JxHSLTXghnh(c15JZPt0% zu03{n_F$JFgZIZV(uxy^a4xPofv8FP(QUK03M%)=#8MIGhKsXU#0DlpVoZpBt#xAu~GtSuP4{p6WjZ@Fx+H@o1?XTwo3t8aic<=?~Kd4Rr3ZbN_R{@ZeloMqUp zA^w1TN!!5|trD-jR`#?sEfhveu(?pXz3psu6I;0d>uKFO zIMmnLv+rF`(T218yPj#A-x8r4Xry^w+c%PX8H@^A7q>sMu7~-98&`jK&eFCJJ%Ex= zqvUH*GPaFcnuYljHq7zdjNc9xT-77Cm)luOlX&Nbmv4(sZ`|M0+BY<~wY6ve#?Ra) zIOy(OT(@BN$^9p2sBP(-@2=h$^s}CIkF+mt4Z%L*wia(@>6W%7vt{Va z1EJdH>gQvvwc$`*bL{!*mby@1{zJRAT{pRP>*RIYc6}({M{i!AKe)Q*V1C2O%>FfN z_GjQt=SldLe+B(zh-C5hp*lAyb`z>=?;8QL@G|2pNV(4!zwn6 z1N;!{Qn4=hV8=N%%5Zcqe!6P!9}%;&Uu-!*miqB*vLVHBB4Q5$?;vaxA$IpL5jbcT zF|>imF5X+f+DcZM%Yv48C|tF0(V`QBgHsC@;OvY;UwTeoQ)5F_ zFi;yib5Ct`^`f>1*BzSE9*?)rIk^7J%j@>fX`k~POb2H*K3x^TQF2w0$l~@R?Mraz z9MlnMr}l|P2yetcI*Gi85mRA?75R2M%&`wHPSX>AK0Jwy+hISvKosmSoJzy9gTe{o zEzKi#xC$O4ertzAq=DAj;RtD?^Xzbx)YA=ixSGtPyXLfp$;2c+QagrW^ zCK6$ayuY`@j8xOV*BVP z>~Ms1^SkYEl+5Q2el^+3|6;>yNuy8r6cN1D34RtQmc+N@CXeUSI4LbYlrrO6bJ;?? zx0pAL;~By!m)06RNYcdwr?#?4$|v?G%q z>F!w7v1)B+r<=coU_5Qbjd&q%B+UsUKOWDGPG5^YV=A4D@5p71LdwX-2XhwkWs~K| z)1ajag~@g2oOAT((T-8bW<-jnBaxfX5|W4W8YC^mQigm^CY>;|mI>4A1Qcu>&Pj4) zk{l;_l7?H76uN30N+?B4{BA{BRziA75f~;h@Vg8t1Ar$;2SVMXlXT%=2oc^)GPvRz zElb8sxH>Tbox(i{Op$vMlnPL}qJ$h7M9LT-8I+I*#SZ+7Ydv`A1%4c%%3OHOS(0y` zEX6`i1l4#6ojq{B;y~7;emRt$ka$yocgYevFjTuy(ge5|2Q7g!ij)i}jv%E22ZxLQ zwUW30H$NUm92A5s4Ez^RLj!U!WjT426h}#;xW99`_kqF`XeN)k`z{S1qS4q=UASb7&i#L1&@^b&*jzi_WI)=ve=Omta4H$Dc8H?}^j1V1K`o ztfF&a2Q#1a&;@iM{QSH~7m?L;F#X zXC*rE2J&BY6)Y)w$hok)SwmjJJM6WXWj;vP5gZGEb=bLdBl!h=7p$f>(ap3MeuDbQ zr)WRjO1IJNbO4X<=h2QDMVfY!!&=r&`cWAD+(vJQ`q)A5Ab){>qdUoY^y6fwR6tYY zD7_0FkM5zLAm`Ihl3nzl$Zq;6`e}MEb_g#Z$KVO+v-EQqQYWA!FU4tsC+X+m8|gl% zlOZxp@23yY2gyFXVf!L^gZzqqiR_2hq=)Fk#SftMqI1U&%po z2>WQ?z#hwE@C9`t`5pN({U-euxrjba|Bd{b+)nNw?xYK3Gx&8 zU-};XKKUhmlKz0)Pye0%kUj-}Oi$Av(I3Mr(@*I$^jY|3dXD~#J`WE~FVLUUU(jEY zo9T=6SM(+NYx0luH}tpkW%zCS9sNCh1>T!pqyJ6+2R@wsK>tWzhbN~$!{Y6)@aOaf zeUqMnS0}tfyT5w()7f`wHhR^82{ z1y4(Du+E!_wbUQUAIR&h2R@|Mu(g;3YRLoSLADMST~VxeHj#IeOJE6BMIOic$4|Zl zUs+!uUu5gaH_5li*Wfkl)8t+}eO*Bw#R{VacIWL_dHKlQYy+7K?`ZY#%k>C+as38Q zXCZPmxrUv~Hp0`^`{1u?6Wh#s*%nyUz6zgQ50TfPQs=-b=)>eA@XYlAau4fc{cJ0| zT5ZS9=PmpW_*S`N(-{RzIW_OJ`cCow@9 z!SmfIb~(F(y_a3du3}fS_pxi(`|%CkKd|fA_3Q@r0d^z%AiD`?seYJ!gq>zLvs>7$ z?4$T<>Na*eyMuj<-N`=A?qYYdd)Oz~C)q!-Pq9z4d)a5$XW8f2=h;8A``G<>tNI}O z0?zjO68jhS5PO(?nSBM%m0x9FWB-a%!M?#BWsk9MvTxxWuYY6TX5V2?u#ivmdgj*nhC6Vf6Q7_7nC~_6&QL{U7!m`x$$l{U>{Y{ha-R{gS=Ne#Ks5zh=K- zzhy78|6;#mzh|$oSJ`XqzuEub%&Su4|AOE zhvmMX2k>U6iidcZM|hOScr~vfPw`q_$Lo0mZ{#22ck(9Q%v*RXZ{sugOg@Xx=IwkA zkMpzmTs{vwe+&3RzKAd8OZZZLHebe<^A3Iv@8n&)o3G$2`6}MSSMxP|Enmmi^9}r5 zzLCF+Z{nMIFWkniO~e3VE zPxG7kE&NvgQT~toHh#Nr*YM7r!Oas!BA?3!Hjm`ZDKoe^H06boi# zOCp_56emVA=CSaWWUgQ&u<|Sf`Vt261^ey%{W5>J-$e-aD^h`ei5S_Yk=f>AMYmz) zJ7FlAk?kH%V4#rBB+cM}O@Bb~H=u|{c6gZ4^E48Hos#M3&Jvj9Ah1g%?b4HWsaou| zOW7?;iS14mQTu#xB4ZQ_fkBmTP|r80NbXf4+N*K1S3|2BN|?!XCSwGKBz|;AOAHLF z8V=iK56iOs!$R`0VV#5EuwCo@UO9pNV|ioB4D6R2g!U)XCZ40xR^*_Db5P+Nk~rZ* zuGE8@`xWE6t&Cx%WEc&a&lv^Z_7Nk`26p&%0-N_|$9zKo_%~-JQ$|?c3wQ{#e7$DD z@NYBFcESEhE1k(@qxP>#KZJDNUofihFCl(B4HgXF06I`e+$1n6LJsTx^Nh(!11&f) zk~G-)MYgNR4y1#-C(@#aM(tmjkL^kG!Boz_H$66C@FAlZ9JZOTe z1^;`jba?lKIi{H4yHgX9zQbk$kF6OzSB3hWP^9mK2OV&r;e%;6xWi44?DQx^c6s6G zkd<p%ZOgcq|2V5S*18ytUZA+QO$wD#j(hVB+*fx~*GHmT?c-l4L4cBnO z9iV}v(o5KcklNXl`NO7*5HxM=YD&b&m_}yI#fpw;`X-X{Z~|$id(t-jwBj#q>zTtI zW^`O55y(hY5zUmqlq$@sq^zElRkg_3rQ~EOv7D~k0(q4$ujk7vl9o)0SQKp`%cCC+kB$xZ0ng3!0n zr(;$Xk~5}d9rhbi{mQ%4Y`zibQvaAxzy73|DHuW1)_?Y|!a4ygj{hqBONhT9m2etb zw@%!gddb9)fXGl(PxFsUwVY9EIa_4M(!rdqlkH!biRV+f0LIOP(dCyvya2siRD3ns zza<6MlmVl5T#=iEqE6r+1pGOnti$rISanB#c*Gt2;VCaT<_05Un#M}H;BeXv)}+l6 z^%qWis#8ag7nvQ=O)#I!#w|gj^QFlP;rS(^H+M zr#cHRLa69ysOn;=>NGvoIqoUKNI_Gb2~Bm1HG!>OV^)dkOqHw70mWv${Qs*}rC zsYaX_sgff(F)p>M8<6B2I@#I4E=vert5?gLswHUI;Wu z{Us(4Gii+E(48knsx_U4XxLVH2!@o}lA)|=iXHb&QDG}Gnx1mPQ48&mwG(2P z+|wtp`D|pMYhp)=xq{nHA@f)QLp?c?31+M#MI&zpvc(BAp9>jTpk>Uo5i4esm<|)U zya}|xL^_MdgaCR{E}N_Z*ZE93YX*ziboUBlG-TxSxuY3#v=Ee`;$&F<%DsP;n9Lo` zs?bQTkm3`?t}qrKDN#Km6HRBq9EcaN#~(3|6w^~i2IIsGiv%=NW~AWDr1M5#60Z@k z!0a#PbAG8LVvg)(EC4B+xlzeiSJ�X%#U070je6x;UB4Mr{t0*%8aE&*a9^2_u7A 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 BoM`|6 diff --git a/apps/mobile/ios/Fonts/Basel-Book.otf b/apps/mobile/ios/Fonts/Basel-Book.otf deleted file mode 100644 index a29a6258ac08d30eaed8f4f9a4cf4e5b0079caef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84524 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 bCVDp&?Yjx>QH8jLkV(nw>z5^-%b5QMMXG{j diff --git a/apps/mobile/ios/Fonts/Basel-Medium.otf b/apps/mobile/ios/Fonts/Basel-Medium.otf deleted file mode 100644 index b21566f1d20a9c8af54ff4d769f45dabe7764268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83828 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 Udeq?B66mDV74|EW?`6#Y0^fwXod5s; diff --git a/apps/mobile/ios/Fonts/Basel-Semibold.otf b/apps/mobile/ios/Fonts/Basel-Semibold.otf deleted file mode 100644 index 17b9952c58c9a5b9922a99bb6006294bd9ea256e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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-Book", size: 16)!)) + .font(Font(UIFont(name: "Basel Grotesk 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 ce942e7b29b..4c0611396c0 100644 --- a/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj +++ b/apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj @@ -28,8 +28,6 @@ 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 */; }; @@ -111,14 +109,6 @@ 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 */; }; @@ -189,14 +179,18 @@ 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 */; }; - 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 */; }; + 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 */; }; 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, ); }; }; @@ -326,7 +320,6 @@ 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 = ""; }; @@ -408,10 +401,6 @@ 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 = ""; }; @@ -448,6 +437,7 @@ 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 = ""; }; @@ -466,6 +456,7 @@ 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; }; @@ -512,8 +503,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 = ""; }; - 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 = ""; }; + 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 = ""; }; 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 = ""; }; @@ -706,11 +697,8 @@ 074321872A82BA2700F8518D /* Fonts */ = { isa = PBXGroup; children = ( - 0743218B2A82C6C000F8518D /* Basel-Book.otf */, - 0767E02C2A61BBDB0042ADA2 /* Basel-Semibold.otf */, - 0767E02B2A61BBDB0042ADA2 /* Basel-Regular.otf */, - 0767E02D2A61BBDB0042ADA2 /* Basel-Medium.otf */, - 0767E02E2A61BBDC0042ADA2 /* Basel-Bold.otf */, + AE1757572C49B0A1000120A5 /* Basel-Grotesk-Book.otf */, + AE1757562C49B0A1000120A5 /* Basel-Grotesk-Medium.otf */, ); path = Fonts; sourceTree = ""; @@ -1130,9 +1118,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 = ""; @@ -1431,11 +1419,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 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 */, + AEB2767B2C49CB060056FE52 /* Basel-Grotesk-Medium.otf in Resources */, + AEB2767C2C49CB080056FE52 /* Basel-Grotesk-Book.otf in Resources */, 072F6C2B2A44A32F00DA720A /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1451,19 +1436,15 @@ 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; }; @@ -2189,7 +2170,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2242,7 +2223,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -2295,7 +2276,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -2348,7 +2329,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCore; @@ -2386,7 +2367,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2422,7 +2403,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -2457,7 +2438,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -2492,7 +2473,7 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = schemes.WidgetsCoreTests; @@ -2539,7 +2520,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2585,7 +2566,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.widgets; @@ -2631,7 +2612,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.widgets; @@ -2677,7 +2658,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.widgets; @@ -2719,7 +2700,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -2762,7 +2743,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.WidgetIntentExtension; @@ -2805,7 +2786,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.dev.WidgetIntentExtension; @@ -2848,7 +2829,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.WidgetIntentExtension; @@ -2884,7 +2865,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -2922,7 +2903,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3100,7 +3081,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -3144,7 +3125,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.OneSignalNotificationServiceExtension; @@ -3244,7 +3225,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3315,7 +3296,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.uniswap.mobile.beta.OneSignalNotificationServiceExtension; @@ -3415,7 +3396,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -3486,7 +3467,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.34; + MARKETING_VERSION = 1.36; 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 768475b66c6..c7f369896c9 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,10 +116,8 @@ UIAppFonts InputMono-Regular.ttf - Basel-Book.otf - Basel-Medium.otf - Basel-Semibold.otf - Basel-Bold.otf + Basel-Grotesk-Book.otf + Basel-Grotesk-Medium.otf UIBackgroundModes diff --git a/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationView.swift b/apps/mobile/ios/Uniswap/Onboarding/Backup/MnemonicConfirmationView.swift index c30c1ef6be7..39c09d7326f 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: 12) { + VStack(alignment: .leading, spacing: 8) { 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: 12) { + VStack(alignment: .leading, spacing: 8) { ForEach((middle + 1...end), id: \.self) {index in MnemonicTextField(index: index + 1, word: getFieldText(index: index), @@ -151,12 +151,16 @@ 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, .leading, .trailing], 24) - }.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .padding(.top, 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 4928e043b00..4bae64c2516 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-Book", size: 14) - let mediumFont = UIFont(name: "Basel-Book", size: 16) + let smallFont = UIFont(name: "Basel Grotesk Book", size: 14) + let mediumFont = UIFont(name: "Basel Grotesk 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 52fd67a2626..70b95dc4144 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-Semibold", size: 20) + let interFont = UIFont(name: "Basel-Grotesk-Medium", 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: 12) { + VStack(alignment: .leading, spacing: 8) { 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: 12) { + VStack(alignment: .leading, spacing: 8) { 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 77ab21ef2ab..c5249737292 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-Book", size: 14) - let mediumFont = UIFont(name: "Basel-Book", size: 16) + let smallFont = UIFont(name: "Basel Grotesk Book", size: 14) + let mediumFont = UIFont(name: "Basel Grotesk 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 55781b4ef48..521ffef4368 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-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)!) + 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)!) var body: some View { VStack(spacing: 12) { diff --git a/apps/mobile/ios/Widgets/Info.plist b/apps/mobile/ios/Widgets/Info.plist index f0a00dc2bac..b18cf4bc5e9 100644 --- a/apps/mobile/ios/Widgets/Info.plist +++ b/apps/mobile/ios/Widgets/Info.plist @@ -9,11 +9,8 @@ UIAppFonts - Basel-Book.otf - Basel-Bold.otf - Basel-Medium.otf - Basel-Book.otf - Basel-Semibold.otf + Basel-Grotesk-Book.otf + Basel-Grotesk-Medium.otf diff --git a/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift b/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift index 7f9a46f318c..10a0145b064 100644 --- a/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift +++ b/apps/mobile/ios/WidgetsCore/Utils/UI/Styling.swift @@ -10,18 +10,17 @@ import SwiftUI public extension Text { func withHeading1Style() -> some View { - self.font(.custom("Basel-Book", size: 28)) + self.font(.custom("Basel Grotesk Book", size: 28)) .foregroundColor(.white) } func withHeading2Style() -> some View { - self.font(.custom("Basel-Book", size: 20)) + self.font(.custom("Basel Grotesk Book", size: 20)) .foregroundColor(.widgetLightGrey) } func withHeading3Style() -> some View { - self.font(.custom("Basel", size: 12)) - .fontWeight(.medium) + self.font(.custom("Basel Grotesk Medium", size: 12)) .foregroundColor(.widgetGrey) } } diff --git a/apps/mobile/ios/link-assets-manifest.json b/apps/mobile/ios/link-assets-manifest.json index 7f747d8df52..32ddfd86340 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-Book.ttf", - "sha1": "7ff6b3f7e5c2857ca3b39fad3ba09c35bb75e302" + "path": "src/assets/fonts/Basel-Grotesk-Book.otf", + "sha1": "3d74b09feab9de003c5ef7861bcda7fe9c8f744f" }, { - "path": "src/assets/fonts/Basel-Medium.ttf", - "sha1": "182bf31d0794296a034a2d13b50fffd804709aaa" + "path": "src/assets/fonts/Basel-Grotesk-Medium.otf", + "sha1": "b860c729d64ac027624cc52a059132211a1665a6" }, { "path": "src/assets/fonts/InputMono-Regular.ttf", diff --git a/apps/mobile/jest-setup.js b/apps/mobile/jest-setup.js index 3a5fff1b2af..f90703d2fe6 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('wallet/src/features/language/LocalizationContext', () => mockLocalizationContext) +jest.mock('uniswap/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 6966d851d36..48a2950d90a 100644 --- a/apps/mobile/src/app/App.tsx +++ b/apps/mobile/src/app/App.tsx @@ -50,6 +50,7 @@ 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' @@ -60,6 +61,9 @@ 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' @@ -79,17 +83,13 @@ 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 { SharedProvider } from 'wallet/src/provider' +import { SharedWalletProvider } 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/MobileWalletNavigationProvider.tsx b/apps/mobile/src/app/MobileWalletNavigationProvider.tsx index 9c799dc0b47..4e528667203 100644 --- a/apps/mobile/src/app/MobileWalletNavigationProvider.tsx +++ b/apps/mobile/src/app/MobileWalletNavigationProvider.tsx @@ -14,6 +14,7 @@ import { ShareableEntity } from 'uniswap/src/types/sharing' import { logger } from 'utilities/src/logger/logger' import { ScannerModalState } from 'wallet/src/components/QRCodeScanner/constants' import { + NavigateToExternalProfileArgs, NavigateToFiatOnRampArgs, NavigateToNftCollectionArgs, NavigateToNftItemArgs, @@ -40,6 +41,7 @@ export function MobileWalletNavigationProvider({ children }: PropsWithChildren): const navigateToSwapFlow = useNavigateToSwapFlow() const navigateToTokenDetails = useNavigateToTokenDetails() const navigateToFiatOnRamp = useNavigateToFiatOnRamp() + const navigateToExternalProfile = useNavigateToExternalProfile() return ( void { [dispatch], ) } + +function useNavigateToExternalProfile(): (args: NavigateToExternalProfileArgs) => void { + const navigation = useAppStackNavigation() + + return useCallback( + ({ address }: NavigateToExternalProfileArgs): void => { + navigation.navigate(MobileScreens.ExternalProfile, { + address, + }) + }, + [navigation], + ) +} diff --git a/apps/mobile/src/app/migrations.test.ts b/apps/mobile/src/app/migrations.test.ts index df0b5125b9f..bcd47460247 100644 --- a/apps/mobile/src/app/migrations.test.ts +++ b/apps/mobile/src/app/migrations.test.ts @@ -76,6 +76,10 @@ import { v72Schema, v73Schema, v74Schema, + v75Schema, + v76Schema, + v77Schema, + v78Schema, v7Schema, v8Schema, v9Schema, @@ -89,6 +93,7 @@ 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' @@ -101,8 +106,6 @@ 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' @@ -111,7 +114,11 @@ 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' @@ -174,8 +181,7 @@ describe('Redux state migrations', () => { cloudBackup: initialCloudBackupState, ens: { ensForAddress: {} }, favorites: initialFavoritesState, - fiatCurrencySettings: initialFiatCurrencyState, - languageSettings: initialLanguageState, + fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, modals: initialModalsState, notifications: initialNotificationsState, passwordLockout: initialPasswordLockoutState, @@ -1542,4 +1548,20 @@ 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 b82be69e39c..96f656654ee 100644 --- a/apps/mobile/src/app/migrations.ts +++ b/apps/mobile/src/app/migrations.ts @@ -6,6 +6,8 @@ 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 { @@ -14,13 +16,12 @@ 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, @@ -28,6 +29,9 @@ import { deleteDefaultFavoritesFromFavoritesState, deleteExtensionOnboardingState, deleteHoldToSwapBehaviorHistory, + moveCurrencySetting, + moveDismissedTokenWarnings, + moveLanguageSetting, moveUserSettings, removeUniconV2BehaviorState, removeWalletIsUnlockedState, @@ -716,21 +720,21 @@ export const migrations = { 51: function addLanguageSettings(state: any) { return { ...state, - languageSettings: initialLanguageState, + languageSettings: { currentLanguage: Language.English }, } }, 52: function addFiatCurrencySettings(state: any) { return { ...state, - fiatCurrencySettings: initialFiatCurrencyState, + fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, } }, 53: function updateLanguageSettings(state: any) { return { ...state, - languageSettings: initialLanguageState, + languageSettings: { currentLanguage: Language.English }, } }, @@ -936,6 +940,14 @@ export const migrations = { }, 75: deleteHoldToSwapBehaviorHistory, + + 76: addCreatedOnboardingRedesignAccountBehaviorHistory, + + 77: moveDismissedTokenWarnings, + + 78: moveLanguageSetting, + + 79: moveCurrencySetting, } -export const MOBILE_STATE_VERSION = 75 +export const MOBILE_STATE_VERSION = 79 diff --git a/apps/mobile/src/app/modals/AccountSwitcherModal.tsx b/apps/mobile/src/app/modals/AccountSwitcherModal.tsx index 6e86a69a08e..844744c5fa7 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 87e035a4f7c..b7b36041b10 100644 --- a/apps/mobile/src/app/modals/AppModals.tsx +++ b/apps/mobile/src/app/modals/AppModals.tsx @@ -2,6 +2,7 @@ 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' @@ -109,6 +110,10 @@ export function AppModals(): JSX.Element { + + + + ) } diff --git a/apps/mobile/src/app/modals/BackupReminderModal.tsx b/apps/mobile/src/app/modals/BackupReminderModal.tsx index 4e2b5e19bcb..1975596f342 100644 --- a/apps/mobile/src/app/modals/BackupReminderModal.tsx +++ b/apps/mobile/src/app/modals/BackupReminderModal.tsx @@ -1,37 +1,45 @@ -import { useState } from 'react' +import { useRef } from 'react' import { useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { navigate } from 'src/app/navigation/rootNavigation' -import { closeModal } from 'src/features/modals/modalSlice' +import { closeModal, openModal } 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 [isShowingWarningModal, setIsShowingWarningModal] = useState(false) + const closedByButtonRef = useRef(false) - const showWarningModal = (): void => { - setIsShowingWarningModal(true) + const onClose = (): void => { + dispatch(closeModal({ name: ModalName.BackupReminder })) } - const hideWarningModal = (): void => { - setIsShowingWarningModal(false) + 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 onClose = (): void => { - dispatch(setBackupReminderLastSeenTs(Date.now())) - dispatch(closeModal({ name: ModalName.BackupReminder })) + const onPressMaybeLater = (): void => { + closedByButtonRef.current = true + dispatch(openModal({ name: ModalName.BackupReminderWarning })) + onClose() } const onPressBackup = (): void => { + closedByButtonRef.current = true + dispatch(setBackupReminderLastSeenTs(Date.now())) navigate(MobileScreens.OnboardingStack, { screen: OnboardingScreens.Backup, params: { importType: ImportType.BackupOnly, entryPoint: OnboardingEntryPoint.BackupCard }, @@ -39,8 +47,8 @@ export function BackupReminderModal(): JSX.Element { onClose() } - return !isShowingWarningModal ? ( - + return ( + @@ -56,7 +64,7 @@ export function BackupReminderModal(): JSX.Element { flex={1} size="medium" theme="secondary" - onPress={showWarningModal} + onPress={onPressMaybeLater} > {t('common.button.later')} @@ -66,18 +74,5 @@ export function BackupReminderModal(): JSX.Element { - ) : ( - ) } diff --git a/apps/mobile/src/app/modals/BackupWarningModal.tsx b/apps/mobile/src/app/modals/BackupWarningModal.tsx new file mode 100644 index 00000000000..6180abdbd8a --- /dev/null +++ b/apps/mobile/src/app/modals/BackupWarningModal.tsx @@ -0,0 +1,56 @@ +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 f668cc06697..0065567168b 100644 --- a/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap +++ b/apps/mobile/src/app/modals/__snapshots__/AccountSwitcherModal.test.tsx.snap @@ -157,8 +157,9 @@ exports[`AccountSwitcher renders correctly 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "overflow": "hidden", } @@ -222,8 +223,9 @@ exports[`AccountSwitcher renders correctly 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, } } @@ -348,10 +350,10 @@ exports[`AccountSwitcher renders correctly 1`] = ` style={ { "color": "#000000", - "fontFamily": "Basel-Medium", - "fontSize": 15, + "fontFamily": "Basel Grotesk", + "fontSize": 17, "fontWeight": "500", - "lineHeight": 20, + "lineHeight": 19.549999999999997, } } suppressHighlighting={true} @@ -586,10 +588,10 @@ exports[`AccountSwitcher renders correctly 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Medium", - "fontSize": 15, + "fontFamily": "Basel Grotesk", + "fontSize": 17, "fontWeight": "500", - "lineHeight": 20, + "lineHeight": 19.549999999999997, } } suppressHighlighting={true} diff --git a/apps/mobile/src/app/navigation/NavBar.tsx b/apps/mobile/src/app/navigation/NavBar.tsx index a0877b46161..855fd04353d 100644 --- a/apps/mobile/src/app/navigation/NavBar.tsx +++ b/apps/mobile/src/app/navigation/NavBar.tsx @@ -35,7 +35,6 @@ 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' @@ -112,8 +111,7 @@ const SwapFAB = memo(function _SwapFAB({ activeScale = 0.96 }: SwapTabBarButtonP const isDarkMode = useIsDarkMode() const activeAccountAddress = useActiveAccountAddressWithThrow() - const valueModifiers = usePortfolioValueModifiers(activeAccountAddress) ?? [] - const inputCurrencyId = useHighestBalanceNativeCurrencyId(activeAccountAddress, valueModifiers) + const inputCurrencyId = useHighestBalanceNativeCurrencyId(activeAccountAddress) const onPress = useCallback(async () => { dispatch( @@ -166,7 +164,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 ea31bfb4a44..ff59beda7e7 100644 --- a/apps/mobile/src/app/navigation/components.tsx +++ b/apps/mobile/src/app/navigation/components.tsx @@ -1,9 +1,28 @@ +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 4ef29b403ec..22c408cf7cc 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 + [OnboardingScreens.BackupManual]: BackupFormParams & OnboardingStackBaseParams & { fromCloudBackup?: boolean } [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 13ed4c2c795..57e872ca458 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 90c159f3253..454a54db0ba 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: initialLanguageState, + languageSettings: { currentLanguage: Language.English }, } export const v52Schema = { @@ -379,12 +379,12 @@ export const v52Schema = { initialState: undefined, }, }, - fiatCurrencySettings: initialFiatCurrencyState, + fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, } const v53SchemaIntermediate = { ...v52Schema, - languageSettings: initialLanguageState, + languageSettings: { currentLanguage: Language.English }, modals: { ...v52Schema.modals, ['language-selector']: undefined }, } delete v53SchemaIntermediate.modals['language-selector'] @@ -578,6 +578,43 @@ 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 v75Schema => v75Schema +export const getSchema = (): typeof v79Schema => v79Schema diff --git a/apps/mobile/src/assets/fonts/Basel-Book.ttf b/apps/mobile/src/assets/fonts/Basel-Book.ttf deleted file mode 100644 index 136d64dd476835469eccf8dcf46c396fb40f16ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44472 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

T&+TF}4*b4_a!y(JT8BQ}l=OVp=`UTmU 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/src/assets/fonts/Basel-Grotesk-Medium.otf b/apps/mobile/src/assets/fonts/Basel-Grotesk-Medium.otf new file mode 100644 index 0000000000000000000000000000000000000000..344235fe1c3f55b8a14182aacc3b4e1b6215610e GIT binary patch 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 6c6beeda549..5140ce6eb90 100644 --- a/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap +++ b/apps/mobile/src/components/PriceExplorer/__snapshots__/Text.test.tsx.snap @@ -16,8 +16,9 @@ exports[`DatetimeText renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "padding": 0, } @@ -52,8 +53,9 @@ exports[`PriceText renders loading state 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 106, + "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -90,8 +92,9 @@ exports[`PriceText renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 106, + "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -117,8 +120,9 @@ exports[`PriceText renders without error 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 106, + "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -155,8 +159,9 @@ exports[`PriceText renders without error less than a dollar 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 106, + "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -182,8 +187,9 @@ exports[`PriceText renders without error less than a dollar 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 106, + "fontWeight": "400", "lineHeight": 60, "padding": 0, } @@ -256,8 +262,9 @@ exports[`RelativeChangeText renders loading state 1`] = ` maxFontSizeMultiplier={1.4} style={ { - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "marginHorizontal": 0, "opacity": 0, @@ -277,8 +284,9 @@ exports[`RelativeChangeText renders loading state 1`] = ` } style={ { - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "opacity": 0, "padding": 0, @@ -425,8 +433,9 @@ exports[`RelativeChangeText renders without error 1`] = ` style={ { "color": "#FF5F52", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 438b15b9625..5fa74295fb2 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 'wallet/src/features/fiatCurrency/hooks' -import { useCurrentLocale } from 'wallet/src/features/language/hooks' +import { useAppFiatCurrencyInfo } from 'uniswap/src/features/fiatCurrency/hooks' +import { useCurrentLocale } from 'uniswap/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 3d9347d4c95..531ad78790f 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 'wallet/src/test/fixtures' -import { queryResolvers } from 'wallet/src/test/utils' +} from 'uniswap/src/test/fixtures' +import { queryResolvers } from 'uniswap/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 601a89000de..ec27fd25173 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 32e709b5847..daaefe57a99 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, Photo } from 'ui/src/components/icons' +import { Global, PhotoStacked } 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 9de94f44f01..ccf0e8893aa 100644 --- a/apps/mobile/src/components/RecipientSelect/hooks.test.ts +++ b/apps/mobile/src/components/RecipientSelect/hooks.test.ts @@ -3,14 +3,19 @@ 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 { sendTokenTransactionInfo, transactionDetails } from 'uniswap/src/test/fixtures' +import { + SAMPLE_SEED_ADDRESS_1, + SAMPLE_SEED_ADDRESS_2, + 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 { SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, signerMnemonicAccount } from 'wallet/src/test/fixtures' +import { 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 5b594520f0e..e26db0402a8 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/RemoveWallet/RemoveLastMnemonicWalletFooter.tsx b/apps/mobile/src/components/RemoveWallet/RemoveLastMnemonicWalletFooter.tsx index 2252a4cfc85..80c59100044 100644 --- a/apps/mobile/src/components/RemoveWallet/RemoveLastMnemonicWalletFooter.tsx +++ b/apps/mobile/src/components/RemoveWallet/RemoveLastMnemonicWalletFooter.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react' import { useTranslation } from 'react-i18next' -import { Button, CheckBox, Flex, SpinningLoader, Text } from 'ui/src' +import { Button, Flex, LabeledCheckbox, SpinningLoader, Text } from 'ui/src' import { TestID } from 'uniswap/src/test/fixtures/testIDs' export function RemoveLastMnemonicWalletFooter({ @@ -18,7 +18,7 @@ export function RemoveLastMnemonicWalletFooter({ return ( <> - diff --git a/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectedNetworksModal.tsx b/apps/mobile/src/components/Requests/ConnectedDapps/DappConnectedNetworksModal.tsx index 1994bada371..a694a60c1ab 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 70fac046a8a..8335d4db240 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 11d0bb05e52..15ba2efdd31 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 4451c8371ee..74ec91ee19c 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="buttonLabel4" + textVariant="buttonLabel2" url={dapp.url} /> diff --git a/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx b/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx index b6c694a72b5..2b442440c54 100644 --- a/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/UwULinkErc20SendModal.tsx @@ -10,6 +10,7 @@ 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' @@ -18,7 +19,6 @@ 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 5c527840fc4..25d63586e08 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModal.tsx @@ -18,14 +18,15 @@ import { wcWeb3Wallet } from 'src/features/walletConnect/saga' import { selectDidOpenFromDeepLink } from 'src/features/walletConnect/selectors' import { signWcRequestActions } from 'src/features/walletConnect/signWcRequestSaga' import { WalletConnectRequest, isTransactionRequest } from 'src/features/walletConnect/walletConnectSlice' +import { useTransactionGasFee } from 'uniswap/src/features/gas/hooks' 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 { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { 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 6ec08a0d6b9..a742b127efb 100644 --- a/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx +++ b/apps/mobile/src/components/Requests/RequestModal/WalletConnectRequestModalContent.tsx @@ -13,15 +13,15 @@ import { isTransactionRequest, } from 'src/features/walletConnect/walletConnectSlice' import { Flex, Text, useSporeColors } from 'ui/src' -import AlertTriangle from 'ui/src/assets/icons/alert-triangle.svg' +import AlertTriangleFilled from 'ui/src/assets/icons/alert-triangle-filled.svg' import { iconSizes } from 'ui/src/theme' import { BaseCard } from 'uniswap/src/components/BaseCard/BaseCard' +import { useUSDValue } from 'uniswap/src/features/gas/hooks' import { GasFeeResult } from 'uniswap/src/features/gas/types' import { NativeCurrency } from 'uniswap/src/features/tokens/NativeCurrency' import { EthMethod, isPrimaryTypePermit } from 'uniswap/src/types/walletConnect' import { buildCurrencyId } from 'uniswap/src/utils/currencyId' import { logger } from 'utilities/src/logger/logger' -import { useUSDValue } from 'wallet/src/features/gas/hooks' import { AddressFooter } from 'wallet/src/features/transactions/TransactionRequest/AddressFooter' import { NetworkFeeFooter } from 'wallet/src/features/transactions/TransactionRequest/NetworkFeeFooter' import { BlockedAddressWarning } from 'wallet/src/features/trm/BlockedAddressWarning' @@ -119,7 +119,11 @@ export function WalletConnectRequestModalContent({ + } textColor="$DEP_accentWarning" title={t('walletConnect.request.error.network')} @@ -171,7 +175,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 18d4e19d77e..ab8937a9a60 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="buttonLabel4" + textVariant="buttonLabel2" url={pendingSession.dapp.url} /> diff --git a/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionSwitchAccountModal.tsx b/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionSwitchAccountModal.tsx index 85263b4621b..e11bf910090 100644 --- a/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionSwitchAccountModal.tsx +++ b/apps/mobile/src/components/Requests/ScanSheet/PendingConnectionSwitchAccountModal.tsx @@ -36,6 +36,7 @@ export const PendingConnectionSwitchAccountModal = ({ activeAccount, onPressAcco {t('walletConnect.pending.switchAccount')} } + isDismissible={false} isVisible={true} name={ModalName.AccountEdit} options={options} diff --git a/apps/mobile/src/components/Requests/Uwulink/utils.ts b/apps/mobile/src/components/Requests/Uwulink/utils.ts index 0a09b881032..3c9339a417f 100644 --- a/apps/mobile/src/components/Requests/Uwulink/utils.ts +++ b/apps/mobile/src/components/Requests/Uwulink/utils.ts @@ -3,7 +3,6 @@ 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, @@ -213,7 +212,7 @@ async function toTokenTransferRequest( providerManager: ProviderManager, contractManager: ContractManager, ): Promise { - const provider = providerManager.getProvider(request.chainId, RPCType.Public) + const provider = providerManager.getProvider(request.chainId) const params: SendCurrencyParams = { type: AssetType.Currency, account, diff --git a/apps/mobile/src/components/Requests/WalletConnectModals.tsx b/apps/mobile/src/components/Requests/WalletConnectModals.tsx index d5c0e91d2ee..e650783a4be 100644 --- a/apps/mobile/src/components/Requests/WalletConnectModals.tsx +++ b/apps/mobile/src/components/Requests/WalletConnectModals.tsx @@ -97,7 +97,7 @@ export function WalletConnectModals(): JSX.Element { dispatch(removeRequest({ requestInternalId: currRequest.internalId, account: currRequest.account })) } > - {' '} + ) : null} diff --git a/apps/mobile/src/components/Settings/OnboardingRow.tsx b/apps/mobile/src/components/Settings/OnboardingRow.tsx index eb9084ebb1f..0d558b7593c 100644 --- a/apps/mobile/src/components/Settings/OnboardingRow.tsx +++ b/apps/mobile/src/components/Settings/OnboardingRow.tsx @@ -6,6 +6,7 @@ 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' @@ -22,6 +23,7 @@ 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 new file mode 100644 index 00000000000..e96b66db0fc --- /dev/null +++ b/apps/mobile/src/components/Settings/ResetBehaviorHistoryRow.tsx @@ -0,0 +1,28 @@ +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 01d7dbf911b..87f75054a40 100644 --- a/apps/mobile/src/components/Settings/SettingsRow.tsx +++ b/apps/mobile/src/components/Settings/SettingsRow.tsx @@ -9,13 +9,12 @@ import { SettingsStackParamList, } from 'src/app/navigation/types' import { openModal } from 'src/features/modals/modalSlice' -import { Flex, Text, TouchableArea, useSporeColors } from 'ui/src' +import { Flex, Switch, 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 { @@ -97,14 +96,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 32114959451..9a246af8850 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 4f89986c4fe..2caaa521845 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 9a4c8165199..321857a13d5 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 a1a416e6e4d..fbc3d904a6e 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 81d20e2cbde..7d83d2c69be 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 e585980d644..076c9accd97 100644 --- a/apps/mobile/src/components/TokenDetails/hooks.test.ts +++ b/apps/mobile/src/components/TokenDetails/hooks.test.ts @@ -2,7 +2,6 @@ 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, @@ -10,8 +9,9 @@ import { tokenBalance, usdcArbitrumToken, usdcBaseToken, -} from 'wallet/src/test/fixtures' -import { queryResolvers } from 'wallet/src/test/utils' +} from 'uniswap/src/test/fixtures' +import { queryResolvers } from 'uniswap/src/test/utils' +import { MobileScreens } from 'uniswap/src/types/screens/mobile' const mockedNavigation = { navigate: jest.fn(), diff --git a/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx b/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx index e960f3146e7..31cb857d789 100644 --- a/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx +++ b/apps/mobile/src/components/TokenSelector/TokenFiatOnRampList.tsx @@ -1,16 +1,19 @@ -import { BottomSheetFlatList } from '@gorhom/bottom-sheet' -import React, { memo, useCallback, useMemo, useRef } from 'react' +import { BottomSheetSectionList } from '@gorhom/bottom-sheet' +import React, { memo, useCallback, useMemo, useRef, useState } 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 { FiatOnRampCurrency } from 'uniswap/src/features/fiatOnRamp/types' -import { useTokenWarningDismissed } from 'uniswap/src/features/tokens/slice/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 { CurrencyId } from 'uniswap/src/types/currency' import { NumberType } from 'utilities/src/format/types' -import { useLocalizationContext } from 'wallet/src/features/language/LocalizationContext' +import { ListSeparatorToggle } from 'wallet/src/features/transactions/TransactionDetails/TransactionDetails' interface Props { onSelectCurrency: (currency: FiatOnRampCurrency) => void @@ -18,35 +21,49 @@ interface Props { error: boolean loading: boolean list: FiatOnRampCurrency[] | undefined + balancesById: Record | undefined + selectedCurrency?: FiatOnRampCurrency + isOffRamp: boolean } function TokenOptionItemWrapper({ currency, onSelectCurrency, + currencyBalance, + isSelected, + showUnsupported, }: { - currency: FiatOnRampCurrency + currency: FORCurrencyOrBalance 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( - // we need to convert to TokenOption without quantity and balanceUSD - // to use in Token Selector - () => (currencyInfo ? { currencyInfo, quantity: 0, balanceUSD: 0 } : null), - [currencyInfo], + () => (currencyInfo ? { currencyInfo, quantity: quantity || null, balanceUSD, isUnsupported } : null), + [currencyInfo, balanceUSD, quantity, isUnsupported], ) const onPress = useCallback(() => onSelectCurrency?.(currency), [currency, onSelectCurrency]) - const { tokenWarningDismissed, dismissWarningCallback } = useTokenWarningDismissed(currencyInfo?.currencyId) + const { tokenWarningDismissed, onDismissTokenWarning } = useDismissedTokenWarnings(currencyInfo?.currency) const { convertFiatAmountFormatted, formatNumberOrString } = useLocalizationContext() if (!option) { return null } + if (!showUnsupported && isUnsupported) { + return null + } + return ( ) => { - return + ({ item: currency }: ListRenderItemInfo) => { + const { currencyInfo } = currency + const currencyBalance = currencyInfo && balancesById?.[currencyInfo.currencyId] + + return ( + + ) }, - [onSelectCurrency], + [onSelectCurrency, balancesById, selectedCurrency, showMore], ) if (error) { @@ -87,17 +136,36 @@ function _TokenFiatOnRampList({ onSelectCurrency, error, onRetry, list, loading } 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 f7515049ed8..c29997d8ee7 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 a2bbc7eeb70..ebe0dad10f2 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 b31777f1576..c29a85c791d 100644 --- a/apps/mobile/src/components/accounts/AccountCardItem.test.tsx +++ b/apps/mobile/src/components/accounts/AccountCardItem.test.tsx @@ -1,9 +1,8 @@ import { AccountCardItem } from 'src/components/accounts/AccountCardItem' import { fireEvent, render, screen, waitFor } from 'src/test/test-utils' -import { ON_PRESS_EVENT_PAYLOAD } from 'uniswap/src/test/fixtures' +import { ON_PRESS_EVENT_PAYLOAD, SAMPLE_SEED_ADDRESS_1, amount, portfolio } from 'uniswap/src/test/fixtures' +import { queryResolvers } from 'uniswap/src/test/utils' 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 20428614f01..6d40595e4bd 100644 --- a/apps/mobile/src/components/accounts/AccountCardItem.tsx +++ b/apps/mobile/src/components/accounts/AccountCardItem.tsx @@ -9,6 +9,7 @@ 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' @@ -16,7 +17,6 @@ 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 7c5b3445e8e..3bb50671d35 100644 --- a/apps/mobile/src/components/accounts/AccountHeader.tsx +++ b/apps/mobile/src/components/accounts/AccountHeader.tsx @@ -8,6 +8,7 @@ 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' @@ -21,7 +22,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 { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' +import { 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 944bceb0b71..65e7b415761 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 } from 'uniswap/src/test/fixtures' +import { ON_PRESS_EVENT_PAYLOAD, amounts, portfolio } from 'uniswap/src/test/fixtures' +import { createArray, queryResolvers } from 'uniswap/src/test/utils' import { sanitizeAddressText, shortenAddress } from 'uniswap/src/utils/addresses' import { NumberType } from 'utilities/src/format/types' -import { ACCOUNT, amounts, portfolio, readOnlyAccount, signerMnemonicAccount } from 'wallet/src/test/fixtures' +import { ACCOUNT, 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 3dd216939a9..e3e9b80dd00 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountCardItem.test.tsx.snap @@ -215,8 +215,9 @@ exports[`AccountCardItem renders correctly 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "overflow": "hidden", } @@ -237,8 +238,9 @@ exports[`AccountCardItem renders correctly 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 500a5d21827..71250b1b9f3 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountHeader.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountHeader.test.tsx.snap @@ -298,8 +298,9 @@ exports[`AccountHeader renders correctly 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -351,6 +352,7 @@ exports[`AccountHeader renders correctly 1`] = ` "value": { "color": "#CECECE", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "opacity": 0, }, @@ -360,8 +362,9 @@ exports[`AccountHeader renders correctly 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "opacity": 0, } @@ -414,8 +417,9 @@ exports[`AccountHeader renders correctly 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 ce6e67a5b25..be2a850f275 100644 --- a/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap +++ b/apps/mobile/src/components/accounts/__snapshots__/AccountList.test.tsx.snap @@ -92,8 +92,9 @@ exports[`AccountList renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, } } @@ -322,8 +323,9 @@ exports[`AccountList renders without error 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, "overflow": "hidden", } @@ -344,8 +346,9 @@ exports[`AccountList renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 7dd2e22ca65..119692c6c0a 100644 --- a/apps/mobile/src/components/buttons/__snapshots__/BackButton.test.tsx.snap +++ b/apps/mobile/src/components/buttons/__snapshots__/BackButton.test.tsx.snap @@ -122,8 +122,9 @@ exports[`BackButton renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 c562750dab0..c897400030c 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-Medium", - "fontSize": 17, + "fontFamily": "Basel Grotesk", + "fontSize": 19, "fontWeight": "500", - "lineHeight": 24, + "lineHeight": 21.849999999999998, } } 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 6d066d10d16..8990c0b4f4f 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-Book", + "fontFamily": "Basel Grotesk", } } suppressHighlighting={true} diff --git a/apps/mobile/src/components/explore/FavoriteHeaderRow.tsx b/apps/mobile/src/components/explore/FavoriteHeaderRow.tsx index 4825ff0a9a1..ecf7f85bdb8 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 2fa25c8f4d5..cab12bedc20 100644 --- a/apps/mobile/src/components/explore/FavoriteTokenCard.test.tsx +++ b/apps/mobile/src/components/explore/FavoriteTokenCard.test.tsx @@ -2,12 +2,18 @@ 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 { ON_PRESS_EVENT_PAYLOAD } from 'uniswap/src/test/fixtures' +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 { 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(), @@ -129,8 +135,7 @@ describe('FavoriteTokenCard', () => { it('dispatches removeFavoriteToken action when remove button is pressed', async () => { const store = mockStore({ favorites: { tokens: [] }, - fiatCurrencySettings: { currentCurrency: FiatCurrency.UnitedStatesDollar }, - languageSettings: { currentLanguage: Language.English }, + userSettings: { currentCurrency: FiatCurrency.UnitedStatesDollar, 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 9a9a4a0e7d2..efc97523d92 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 c38adcc7244..a7ea8deb8c8 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 } from 'uniswap/src/test/fixtures' +import { ON_PRESS_EVENT_PAYLOAD, SAMPLE_SEED_ADDRESS_1 } from 'uniswap/src/test/fixtures' import { MobileScreens } from 'uniswap/src/types/screens/mobile' import { sanitizeAddressText, shortenAddress } from 'uniswap/src/utils/addresses' -import { SAMPLE_SEED_ADDRESS_1, preloadedWalletReducerState, signerMnemonicAccount } from 'wallet/src/test/fixtures' +import { 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', - loading: false, - error: undefined, - }) + isLoading: false, + error: null, + } as ReturnType) const { queryByText } = render() diff --git a/apps/mobile/src/components/explore/FavoriteWalletCard.tsx b/apps/mobile/src/components/explore/FavoriteWalletCard.tsx index 6720e24c8e3..cc081cd4eb0 100644 --- a/apps/mobile/src/components/explore/FavoriteWalletCard.tsx +++ b/apps/mobile/src/components/explore/FavoriteWalletCard.tsx @@ -12,10 +12,11 @@ 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 { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' +import { 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 1c6bfae4674..96188f37e7e 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 268b0eeb8e9..1012d8a8a47 100644 --- a/apps/mobile/src/components/explore/TokenItem.tsx +++ b/apps/mobile/src/components/explore/TokenItem.tsx @@ -11,6 +11,7 @@ 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 { @@ -21,7 +22,6 @@ 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 7422d35c018..5065a7928f6 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 f8c75cb7949..36e4b69c304 100644 --- a/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/FavoriteHeaderRow.test.tsx.snap @@ -20,8 +20,9 @@ exports[`FavoriteHeaderRow when editing renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, } } @@ -60,10 +61,10 @@ exports[`FavoriteHeaderRow when editing renders without error 1`] = ` style={ { "color": "#FC72FF", - "fontFamily": "Basel-Medium", - "fontSize": 15, + "fontFamily": "Basel Grotesk", + "fontSize": 17, "fontWeight": "500", - "lineHeight": 20, + "lineHeight": 19.549999999999997, } } suppressHighlighting={true} @@ -95,8 +96,9 @@ exports[`FavoriteHeaderRow when not editing renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 b5752fd76e0..eb7dafec05c 100644 --- a/apps/mobile/src/components/explore/__snapshots__/FavoriteWalletCard.test.tsx.snap +++ b/apps/mobile/src/components/explore/__snapshots__/FavoriteWalletCard.test.tsx.snap @@ -221,8 +221,9 @@ exports[`FavoriteWalletCard renders without error 1`] = ` { "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 cb7e240d9a4..56604946bf4 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-Medium", - "fontSize": 15, + "fontFamily": "Basel Grotesk", + "fontSize": 17, "fontWeight": "500", - "lineHeight": 20, + "lineHeight": 19.549999999999997, } } 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 eaa47a67b70..788eb7f010f 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-Medium", - "fontSize": 13, + "fontFamily": "Basel Grotesk", + "fontSize": 17, "fontWeight": "500", - "lineHeight": 16, + "lineHeight": 19.549999999999997, } } suppressHighlighting={true} @@ -111,7 +111,7 @@ exports[`TokenItem renders without error 1`] = ` style={ { "aspectRatio": undefined, - "backgroundColor": "rgba(34,34,34,0.05)", + "backgroundColor": "#FFFFFF", "borderRadius": 20, "flex": undefined, } @@ -138,8 +138,9 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -154,8 +155,9 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, } } @@ -196,8 +198,9 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -230,8 +233,9 @@ exports[`TokenItem renders without error 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 cff933aad46..9d6085808f7 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 84b6ed8ae77..9fce7bd4a14 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 84903b3e278..62868d18307 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 6374abcb437..9003fd757e9 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 'wallet/src/features/tokens/hooks' +import { TopToken, usePopularTokens } from 'uniswap/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 79b90a2592e..dfa5349e225 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, loading: isFetchingPrimaryENSName } = useENSName( + const { data: fetchedPrimaryENSName, isLoading: 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 f3aa95593cc..0e1a541917b 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 675f5456f15..61d9f8e9204 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 'wallet/src/test/fixtures' -import { createArray } from 'wallet/src/test/utils' +} from 'uniswap/src/test/fixtures' +import { createArray } from 'uniswap/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 56cee578b19..96884734481 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 ba351534b60..daa8745849e 100644 --- a/apps/mobile/src/components/home/HomeExploreTab.tsx +++ b/apps/mobile/src/components/home/HomeExploreTab.tsx @@ -18,6 +18,7 @@ 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' @@ -25,7 +26,6 @@ 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 48d9c686e79..8cf32828c16 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 } from 'ui/src' +import { Flex, useIsDarkMode, useShadowPropsShort } 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,6 +18,7 @@ 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() @@ -105,11 +106,9 @@ export function FundWalletModal({ onClose }: { onClose: () => void }): JSX.Eleme key={card.title} {...card} containerProps={{ + ...shadowProps, py: '$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, + px: '$spacing20', }} /> ))} diff --git a/apps/mobile/src/components/home/introCards/IntroCard.tsx b/apps/mobile/src/components/home/introCards/IntroCard.tsx index 349006cb902..4518bc7a390 100644 --- a/apps/mobile/src/components/home/introCards/IntroCard.tsx +++ b/apps/mobile/src/components/home/introCards/IntroCard.tsx @@ -25,7 +25,6 @@ export type IntroCardProps = { description: string cardType: CardType - onPress?: () => void onClose?: () => void } @@ -36,7 +35,6 @@ export function IntroCard({ title, description, cardType, - onPress, onClose, }: IntroCardProps): JSX.Element { const isDarkMode = useIsDarkMode() @@ -56,7 +54,6 @@ 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 87c6673d610..e6ac34046de 100644 --- a/apps/mobile/src/components/home/introCards/IntroCardStack.tsx +++ b/apps/mobile/src/components/home/introCards/IntroCardStack.tsx @@ -1,21 +1,23 @@ 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: IntroCardProps[] + cards: IntroCardWrapper[] keyExtractor: (card: IntroCardProps) => string onSwiped?: (card: IntroCardProps, index: number) => void } -const MIN_CARD_HEIGHT = 110 +export const INTRO_CARD_MIN_HEIGHT = 110 export function IntroCardStack({ cards, keyExtractor, onSwiped }: IntroCardStackProps): JSX.Element { return ( } onSwiped={onSwiped} /> diff --git a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx index b4d699f79ed..d1eb6b7270f 100644 --- a/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx +++ b/apps/mobile/src/components/home/introCards/OnboardingIntroCardStack.tsx @@ -1,15 +1,17 @@ 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 } from 'src/components/home/introCards/IntroCardStack' +import { INTRO_CARD_MIN_HEIGHT, IntroCardStack, IntroCardWrapper } from 'src/components/home/introCards/IntroCardStack' +import { UnitagBanner } from 'src/components/unitags/UnitagBanner' 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' @@ -25,11 +27,20 @@ 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 = IntroCardProps & { +type IntroCardWithName = IntroCardWrapper & { loggingName: OnboardingCardLoggingName } -export function OnboardingIntroCardStack(): JSX.Element { +type OnboardingIntroCardStackProps = { + onboardingRedesignHomeEnabled: boolean + onboardingRedesignBackupEnabled: boolean + isLoading?: boolean +} +export function OnboardingIntroCardStack({ + onboardingRedesignHomeEnabled, + onboardingRedesignBackupEnabled, + isLoading = false, +}: OnboardingIntroCardStackProps): JSX.Element | null { const { t } = useTranslation() const dispatch = useDispatch() const activeAccount = useActiveAccountWithThrow() @@ -51,31 +62,15 @@ export function OnboardingIntroCardStack(): JSX.Element { const shouldPromptUnitag = activeAccount.type === AccountType.SignerMnemonic && !hasSkippedUnitagPrompt && canClaimUnitag - const redesignRecoveryBackupEnabled = useExperimentValue( - Experiments.OnboardingRedesignRecoveryBackup, - OnboardingRedesignRecoveryBackupProperties.Enabled, - false, - ) - 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 (!onboardingRedesignHomeEnabled && !onboardingRedesignBackupEnabled) { + return [] + } + + const output: IntroCardWithName[] = [] if (!hasViewedWelcomeWalletCard) { - output.unshift({ + output.push({ loggingName: OnboardingCardLoggingName.WelcomeWallet, Icon: UniswapLogo, iconProps: { @@ -91,7 +86,23 @@ export function OnboardingIntroCardStack(): JSX.Element { }) } - if (redesignRecoveryBackupEnabled && !hasBackups) { + 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) { output.push({ loggingName: OnboardingCardLoggingName.RecoveryBackup, Icon: ShieldCheck, @@ -130,7 +141,8 @@ export function OnboardingIntroCardStack(): JSX.Element { handleUnitagDismiss, hasBackups, hasViewedWelcomeWalletCard, - redesignRecoveryBackupEnabled, + onboardingRedesignBackupEnabled, + onboardingRedesignHomeEnabled, shouldPromptUnitag, t, welcomeCardTitle, @@ -152,10 +164,25 @@ export function OnboardingIntroCardStack(): JSX.Element { [cards, dispatch, hasViewedWelcomeWalletCard, welcomeCardTitle], ) - return ( - <> - card.title} onSwiped={handleSwiped} /> - {showFundModal && setShowFundModal(false)} />} - - ) + if (cards.length) { + return ( + + {isLoading ? ( + + ) : ( + card.title} onSwiped={handleSwiped} /> + )} + + {showFundModal && setShowFundModal(false)} />} + + ) + } else if (shouldPromptUnitag) { + return ( + + + + ) + } + + return null } diff --git a/apps/mobile/src/components/input/PasswordInput.tsx b/apps/mobile/src/components/input/PasswordInput.tsx index 14a73d962e4..f5bc02b407d 100644 --- a/apps/mobile/src/components/input/PasswordInput.tsx +++ b/apps/mobile/src/components/input/PasswordInput.tsx @@ -39,8 +39,11 @@ 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 da567fe002e..4ce0e64356a 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, useShadowPropsMedium } from 'ui/src' +import { Flex, Text, TouchableArea, useShadowPropsShort } 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 = useShadowPropsMedium() + const shadowProps = useShadowPropsShort() return ( @@ -22,7 +22,9 @@ export function HiddenMnemonicWordView({ row alignItems="stretch" backgroundColor="$surface2" + borderColor="$surface3" borderRadius="$rounded20" + borderWidth={1} gap="$spacing36" px="$spacing32" py="$spacing24" @@ -37,14 +39,16 @@ 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 3699d56824c..7724e2cd9eb 100644 --- a/apps/mobile/src/components/mnemonic/MnemonicConfirmation.tsx +++ b/apps/mobile/src/components/mnemonic/MnemonicConfirmation.tsx @@ -3,6 +3,7 @@ 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 { @@ -34,7 +35,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.spacing16, + marginBottom: spacing.spacing12, }, }) diff --git a/apps/mobile/src/components/text/AnimatedText.test.tsx b/apps/mobile/src/components/text/AnimatedText.test.tsx index 9e098b1d123..20d58792dca 100644 --- a/apps/mobile/src/components/text/AnimatedText.test.tsx +++ b/apps/mobile/src/components/text/AnimatedText.test.tsx @@ -9,30 +9,7 @@ describe(AnimatedText, () => { it('renders without error', () => { const tree = render() - expect(tree).toMatchInlineSnapshot(` - - `) + expect(tree).toMatchSnapshot() }) 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 67e437525cd..11738bbc519 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="buttonLabel3" + variant="buttonLabel2" 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 52bde0e26a6..171e17af98e 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="buttonLabel3" + variant="buttonLabel2" 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 new file mode 100644 index 00000000000..948d0333726 --- /dev/null +++ b/apps/mobile/src/components/text/__snapshots__/AnimatedText.test.tsx.snap @@ -0,0 +1,27 @@ +// 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 474d11578f1..5c375be5301 100644 --- a/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/DecimalNumber.test.tsx.snap @@ -7,8 +7,9 @@ exports[`renders a DecimalNumber 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -21,8 +22,9 @@ exports[`renders a DecimalNumber 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -41,8 +43,9 @@ exports[`renders a DecimalNumber without a comma separator 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -55,8 +58,9 @@ exports[`renders a DecimalNumber without a comma separator 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -75,8 +79,9 @@ exports[`renders a DecimalNumber without a decimal part 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 8536d0bc954..74624d5c7cc 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-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, "lineHeight": 24, }, @@ -101,7 +101,7 @@ exports[`LongMarkdownText renders without error 1`] = ` [ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 7f43af2bc63..68da7b72c38 100644 --- a/apps/mobile/src/components/text/__snapshots__/LongText.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/LongText.test.tsx.snap @@ -16,8 +16,9 @@ exports[`LongText renders without error 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 f6a3234342a..8c519688ecf 100644 --- a/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap +++ b/apps/mobile/src/components/text/__snapshots__/TextWithFuseMatches.test.tsx.snap @@ -15,8 +15,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -30,8 +31,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -45,8 +47,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -60,8 +63,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -75,8 +79,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -90,8 +95,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -105,8 +111,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -120,8 +127,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -135,8 +143,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -150,8 +159,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -165,8 +175,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -180,8 +191,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -195,8 +207,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -210,8 +223,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -225,8 +239,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -240,8 +255,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -255,8 +271,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -270,8 +287,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -285,8 +303,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -300,8 +319,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -315,8 +335,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -330,8 +351,9 @@ exports[`renders text with few matches 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 19, + "fontWeight": "400", "lineHeight": 24, } } @@ -350,8 +372,9 @@ exports[`renders text without matches 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 76835b3d5e3..b729b993602 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 { AlertTriangle } from 'ui/src/components/icons' +import { AlertTriangleFilled } 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,6 +192,7 @@ export function ChangeUnitagModal({ color="$neutral1" fontFamily="$subHeading" fontSize={fonts.subheading1.fontSize} + fontWeight="$book" m="$none" maxLength={20} numberOfLines={1} @@ -277,7 +278,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 26a53eeac43..fcff2774cdd 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, Photo, Trash } from 'ui/src/components/icons' +import { Camera, PhotoStacked, 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 105f9a10543..6c438cc7ef6 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 { AlertTriangle } from 'ui/src/components/icons' +import { AlertTriangleFilled } 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 4597d330fc5..bdb6e35a08f 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 1726249dea1..92cc1193878 100644 --- a/apps/mobile/src/features/CloudBackup/CloudBackupForm/PasswordInput.tsx +++ b/apps/mobile/src/features/CloudBackup/CloudBackupForm/PasswordInput.tsx @@ -1,12 +1,10 @@ import { useRef } from 'react' import { useTranslation } from 'react-i18next' import { TextInput } from 'react-native' -import { PasswordInput as Input } from 'src/components/input/PasswordInput' +import { PasswordInput } 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, @@ -15,7 +13,7 @@ import { getPasswordStrengthTextAndColor, } from 'wallet/src/utils/password' -export function PasswordInput(): JSX.Element { +export function CloudPasswordInput(): JSX.Element { const { password, error, passwordStrength, isConfirmation, onPasswordChangeText, onPasswordSubmitEditing } = useCloudBackupPasswordFormContext() const debouncedPasswordStrength = useDebounce(passwordStrength, PASSWORD_VALIDATION_DEBOUNCE_MS) @@ -34,7 +32,7 @@ export function PasswordInput(): 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 fa72f4b3769..479ff313b61 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 { PasswordInput } from 'src/features/CloudBackup/CloudBackupForm/PasswordInput' +import { CloudPasswordInput } from 'src/features/CloudBackup/CloudBackupForm/PasswordInput' export const CloudBackupPassword = { - PasswordInput, + PasswordInput: CloudPasswordInput, ContinueButton, FormProvider: CloudBackupPasswordFormContextProvider, } diff --git a/apps/mobile/src/features/appRating/saga.ts b/apps/mobile/src/features/appRating/saga.ts index 20a0ea17e20..00f767f44b2 100644 --- a/apps/mobile/src/features/appRating/saga.ts +++ b/apps/mobile/src/features/appRating/saga.ts @@ -9,6 +9,7 @@ import { finalizeTransaction } from 'uniswap/src/features/transactions/slice' import { TransactionStatus, TransactionType } from 'uniswap/src/features/transactions/types/transactionDetails' import i18n from 'uniswap/src/i18n/i18n' import { openUri } from 'uniswap/src/utils/linking' +import { isJestRun } from 'utilities/src/environment/constants' import { logger } from 'utilities/src/logger/logger' import { ONE_DAY_MS, ONE_SECOND_MS } from 'utilities/src/time/time' import { selectActiveAccountAddress } from 'wallet/src/features/wallet/selectors' @@ -21,6 +22,15 @@ const MIN_FEEDBACK_REMINDER_MS = 180 * ONE_DAY_MS // small delay to help ux const SWAP_FINALIZED_PROMPT_DELAY_MS = 3 * ONE_SECOND_MS +try { + if (!isJestRun) { + import('expo-store-review') + } +} catch (error) { + const message = error instanceof Error ? error.message : 'Store Review import error' + logger.warn('appRating/saga.ts', 'init', message) +} + // Wrap the StoreReview import in a function that catches the specific error const getStoreReview = async () => { try { diff --git a/apps/mobile/src/features/appRating/selectors.ts b/apps/mobile/src/features/appRating/selectors.ts index cb8da6514ed..57ad283b63c 100644 --- a/apps/mobile/src/features/appRating/selectors.ts +++ b/apps/mobile/src/features/appRating/selectors.ts @@ -1,5 +1,6 @@ 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, @@ -8,7 +9,6 @@ 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 0bb18abd31b..9f57128baee 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 'wallet/src/test/fixtures' -import { queryResolvers } from 'wallet/src/test/utils' +import { SAMPLE_CURRENCY_ID_1, portfolio, portfolioBalances } from 'uniswap/src/test/fixtures' +import { queryResolvers } from 'uniswap/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 46a31c43a69..f585434f774 100644 --- a/apps/mobile/src/features/dataApi/balances.ts +++ b/apps/mobile/src/features/dataApi/balances.ts @@ -2,17 +2,14 @@ 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 191b93dad5c..6b8bc55b5bc 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, - signerMnemonicAccount, -} from 'wallet/src/test/fixtures' +} 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' const account = signerMnemonicAccount() diff --git a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts index 3fe375aa835..559aafb6185 100644 --- a/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts +++ b/apps/mobile/src/features/deepLinking/handleDeepLinkSaga.ts @@ -29,6 +29,7 @@ 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' @@ -43,7 +44,6 @@ 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}|${UNISWAP_APP_NATIVE_TOKEN})$`, + `^(#\/)?tokens\/([\\w\\d]*)\/(0x[a-fA-F0-9]{40}|${BACKEND_NATIVE_CHAIN_ADDRESS_STRING})$`, ) 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 === UNISWAP_APP_NATIVE_TOKEN + contractAddress === BACKEND_NATIVE_CHAIN_ADDRESS_STRING ? 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 da59953a338..26903b34b30 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 } from 'uniswap/src/types/chains' +import { WALLET_SUPPORTED_CHAIN_IDS, WalletChainId } 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) + const inputChain = currencyIdToChain(inputCurrencyId) as WalletChainId const inputAddress = currencyIdToAddress(inputCurrencyId) - const outputChain = currencyIdToChain(outputCurrencyId) + const outputChain = currencyIdToChain(outputCurrencyId) as WalletChainId 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 b7ae6d1690e..8b58b41df59 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 { useAvatar, useDisplayName } from 'wallet/src/features/wallet/hooks' +import { 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 d71adae25a4..75fddb62fec 100644 --- a/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx +++ b/apps/mobile/src/features/fiatOnRamp/FiatOnRampAmountSection.tsx @@ -4,19 +4,17 @@ 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, useHapticFeedback, useSporeColors } from 'ui/src' +import { ColorTokens, Flex, Text, TouchableArea, 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 { TestID } from 'uniswap/src/test/fixtures/testIDs' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' 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' @@ -45,7 +43,6 @@ function OnRampError({ errorText, color }: { errorText: string; color: ColorToke interface FiatOnRampAmountSectionProps { disabled?: boolean value: string - errorColor: ColorTokens | undefined errorText: string | undefined currency: FiatOnRampCurrency onEnterAmount: OnChangeAmount @@ -72,19 +69,16 @@ export const FiatOnRampAmountSection = forwardRef - - + + {debouncedErrorText} @@ -193,6 +193,9 @@ export const FiatOnRampAmountSection = forwardRef - {currency.currencyInfo && formattedAmount && ( - - )} - {predefinedAmountsSupported ? ( - + {!value && predefinedAmountsSupported ? ( + {PREDEFINED_AMOUNTS.map((amount) => ( ))} - ) : null} + ) : ( + + + + {formattedCurrencyAmount} + {currency.currencyInfo?.currency.symbol} + + {/* TODO: support switching from fiat to token amounts */} + {/* */} + + + )} {notAvailableInThisRegion ? ( ) : !appFiatCurrencySupported ? ( @@ -282,7 +293,7 @@ function PredefinedAmount({ foregroundColor={colors[disabled ? 'neutral3' : highlighted ? 'neutral1' : 'neutral2'].val} label={formattedAmount} px="$spacing16" - textVariant="buttonLabel3" + textVariant="buttonLabel2" /> ) diff --git a/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx b/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx index 071cf9972dc..5ba194dd0d7 100644 --- a/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx +++ b/apps/mobile/src/features/fiatOnRamp/FiatOnRampContext.tsx @@ -25,9 +25,12 @@ interface FiatOnRampContextType { baseCurrencyInfo?: FiatCurrencyInfo setBaseCurrencyInfo: (baseCurrency: FiatCurrencyInfo | undefined) => void quoteCurrency: FiatOnRampCurrency + defaultCurrency: FiatOnRampCurrency setQuoteCurrency: (quoteCurrency: FiatOnRampCurrency) => void amount?: number setAmount: (amount: number | undefined) => void + isOffRamp: boolean + setIsOffRamp: (isOffRamp: boolean) => void } const initialState: FiatOnRampContextType = { @@ -41,6 +44,9 @@ const initialState: FiatOnRampContextType = { countryCode: '', countryState: undefined, quoteCurrency: { currencyInfo: undefined }, + defaultCurrency: { currencyInfo: undefined }, + isOffRamp: false, + setIsOffRamp: () => undefined, } const FiatOnRampContext = createContext(initialState) @@ -56,6 +62,7 @@ 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 @@ -64,12 +71,11 @@ export function FiatOnRampProvider({ children }: { children: React.ReactNode }): const ethCurrencyInfo = useCurrencyInfo( buildCurrencyId(UniverseChainId.Mainnet, getNativeAddress(UniverseChainId.Mainnet)), ) - const [quoteCurrency, setQuoteCurrency] = useState( - prefilledCurrency ?? { - currencyInfo: ethCurrencyInfo, - meldCurrencyCode: 'ETH', - }, - ) + const defaultCurrency: FiatOnRampCurrency = { + currencyInfo: ethCurrencyInfo, + meldCurrencyCode: 'ETH', + } + const [quoteCurrency, setQuoteCurrency] = useState(prefilledCurrency ?? defaultCurrency) return ( {children} diff --git a/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx b/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx index b35ffe3e660..e8d101bfccc 100644 --- a/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx +++ b/apps/mobile/src/features/fiatOnRamp/FiatOnRampTokenSelector.tsx @@ -5,6 +5,7 @@ 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' @@ -17,6 +18,9 @@ interface Props { error: boolean loading: boolean list: FiatOnRampCurrency[] | undefined + balancesById: Record | undefined + selectedCurrency?: FiatOnRampCurrency + isOffRamp: boolean } export function FiatOnRampTokenSelectorModal({ @@ -26,6 +30,9 @@ export function FiatOnRampTokenSelectorModal({ onClose, onRetry, onSelectCurrency, + balancesById, + selectedCurrency, + isOffRamp, }: { onClose: () => void } & Props): JSX.Element { const { t } = useTranslation() const colors = useSporeColors() @@ -49,9 +56,12 @@ export function FiatOnRampTokenSelectorModal({ diff --git a/apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx b/apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx new file mode 100644 index 00000000000..e41e1811713 --- /dev/null +++ b/apps/mobile/src/features/fiatOnRamp/OffRampPopover.tsx @@ -0,0 +1,72 @@ +import { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' +import { Popover, Text } from 'ui/src' +import { isAndroid } from 'utilities/src/platform' +import { selectHasViewedOffRampTooltip } from 'wallet/src/features/behaviorHistory/selectors' +import { setHasViewedOffRampTooltip } from 'wallet/src/features/behaviorHistory/slice' + +const POPOVER_OFFSET_X = 31 +const POPOVER_OFFSET_Y = isAndroid ? 42 : 18 +const POPOVER_WIDTH = 200 +const POPOVER_DELAY_MS = 1500 + +export function OffRampPopover({ triggerContent }: { triggerContent: JSX.Element }): JSX.Element { + const { t } = useTranslation() + const dispatch = useDispatch() + const [delayedOpen, setDelayedOpen] = useState(false) + const hasViewedOffRampTooltip = useSelector(selectHasViewedOffRampTooltip) + + useEffect(() => { + setTimeout(() => { + setDelayedOpen(true) + }, POPOVER_DELAY_MS) + }, []) + + function onOpenChange(open: boolean): void { + if (!open) { + dispatch(setHasViewedOffRampTooltip(true)) + } + } + + 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 4dee35062e6..b4148ac80a4 100644 --- a/apps/mobile/src/features/firebase/firebaseDataSaga.ts +++ b/apps/mobile/src/features/firebase/firebaseDataSaga.ts @@ -5,11 +5,12 @@ 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 e57ffd02dc2..bbb2e43fa20 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 { NotImplementedError } from 'utilities/src/errors' +import { PlatformSplitStubError } from 'utilities/src/errors' export default function InputWithSuffix(_props: InputWithSuffixProps): JSX.Element { - throw new NotImplementedError('InputWithSuffix component is not implemented') + throw new PlatformSplitStubError('InputWithSuffix') } 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 7c7fb2177c1..66580e8076e 100644 --- a/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap +++ b/apps/mobile/src/features/import/__snapshots__/GenericImportForm.test.tsx.snap @@ -85,8 +85,9 @@ exports[`GenericImportForm renders a placeholder when there is no value 1`] = ` "borderTopWidth": 1, "color": "#222222", "flexShrink": 1, - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "500", "height": "auto", "lineHeight": 17, "minWidth": 0, @@ -122,8 +123,9 @@ exports[`GenericImportForm renders a placeholder when there is no value 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, } } @@ -204,10 +206,10 @@ exports[`GenericImportForm renders a placeholder when there is no value 1`] = ` style={ { "color": "#FC72FF", - "fontFamily": "Basel-Medium", - "fontSize": 13, + "fontFamily": "Basel Grotesk", + "fontSize": 15, "fontWeight": "500", - "lineHeight": 16, + "lineHeight": 17.25, } } suppressHighlighting={true} diff --git a/apps/mobile/src/features/modals/ModalsState.ts b/apps/mobile/src/features/modals/ModalsState.ts index 511e3172a5f..b13b4d7dabe 100644 --- a/apps/mobile/src/features/modals/ModalsState.ts +++ b/apps/mobile/src/features/modals/ModalsState.ts @@ -16,6 +16,7 @@ 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 1a6d01bf58c..28790687edc 100644 --- a/apps/mobile/src/features/modals/modalSlice.ts +++ b/apps/mobile/src/features/modals/modalSlice.ts @@ -90,9 +90,15 @@ 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 069f9c6f512..6ee5a52560d 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 = 'buttonLabel4', + textVariant = 'buttonLabel2', 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 e3339b02f2e..0024914a28c 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 75548548d1d..ffd71bf32d6 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 'wallet/src/test/fixtures' +import { NFT_COLLECTION } from 'uniswap/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 35ed042ea69..43a5e89b68e 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,8 +93,9 @@ exports[`renders collection preview card 1`] = ` style={ { "color": "#7D7D7D", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, "textAlign": "center", } @@ -138,8 +139,9 @@ exports[`renders collection preview card 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 4c6e07ec4c6..f58225f4cdb 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-Medium", - "fontSize": 13, + "fontFamily": "Basel Grotesk", + "fontSize": 17, "fontWeight": "500", - "lineHeight": 16, + "lineHeight": 19.549999999999997, } } suppressHighlighting={true} @@ -40,8 +40,9 @@ exports[`renders trait card 1`] = ` style={ { "color": "#222222", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "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 51a1665d46f..ba72cfd5194 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 'wallet/src/test/fixtures' +import { NFT_ASSET_TRAIT } from 'uniswap/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 c25b0397f72..6fa510fa022 100644 --- a/apps/mobile/src/features/nfts/item/traits.tsx +++ b/apps/mobile/src/features/nfts/item/traits.tsx @@ -1,6 +1,7 @@ import dayjs from 'dayjs' import React from 'react' -import { FlatList, ListRenderItemInfo, StyleSheet } from 'react-native' +import { ListRenderItemInfo, StyleSheet } from 'react-native' +import { FlatList } from 'react-native-gesture-handler' 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' @@ -29,7 +30,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 89f099f91cf..9a3dcae0782 100644 --- a/apps/mobile/src/features/onboarding/BackupSpeedBumpModal.tsx +++ b/apps/mobile/src/features/onboarding/BackupSpeedBumpModal.tsx @@ -1,7 +1,7 @@ -import { useState } from 'react' +import { useMemo, 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' +import { Button, Flex, LabeledCheckbox, Text, useIsDarkMode, useShadowPropsShort } from 'ui/src' import { CheckCircleFilled } from 'ui/src/components/icons' import { Modal } from 'uniswap/src/components/modals/Modal' import { ModalName } from 'uniswap/src/features/telemetry/constants' @@ -19,30 +19,29 @@ export function BackupSpeedBumpModal({ backupType, onContinue, onClose }: Backup const { t } = useTranslation() const [checked, setChecked] = useState(false) - 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 - } + 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]) return ( {preview} - {title} @@ -61,7 +60,7 @@ export function BackupSpeedBumpModal({ backupType, onContinue, onClose }: Backup py="$spacing16" onPress={() => setChecked(!checked)} > - { @@ -69,7 +68,7 @@ export function BackupSpeedBumpModal({ backupType, onContinue, onClose }: Backup }} /> - {t('onboarding.backup.speedBump.disclaimer')} + {disclaimer} diff --git a/apps/mobile/src/features/onboarding/OnboardingScreen.tsx b/apps/mobile/src/features/onboarding/OnboardingScreen.tsx index 0b9b8714bf2..bd83bb6b3d1 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 { renderHeaderBackButton } from 'src/app/navigation/components' +import { HeaderSkipButton, 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, SpaceTokens, Text, useDeviceInsets, useMedia } from 'ui/src' +import { Flex, GeneratedIcon, 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,19 +14,23 @@ 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() @@ -40,13 +44,16 @@ 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]), + }, [navigation, disableGoBack, onSkip]), ) return ( @@ -62,15 +69,16 @@ export function OnboardingScreen({ > {/* Text content */} - + + {Icon && ( + + + + + + )} {title && ( - + {title} )} @@ -80,7 +88,7 @@ export function OnboardingScreen({ color="$neutral2" maxFontSizeMultiplier={media.short ? 1.1 : fonts.body2.maxFontSizeMultiplier} textAlign="center" - variant="body2" + variant="subheading2" > {subtitle} diff --git a/apps/mobile/src/features/onboarding/OptionCard.tsx b/apps/mobile/src/features/onboarding/OptionCard.tsx index 15134505bca..41f528beac1 100644 --- a/apps/mobile/src/features/onboarding/OptionCard.tsx +++ b/apps/mobile/src/features/onboarding/OptionCard.tsx @@ -47,24 +47,25 @@ 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 3816a55bb50..6f491d0e0e8 100644 --- a/apps/mobile/src/features/onboarding/SafeKeyboardOnboardingScreen.tsx +++ b/apps/mobile/src/features/onboarding/SafeKeyboardOnboardingScreen.tsx @@ -4,13 +4,14 @@ 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, SpaceTokens, Text, useMedia, useSporeColors } from 'ui/src' +import { Flex, GeneratedIcon, 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 @@ -19,6 +20,7 @@ type OnboardingScreenProps = { export function SafeKeyboardOnboardingScreen({ title, subtitle, + Icon, children, footer, paddingTop = '$none', @@ -42,14 +44,21 @@ 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 40debb481b5..9eda0414d3c 100644 --- a/apps/mobile/src/features/onboarding/hooks.ts +++ b/apps/mobile/src/features/onboarding/hooks.ts @@ -1,9 +1,11 @@ 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 { OnboardingEntryPoint } from 'uniswap/src/types/onboarding' +import { ImportType, 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' @@ -28,8 +30,16 @@ 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 }) + await finishOnboarding({ importType, createdFromOnboardingRedesign }) // 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 67e379ffe7c..8ab07d501a9 100644 --- a/apps/mobile/src/features/openai/AIAssistantScreen.tsx +++ b/apps/mobile/src/features/openai/AIAssistantScreen.tsx @@ -6,8 +6,9 @@ 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, useAvatar } from 'wallet/src/features/wallet/hooks' +import { useActiveAccountAddress } 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 c99dc0688bf..5b24ea79214 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 { AlertTriangle, Faceid, Laptop, LinkBrokenHorizontal, Wifi } from 'ui/src/components/icons' +import { AlertTriangleFilled, 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 3763357f7cd..13868c5064b 100644 --- a/apps/mobile/src/features/send/SendFormButton.tsx +++ b/apps/mobile/src/features/send/SendFormButton.tsx @@ -4,10 +4,11 @@ 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 { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { 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 8c232d9d1d0..616fed1eec1 100644 --- a/apps/mobile/src/features/send/SendFormScreen.tsx +++ b/apps/mobile/src/features/send/SendFormScreen.tsx @@ -2,7 +2,6 @@ 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' @@ -12,19 +11,10 @@ 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 { TokenSearchResult } from 'uniswap/src/features/search/SearchResult' -import { selectSearchHistory } from 'uniswap/src/features/search/selectSearchHistory' +import { useLocalizationContext } from 'uniswap/src/features/language/LocalizationContext' import { ModalName } from 'uniswap/src/features/telemetry/constants' -import { useTokenWarningDismissed } from 'uniswap/src/features/tokens/slice/hooks' import { TransactionModalFooterContainer, TransactionModalInnerContainer, @@ -32,15 +22,7 @@ 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' @@ -124,12 +106,8 @@ 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() @@ -162,22 +140,10 @@ export function SendFormContent({ Keyboard.dismiss()} diff --git a/apps/mobile/src/features/send/SendHeader.tsx b/apps/mobile/src/features/send/SendHeader.tsx index 2b3a40d4df4..c195b3eeeea 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 656e532afe5..b08641ff9d0 100644 --- a/apps/mobile/src/features/send/SendTokenForm.tsx +++ b/apps/mobile/src/features/send/SendTokenForm.tsx @@ -13,6 +13,7 @@ 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' @@ -30,7 +31,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 { useIsBlocked, useIsBlockedActiveAddress } from 'wallet/src/features/trm/hooks' +import { 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 2e07b057d69..b60c2d68939 100644 --- a/apps/mobile/src/features/unitags/ChooseProfilePictureScreen.tsx +++ b/apps/mobile/src/features/unitags/ChooseProfilePictureScreen.tsx @@ -8,12 +8,15 @@ 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 } from 'ui/src/components/icons' +import { Pen, Photo } 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' @@ -36,6 +39,7 @@ function convertEntryPointToAnalyticsSource(entryPoint: UnitagEntryPoint): Unita } export function ChooseProfilePictureScreen({ + navigation, route, }: UnitagStackScreenProp): JSX.Element { const { entryPoint, unitag, unitagFontSize, address } = route.params @@ -120,8 +124,30 @@ 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 aae88ed39ec..99ca5fbec6a 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 { useAddBackButton } from 'src/utils/useAddBackButton' +import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { AnimatePresence, Button, Flex, Image, Text, TouchableArea, useSporeColors } from 'ui/src' import { ENS_LOGO } from 'ui/src/assets' -import { InfoCircleFilled, LinkHorizontalAlt } from 'ui/src/components/icons' +import { InfoCircleFilled, LinkHorizontalAlt, Person } 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,8 +20,7 @@ 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 Trace from 'uniswap/src/features/telemetry/Trace' -import { ElementName, ModalName, UnitagEventName } from 'uniswap/src/features/telemetry/constants' +import { 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' @@ -57,7 +56,6 @@ type Props = NativeStackScreenProps { + const onPressSkip = (): void => { const onboardingExperimentEnabled = getExperimentValue( Experiments.OnboardingRedesignRecoveryBackup, OnboardingRedesignRecoveryBackupProperties.Enabled, @@ -164,6 +162,9 @@ 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) { @@ -246,7 +247,7 @@ export function ClaimUnitagScreen({ navigation, route }: Props): JSX.Element { : t('unitags.onboarding.claim.title.choose') return ( - + {UNITAG_SUFFIX} @@ -355,15 +356,6 @@ 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 b83b50030e5..1e61f6696ee 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 { useAddBackButton } from 'src/utils/useAddBackButton' +import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { Flex, Loader } from 'ui/src' -import { OSDynamicCloudIcon } from 'ui/src/components/icons' +import { DownloadAlt, 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) - useAddBackButton(navigation) + useNavigationHeader(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 ad7a767df4f..9178fd379ab 100644 --- a/apps/mobile/src/screens/Import/RestoreCloudBackupPasswordScreen.tsx +++ b/apps/mobile/src/screens/Import/RestoreCloudBackupPasswordScreen.tsx @@ -16,8 +16,10 @@ import { import { selectLockoutEndTime, selectPasswordAttempts } from 'src/features/CloudBackup/selectors' import { OnboardingScreen } from 'src/features/onboarding/OnboardingScreen' import { PasswordError } from 'src/features/onboarding/PasswordError' -import { useAddBackButton } from 'src/utils/useAddBackButton' +import { onRestoreComplete } from 'src/screens/Import/onRestoreComplete' +import { useNavigationHeader } from 'src/utils/useNavigationHeader' 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' @@ -77,6 +79,7 @@ export function RestoreCloudBackupPasswordScreen({ navigation, route: { params } const isRestoringMnemonic = params.importType === ImportType.RestoreMnemonic + const [isLoading, setIsLoading] = useState(false) const [enteredPassword, setEnteredPassword] = useState('') const [errorMessage, setErrorMessage] = useState(undefined) @@ -100,7 +103,7 @@ export function RestoreCloudBackupPasswordScreen({ navigation, route: { params } }, [isLockedOut, lockoutMessage, remainingLockoutTime, dispatch]), ) - useAddBackButton(navigation) + useNavigationHeader(navigation) const onPasswordSubmit = async (): Promise => { if (isLockedOut || enteredPassword.length === 0) { @@ -110,15 +113,15 @@ export function RestoreCloudBackupPasswordScreen({ navigation, route: { params } // Attempt to restore backup with encrypted mnemonic using password async function checkCorrectPassword(): Promise { try { + setIsLoading(true) await restoreMnemonicFromCloudStorage(params.mnemonicId, enteredPassword) await generateImportedAccounts({ mnemonicId: params.mnemonicId, backupType: BackupType.Cloud }) dispatch(resetPasswordAttempts()) - // restore flow is handled in saga after `restoreMnemonicComplete` is dispatched - if (!isRestoringMnemonic) { - navigation.navigate({ name: OnboardingScreens.SelectWallet, params, merge: true }) - } + setIsLoading(false) + onRestoreComplete({ isRestoringMnemonic, dispatch, params, navigation }) } catch (error) { + setIsLoading(false) dispatch(incrementPasswordAttempts()) const updatedLockoutEndTime = calculateLockoutEndTime(passwordAttemptCount + 1) if (updatedLockoutEndTime) { @@ -141,6 +144,7 @@ export function RestoreCloudBackupPasswordScreen({ navigation, route: { params } return ( @@ -164,12 +168,16 @@ 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 82bcc0b73d8..e92bda0d2b4 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 { useAddBackButton } from 'src/utils/useAddBackButton' +import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { Flex, Text, TouchableArea, Unicon, useIsDarkMode } from 'ui/src' -import { RotatableChevron } from 'ui/src/components/icons' +import { DownloadAlt, 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,10 +34,11 @@ export function RestoreCloudBackupScreen({ navigation, route: { params } }: Prop }) } - useAddBackButton(navigation) + useNavigationHeader(navigation) return ( @@ -64,7 +65,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 e084588f9a6..70c97e33867 100644 --- a/apps/mobile/src/screens/Import/SeedPhraseInputScreen.android.mock.tsx +++ b/apps/mobile/src/screens/Import/SeedPhraseInputScreen.android.mock.tsx @@ -1,11 +1,13 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import React, { useCallback, useState } from 'react' import { useTranslation } from 'react-i18next' +import { useDispatch } from 'react-redux' 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 { useAddBackButton } from 'src/utils/useAddBackButton' +import { onRestoreComplete } from 'src/screens/Import/onRestoreComplete' +import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { Button, Flex, Text, TouchableArea } from 'ui/src' import { QuestionInCircleFilled } from 'ui/src/components/icons' import { uniswapUrls } from 'uniswap/src/constants/urls' @@ -31,6 +33,7 @@ type Props = NativeStackScreenProps { const { error, invalidWord } = validateMnemonic(value) diff --git a/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx b/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx index f816cf0f6a9..e185f842607 100644 --- a/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx +++ b/apps/mobile/src/screens/Import/SeedPhraseInputScreen.tsx @@ -2,6 +2,7 @@ import { NativeStackScreenProps } from '@react-navigation/native-stack' import React, { useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { NativeSyntheticEvent } from 'react-native' +import { useDispatch } from 'react-redux' import { OnboardingStackParamList } from 'src/app/navigation/types' import { useLockScreenOnBlur } from 'src/features/authentication/lockScreenContext' import { SafeKeyboardOnboardingScreen } from 'src/features/onboarding/SafeKeyboardOnboardingScreen' @@ -13,9 +14,10 @@ import { StringKey, handleSubmit, } from 'src/screens/Import/SeedPhraseInput' -import { useAddBackButton } from 'src/utils/useAddBackButton' +import { onRestoreComplete } from 'src/screens/Import/onRestoreComplete' +import { useNavigationHeader } from 'src/utils/useNavigationHeader' import { Button, Flex, Text, TouchableArea } from 'ui/src' -import { QuestionInCircleFilled } from 'ui/src/components/icons' +import { PapersText, 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' @@ -31,6 +33,7 @@ type Props = NativeStackScreenProps(null) const isRestoringMnemonic = params.importType === ImportType.RestoreMnemonic - useAddBackButton(navigation) + useNavigationHeader(navigation) const signerAccounts = useSignerAccounts() const targetMnemonicId = (isRestoringMnemonic && signerAccounts[0]?.mnemonicId) || undefined @@ -56,12 +59,9 @@ export function SeedPhraseInputScreen({ navigation, route: { params } }: Props): async (storedMnemonicId: string) => { await generateImportedAccounts({ mnemonicId: storedMnemonicId, backupType: BackupType.Manual }) - // restore flow is handled in saga after `restoreMnemonicComplete` is dispatched - if (!isRestoringMnemonic) { - navigation.navigate({ name: OnboardingScreens.SelectWallet, params, merge: true }) - } + onRestoreComplete({ isRestoringMnemonic, dispatch, params, navigation }) }, - [generateImportedAccounts, isRestoringMnemonic, navigation, params], + [dispatch, generateImportedAccounts, isRestoringMnemonic, navigation, params], ) const onPressRecoveryHelpButton = (): Promise => openUri(uniswapUrls.helpArticleUrls.recoveryPhraseHowToImport) @@ -72,6 +72,7 @@ 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 725f6a986ed..d6a5a856f7d 100644 --- a/apps/mobile/src/screens/Onboarding/CloudBackupPasswordConfirmScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/CloudBackupPasswordConfirmScreen.tsx @@ -1,13 +1,14 @@ 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 { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' -import { useExperimentValue } from 'uniswap/src/features/gating/hooks' +import { Cloud } from 'ui/src/components/icons' +import { OnboardingEntryPoint } from 'uniswap/src/types/onboarding' import { OnboardingScreens } from 'uniswap/src/types/screens/mobile' import { BackupType } from 'wallet/src/features/wallet/accounts/types' @@ -16,17 +17,14 @@ export type Props = NativeStackScreenProps { + setShowSpeedBumpModal(false) navigation.navigate({ name: OnboardingScreens.BackupCloudProcessing, params, @@ -42,10 +40,18 @@ export function CloudBackupPasswordConfirmScreen({ navigation, route: { params } passwordToConfirm={password} > setShowSpeedBumpModal(true) : undefined} + onPressContinue={ + onboardingExperimentEnabled + ? (): void => { + Keyboard.dismiss() + setShowSpeedBumpModal(true) + } + : undefined + } /> } diff --git a/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx b/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx index e71e8bb1d7f..80df22d33f5 100644 --- a/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/CloudBackupPasswordCreateScreen.tsx @@ -5,6 +5,7 @@ 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 @@ -29,6 +30,7 @@ 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 786025458e8..edd3b299e91 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 { MobileScreens, OnboardingScreens } from 'uniswap/src/types/screens/mobile' +import { 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: { password, importType, entryPoint, address }, - }, -}: Props): JSX.Element | null { +export function CloudBackupProcessingScreen({ navigation, route: { params } }: Props): JSX.Element | null { + const { password, importType, entryPoint, address } = params + const onBackupComplete = (): void => { if (entryPoint === OnboardingEntryPoint.BackupCard) { - navigate(MobileScreens.Home) + navigation.navigate({ + name: OnboardingScreens.BackupManual, + params: { ...params, fromCloudBackup: true }, + merge: true, + }) } 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 ebaa3edfc94..055801f1d2a 100644 --- a/apps/mobile/src/screens/Onboarding/LandingScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/LandingScreen.tsx @@ -11,6 +11,8 @@ import { TermsOfService } from 'src/screens/Onboarding/TermsOfService' import { hideSplashScreen } from 'src/utils/splashScreen' import { Flex, Text, TouchableArea, useHapticFeedback } from 'ui/src' import { AnimatedFlex } from 'ui/src/components/layout/AnimatedFlex' +import { Experiments, OnboardingRedesignRecoveryBackupProperties } from 'uniswap/src/features/gating/experiments' +import { getExperimentValue } from 'uniswap/src/features/gating/hooks' import Trace from 'uniswap/src/features/telemetry/Trace' import { ElementName, ModalName } from 'uniswap/src/features/telemetry/constants' import { TestID } from 'uniswap/src/test/fixtures/testIDs' @@ -18,9 +20,11 @@ import { ImportType, OnboardingEntryPoint } from 'uniswap/src/types/onboarding' import { OnboardingScreens, UnitagScreens } from 'uniswap/src/types/screens/mobile' import { isDevEnv } from 'utilities/src/environment' import { isDetoxBuild } from 'utilities/src/environment/constants' +import { logger } from 'utilities/src/logger/logger' import { ONE_SECOND_MS } from 'utilities/src/time/time' import { useTimeout } from 'utilities/src/time/timing' import { LANDING_ANIMATION_DURATION, LandingBackground } from 'wallet/src/components/landing/LandingBackground' +import { useOnboardingContext } from 'wallet/src/features/onboarding/OnboardingContext' import { useCanAddressClaimUnitag } from 'wallet/src/features/unitags/hooks' type Props = NativeStackScreenProps @@ -41,20 +45,45 @@ export function LandingScreen({ navigation }: Props): JSX.Element { }, [actionButtonsOpacity]) const { canClaimUnitag } = useCanAddressClaimUnitag() + const { getOnboardingAccount, generateOnboardingAccount } = useOnboardingContext() - const onPressCreateWallet = useCallback((): void => { + const onPressCreateWallet = useCallback(async (): Promise => { if (canClaimUnitag) { navigation.navigate(UnitagScreens.ClaimUnitag, { entryPoint: OnboardingScreens.Landing, }) } else { - // If can't claim, go direct to welcome screen - navigation.navigate(OnboardingScreens.WelcomeWallet, { - importType: ImportType.CreateNew, - entryPoint: OnboardingEntryPoint.FreshInstallOrReplace, - }) + const onboardingExperimentEnabled = getExperimentValue( + Experiments.OnboardingRedesignRecoveryBackup, + OnboardingRedesignRecoveryBackupProperties.Enabled, + false, + ) + + if (onboardingExperimentEnabled) { + const onboardingAccount = getOnboardingAccount() + if (!onboardingAccount) { + try { + await generateOnboardingAccount() + } catch (e) { + logger.error(e, { + tags: { file: 'LandingScreen.tsx', function: 'onPressCreateWallet' }, + }) + } + } + + navigation.navigate(OnboardingScreens.Notifications, { + importType: ImportType.CreateNew, + entryPoint: OnboardingEntryPoint.FreshInstallOrReplace, + }) + } else { + // If can't claim, go direct to welcome screen + navigation.navigate(OnboardingScreens.WelcomeWallet, { + importType: ImportType.CreateNew, + entryPoint: OnboardingEntryPoint.FreshInstallOrReplace, + }) + } } - }, [canClaimUnitag, navigation]) + }, [canClaimUnitag, generateOnboardingAccount, getOnboardingAccount, navigation]) const onPressImportWallet = (): void => { navigation.navigate(OnboardingScreens.ImportMethod, { @@ -93,7 +122,7 @@ export function LandingScreen({ navigation }: Props): JSX.Element { testID={TestID.CreateAccount} onPress={onPressCreateWallet} > - + {t('onboarding.landing.button.create')} @@ -114,9 +143,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 4e677641ab1..c8c4247fe32 100644 --- a/apps/mobile/src/screens/Onboarding/ManualBackupScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/ManualBackupScreen.tsx @@ -13,11 +13,9 @@ 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, Key, Pen } from 'ui/src/components/icons' +import { EyeSlash, FileListLock, GraduationCap, Key, PapersText, 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' @@ -45,11 +43,8 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS const onboardingContextAccount = getOnboardingOrImportedAccount() const activeAccount = useSignerAccountIfExists(params.address) - const onboardingExperimentEnabled = useExperimentValue( - Experiments.OnboardingRedesignRecoveryBackup, - OnboardingRedesignRecoveryBackupProperties.Enabled, - false, - ) + const { entryPoint, fromCloudBackup } = params + const onboardingExperimentEnabled = entryPoint === OnboardingEntryPoint.BackupCard const account = activeAccount || onboardingContextAccount @@ -71,7 +66,7 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS const [displayContinueButtonEnabled, setDisplayContinueButtonEnabled] = useState(!onboardingExperimentEnabled) // warning modal on seed phrase view - const [seedWarningAcknowledged, setSeedWarningAcknowledged] = useState(false) + const [seedWarningAcknowledged, setSeedWarningAcknowledged] = useState(fromCloudBackup ?? false) const onValidationSuccessful = (): void => { setConfirmContinueButtonPressed(true) @@ -88,6 +83,10 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS } } + const finishCloudBackup = (): void => { + navigate(MobileScreens.Home) + } + useEffect(() => { if (view !== View.SeedPhrase) { return @@ -126,8 +125,13 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS case View.SeedPhrase: return ( - @@ -165,6 +173,7 @@ export function ManualBackupScreen({ navigation, route: { params } }: Props): JS case View.SeedPhraseConfirm: return ( - - setConfirmContinueButtonEnabled(true)} - /> - - + + + setConfirmContinueButtonEnabled(true)} + /> + - - + + + ) } diff --git a/apps/mobile/src/screens/Onboarding/SecuritySetupScreen.tsx b/apps/mobile/src/screens/Onboarding/SecuritySetupScreen.tsx index b264ec34eed..a93872bb493 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, Text, TouchableArea, useIsDarkMode, useSporeColors } from 'ui/src' +import { Button, Flex, 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 onMaybeLaterPressed = useCallback(async () => { + const onSkipPressed = useCallback(async () => { if (params?.importType === ImportType.Watch) { await onPressNext() } else { @@ -107,6 +107,7 @@ export function SecuritySetupScreen({ route: { params } }: Props): JSX.Element { )} @@ -139,22 +141,13 @@ 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 447d6f5eaa8..45c0c27b1b4 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 6478597d4de..e3a63dcd786 100644 --- a/apps/mobile/src/screens/Onboarding/WelcomeWalletScreen.tsx +++ b/apps/mobile/src/screens/Onboarding/WelcomeWalletScreen.tsx @@ -5,11 +5,14 @@ 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 { useAddBackButton } from 'src/utils/useAddBackButton' +import { useNavigationHeader } from 'src/utils/useNavigationHeader' 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' @@ -18,7 +21,6 @@ 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, @@ -33,7 +35,7 @@ type Props = CompositeScreenProps< > export function WelcomeWalletScreen({ navigation, route: { params } }: Props): JSX.Element { - useAddBackButton(navigation) + useNavigationHeader(navigation) useCreateOnboardingAccountIfNone() const { getOnboardingAccountAddress, getUnitagClaim } = useOnboardingContext() @@ -49,8 +51,14 @@ 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: OnboardingScreens.Backup, + name: onboardingExperimentEnabled ? OnboardingScreens.Notifications : OnboardingScreens.Backup, merge: true, params, }) @@ -121,7 +129,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 78ad4f7b1d5..077ed7331a8 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": 12, + "gap": 8, "justifyContent": "center", "marginBottom": 12, "marginLeft": 12, @@ -67,22 +67,110 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` } } > + + + + + + + + + - Choose a backup method + Choose your backup method - Backups let you restore your wallet if you delete the app or lose your device + This is how you will recover your wallet if you delete the app or lose your device. @@ -201,19 +290,15 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FC72FF1f", + "backgroundColor": "#FEF4FF", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 24, + "height": 28, "justifyContent": "center", - "paddingBottom": 16, - "paddingLeft": 16, - "paddingRight": 16, - "paddingTop": 16, - "width": 24, + "width": 28, } } > @@ -246,8 +331,8 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` ] } tintColor="#FC72FF" - vbHeight={24} - vbWidth={24} + vbHeight={16} + vbWidth={16} > @@ -304,21 +397,64 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` } } > - + + Set a recovery password + + + - iCloud backup - + + Quick + + - Encrypt your recovery phrase with a secure password + Back up your wallet via iCloud, protected by a recovery password. @@ -397,27 +534,75 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FC72FF1f", + "backgroundColor": "#FEF4FF", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 24, + "height": 28, "justifyContent": "center", - "paddingBottom": 16, - "paddingLeft": 16, - "paddingRight": 16, - "paddingTop": 16, - "width": 24, + "width": 28, } } > - + + + + + - - Manual backup - + + Write down recovery phrase + + - Write your recovery phrase down and store it in a safe location + Record your 12 secret words on a piece of paper and store it in a safe place. @@ -587,8 +783,9 @@ exports[`BackupScreen renders backup options when none are completed 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, } } @@ -663,7 +860,7 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` { "alignItems": "center", "flexDirection": "column", - "gap": 12, + "gap": 8, "justifyContent": "center", "marginBottom": 12, "marginLeft": 12, @@ -672,22 +869,110 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` } } > + + + + + + + + + - Choose a backup method + Choose your backup method - Backups let you restore your wallet if you delete the app or lose your device + This is how you will recover your wallet if you delete the app or lose your device. @@ -806,19 +1092,15 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FC72FF1f", + "backgroundColor": "#FEF4FF", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 24, + "height": 28, "justifyContent": "center", - "paddingBottom": 16, - "paddingLeft": 16, - "paddingRight": 16, - "paddingTop": 16, - "width": 24, + "width": 28, } } > @@ -851,8 +1133,8 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` ] } tintColor="#FC72FF" - vbHeight={24} - vbWidth={24} + vbHeight={16} + vbWidth={16} > @@ -909,21 +1199,64 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` } } > - + + Set a recovery password + + + - iCloud backup - + + Quick + + - Encrypt your recovery phrase with a secure password + Back up your wallet via iCloud, protected by a recovery password. @@ -1002,27 +1336,75 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` style={ { "alignItems": "center", - "backgroundColor": "#FC72FF1f", + "backgroundColor": "#FEF4FF", "borderBottomLeftRadius": 999999, "borderBottomRightRadius": 999999, "borderTopLeftRadius": 999999, "borderTopRightRadius": 999999, "flexDirection": "column", - "height": 24, + "height": 28, "justifyContent": "center", - "paddingBottom": 16, - "paddingLeft": 16, - "paddingRight": 16, - "paddingTop": 16, - "width": 24, + "width": 28, } } > - + + + + + - - Manual backup - + + Write down recovery phrase + + - Write your recovery phrase down and store it in a safe location + Record your 12 secret words on a piece of paper and store it in a safe place. @@ -1192,8 +1585,9 @@ exports[`BackupScreen renders backup options when some are completed 1`] = ` style={ { "color": "#CECECE", - "fontFamily": "Basel-Book", + "fontFamily": "Basel Grotesk", "fontSize": 17, + "fontWeight": "400", "lineHeight": 24, } } diff --git a/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx b/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx index 54a96c801f4..efeb6ff8c6a 100644 --- a/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx +++ b/apps/mobile/src/screens/SettingsBiometricAuthScreen.tsx @@ -19,9 +19,8 @@ import { setRequiredForAppAccess, setRequiredForTransactions, } from 'src/features/biometrics/slice' -import { Flex, Text, TouchableArea } from 'ui/src' +import { Flex, Switch, 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 { @@ -177,7 +176,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 84edc626b49..62df13c673f 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 00fbf9d8567..71640f90d40 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 c0576c368b5..9d48354b87f 100644 --- a/apps/mobile/src/screens/SettingsScreen.tsx +++ b/apps/mobile/src/screens/SettingsScreen.tsx @@ -7,6 +7,7 @@ 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, @@ -40,6 +41,8 @@ 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' @@ -50,11 +53,13 @@ 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() @@ -73,17 +78,23 @@ export function SettingsScreen(): JSX.Element { const hideSmallBalances = useHideSmallBalancesSetting() const onToggleHideSmallBalances = useCallback(() => { - dispatch(setHideSmallBalances(!hideSmallBalances)) + setTimeout(() => { + dispatch(setHideSmallBalances(!hideSmallBalances)) + }, AVOID_RENDER_DURING_ANIMATION_MS) }, [dispatch, hideSmallBalances]) const hideSpamTokens = useHideSpamTokensSetting() const onToggleHideSpamTokens = useCallback(() => { - dispatch(setHideSpamTokens(!hideSpamTokens)) + setTimeout(() => { + dispatch(setHideSpamTokens(!hideSpamTokens)) + }, AVOID_RENDER_DURING_ANIMATION_MS) }, [dispatch, hideSpamTokens]) const hapticsUserEnabled = useSelector(selectHapticsEnabled) const onToggleEnableHaptics = useCallback(() => { - dispatch(setHapticsUserSettingEnabled(!hapticsUserEnabled)) + setTimeout(() => { + dispatch(setHapticsUserSettingEnabled(!hapticsUserEnabled)) + }, AVOID_RENDER_DURING_ANIMATION_MS) }, [dispatch, hapticsUserEnabled]) // Signer account info @@ -222,7 +233,7 @@ export function SettingsScreen(): JSX.Element { { screen: MobileScreens.WebView, screenProps: { - uriLink: uniswapUrls.helpUrl, + uriLink: uniswapUrls.helpArticleUrls.walletHelp, headerTitle: t('settings.action.help'), }, text: t('settings.action.help'), @@ -263,6 +274,7 @@ 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 c0be1b1710e..29a46459fb0 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, Text, useSporeColors } from 'ui/src' +import { Button, Flex, Switch, 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,7 +40,6 @@ 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' @@ -138,9 +137,10 @@ 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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

@@ -977,12 +977,12 @@ exports[`OrderContent should render without error, limit order 1`] = `
@@ -1622,12 +1622,12 @@ exports[`OrderContent should render without error, open order 1`] = `
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/EmptyWallet.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/EmptyWallet.tsx index 29339fd7c87..db2f01110dc 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/EmptyWallet.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/EmptyWallet.tsx @@ -52,7 +52,7 @@ export const EmptyWallet = ({ return ( - + diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx index 2528cc26fb1..c9e28a8b956 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/ExtensionDeeplinks.tsx @@ -43,7 +43,7 @@ const DeepLinkButton = ({ Icon, Label, onPress }: { Icon: JSX.Element; Label: st hoverStyle={{ opacity: 0.9 }} > {Icon} - + {Label} diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/LimitDetailActivityRow.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/LimitDetailActivityRow.tsx index 0e1927acc77..5f930842466 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/LimitDetailActivityRow.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/LimitDetailActivityRow.tsx @@ -12,11 +12,11 @@ import { parseUnits } from 'ethers/lib/utils' import { useCurrencyInfo } from 'hooks/Tokens' import { useScreenSize } from 'hooks/screenSize' import styled, { useTheme } from 'lib/styled-components' -import { Checkbox } from 'nft/components/layout/Checkbox' import { useMemo, useState } from 'react' import { ArrowRight } from 'react-feather' import { EllipsisStyle, ThemedText } from 'theme/components' import { UniswapXOrderStatus } from 'types/uniswapx' +import { Checkbox } from 'ui/src' import { Trans } from 'uniswap/src/i18n' import { useFormatter } from 'utils/formatNumbers' @@ -32,10 +32,6 @@ interface LimitDetailActivityRowProps { selected: boolean } -const StyledCheckbox = styled(Checkbox)<{ $visible?: boolean }>` - opacity: ${({ $visible }) => ($visible ? 1 : 0)}; -` - const TradeSummaryContainer = styled(Row)` * { max-width: 40%; @@ -138,12 +134,12 @@ export function LimitDetailActivityRow({ order, onToggleSelect, selected }: Limi }} /> {!cancelling && ( - onToggleSelect(order)} + onPress={() => onToggleSelect(order)} /> )} diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitDetailActivityRow.test.tsx.snap b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitDetailActivityRow.test.tsx.snap index 907432a6d53..31c81e88ad6 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitDetailActivityRow.test.tsx.snap +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitDetailActivityRow.test.tsx.snap @@ -101,69 +101,6 @@ exports[`LimitDetailActivityRow should render with valid details 1`] = ` cursor: pointer; } -.c12 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - position: relative; - overflow: hidden; - cursor: pointer; - line-height: 1; -} - -.c14 { - border-color: #CECECE; - display: inline-block; - margin-right: 1px; - border-radius: 4px; - height: 18px; - width: 18px; - border-style: solid; - border-width: 1.5px; - position: relative; - -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 { - position: absolute; - top: -24px; - -webkit-clip: rect(0 0 0 0); - clip: rect(0 0 0 0); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - height: 1px; - overflow: hidden; - position: absolute; - white-space: nowrap; - width: 1px; -} - -.c16 { - display: none; - height: 18px; - width: 18px; - color: white; - position: absolute; - right: 1px; -} - .c3 { padding: 8px 0; height: unset; @@ -172,10 +109,6 @@ exports[`LimitDetailActivityRow should render with valid details 1`] = ` text-overflow: ellipsis; } -.c13 { - opacity: 0; -} - .c8 * { max-width: 40%; white-space: nowrap; @@ -271,39 +204,18 @@ exports[`LimitDetailActivityRow should render with valid details 1`] = `
- +
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitsMenu.test.tsx.snap b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitsMenu.test.tsx.snap index 922f53857b6..fc4c293b028 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitsMenu.test.tsx.snap +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/LimitsMenu.test.tsx.snap @@ -146,69 +146,6 @@ exports[`LimitsMenu should render when there are two open orders 1`] = ` cursor: pointer; } -.c21 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - position: relative; - overflow: hidden; - cursor: pointer; - line-height: 1; -} - -.c23 { - border-color: #CECECE; - display: inline-block; - margin-right: 1px; - border-radius: 4px; - height: 18px; - width: 18px; - border-style: solid; - border-width: 1.5px; - position: relative; - -webkit-text-decoration: none; - text-decoration: none; - cursor: pointer; - -webkit-transition-duration: 125ms; - transition-duration: 125ms; -} - -.c23:hover { - opacity: 0.6; -} - -.c23:active { - opacity: 0.4; -} - -.c24 { - position: absolute; - top: -24px; - -webkit-clip: rect(0 0 0 0); - clip: rect(0 0 0 0); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - height: 1px; - overflow: hidden; - position: absolute; - white-space: nowrap; - width: 1px; -} - -.c25 { - display: none; - height: 18px; - width: 18px; - color: white; - position: absolute; - right: 1px; -} - .c16 { padding: 8px 0; height: unset; @@ -217,10 +154,6 @@ exports[`LimitsMenu should render when there are two open orders 1`] = ` text-overflow: ellipsis; } -.c22 { - opacity: 0; -} - .c19 * { max-width: 40%; white-space: nowrap; @@ -452,39 +385,18 @@ exports[`LimitsMenu should render when there are two open orders 1`] = `
- +
- +
@@ -738,69 +629,6 @@ exports[`LimitsMenu should render when there is one open order 1`] = ` cursor: pointer; } -.c21 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - position: relative; - overflow: hidden; - cursor: pointer; - line-height: 1; -} - -.c23 { - border-color: #CECECE; - display: inline-block; - margin-right: 1px; - border-radius: 4px; - height: 18px; - width: 18px; - border-style: solid; - border-width: 1.5px; - position: relative; - -webkit-text-decoration: none; - text-decoration: none; - cursor: pointer; - -webkit-transition-duration: 125ms; - transition-duration: 125ms; -} - -.c23:hover { - opacity: 0.6; -} - -.c23:active { - opacity: 0.4; -} - -.c24 { - position: absolute; - top: -24px; - -webkit-clip: rect(0 0 0 0); - clip: rect(0 0 0 0); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - height: 1px; - overflow: hidden; - position: absolute; - white-space: nowrap; - width: 1px; -} - -.c25 { - display: none; - height: 18px; - width: 18px; - color: white; - position: absolute; - right: 1px; -} - .c16 { padding: 8px 0; height: unset; @@ -809,10 +637,6 @@ exports[`LimitsMenu should render when there is one open order 1`] = ` text-overflow: ellipsis; } -.c22 { - opacity: 0; -} - .c19 * { max-width: 40%; white-space: nowrap; @@ -1044,39 +868,18 @@ exports[`LimitsMenu should render when there is one open order 1`] = `
- +
diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/OpenLimitOrdersButton.test.tsx.snap b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/OpenLimitOrdersButton.test.tsx.snap index d757da59075..d9f05cefbeb 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/OpenLimitOrdersButton.test.tsx.snap +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Limits/__snapshots__/OpenLimitOrdersButton.test.tsx.snap @@ -121,7 +121,7 @@ exports[`OpenLimitOrdersButton should render if there are open limit orders 1`] class="c4" > 1 open limit diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/cache.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/cache.ts index f339e578793..e48e6f74f3f 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/cache.ts +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/cache.ts @@ -6,10 +6,10 @@ import { atom, useAtom } from 'jotai' import { atomWithStorage } from 'jotai/utils' import ms from 'ms' import { useCallback } from 'react' -import { SerializedToken } from 'state/user/types' -import { deserializeToken, serializeToken } from 'state/user/utils' import { PositionDetails } from 'types/position' +import { SerializedToken } from 'uniswap/src/features/tokens/slice/types' import { InterfaceChainId } from 'uniswap/src/types/chains' +import { deserializeToken, serializeToken } from 'uniswap/src/utils/currency' import { buildCurrencyKey, currencyKey } from 'utils/currencyKey' export type PositionInfo = { diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioLogo.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioLogo.tsx index 628905f526f..66641f4b479 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioLogo.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/PortfolioLogo.tsx @@ -11,7 +11,7 @@ import { import Identicon from 'components/Identicon' import { ChainLogo } from 'components/Logo/ChainLogo' import styled from 'lib/styled-components' -import React from 'react' +import React, { memo } from 'react' import { Flex, SpinningLoader, styled as TamaguiStyled } from 'ui/src' import { InterfaceChainId, UniverseChainId } from 'uniswap/src/types/chains' @@ -63,7 +63,7 @@ const AbsoluteCenteredElement = TamaguiStyled(Flex, { /** * Renders an image by prioritizing a list of sources, and then eventually a fallback contract icon */ -export function PortfolioLogo(props: PortfolioLogoProps) { +export const PortfolioLogo = memo(function PortfolioLogo(props: PortfolioLogoProps) { return ( @@ -77,12 +77,15 @@ export function PortfolioLogo(props: PortfolioLogoProps) { ) -} +}) function getLogo({ accountAddress, currencies, images, size = LOGO_DEFAULT_SIZE }: PortfolioLogoProps) { if (accountAddress) { return } + if (images && images?.length >= 2) { + return + } if (currencies && currencies.length) { return } @@ -93,8 +96,5 @@ function getLogo({ accountAddress, currencies, images, size = LOGO_DEFAULT_SIZE ) } - if (images && images?.length >= 2) { - return - } return } diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/hooks.ts b/apps/web/src/components/AccountDrawer/MiniPortfolio/hooks.ts index 30846ae41ea..6fa947bf9e3 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/hooks.ts +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/hooks.ts @@ -18,7 +18,11 @@ export function useAccountDrawer() { updateAccountDrawerOpen(false) }, [setShowMoonpayTextInDrawer, updateAccountDrawerOpen]) - return useMemo(() => ({ isOpen, open, close }), [isOpen, open, close]) + const toggle = useCallback(() => { + updateAccountDrawerOpen((prev) => !prev) + }, [updateAccountDrawerOpen]) + + return useMemo(() => ({ isOpen, open, close, toggle }), [isOpen, open, close, toggle]) } // Only show Moonpay text if the user opens the Account Drawer by clicking 'Buy' diff --git a/apps/web/src/components/AccountDrawer/MiniPortfolio/shared.tsx b/apps/web/src/components/AccountDrawer/MiniPortfolio/shared.tsx index 688b2a4ee2c..00675c54954 100644 --- a/apps/web/src/components/AccountDrawer/MiniPortfolio/shared.tsx +++ b/apps/web/src/components/AccountDrawer/MiniPortfolio/shared.tsx @@ -33,7 +33,7 @@ export function TabButton({ text, icon, extraWarning, onClick, disabled, classNa {icon} - + {text} {extraWarning && {extraWarning}} diff --git a/apps/web/src/components/AccountDrawer/SettingsMenu.tsx b/apps/web/src/components/AccountDrawer/SettingsMenu.tsx index b33f07bc790..173bd3e50ef 100644 --- a/apps/web/src/components/AccountDrawer/SettingsMenu.tsx +++ b/apps/web/src/components/AccountDrawer/SettingsMenu.tsx @@ -1,6 +1,5 @@ import { AnalyticsToggle } from 'components/AccountDrawer/AnalyticsToggle' import { GitVersionRow } from 'components/AccountDrawer/GitVersionRow' -import { LanguageMenuItems } from 'components/AccountDrawer/LanguageMenu' import { SlideOutMenu } from 'components/AccountDrawer/SlideOutMenu' import { SmallBalanceToggle } from 'components/AccountDrawer/SmallBalanceToggle' import { SpamToggle } from 'components/AccountDrawer/SpamToggle' @@ -22,11 +21,6 @@ const Container = styled(Column)` justify-content: space-between; ` -const SectionTitle = styled(ThemedText.SubHeader)` - color: ${({ theme }) => theme.neutral2}; - padding-bottom: 24px; -` - const ToggleWrapper = styled.div<{ currencyConversionEnabled?: boolean }>` display: flex; flex-direction: column; @@ -90,12 +84,6 @@ export default function SettingsMenu({ - <> - - - - - )} - + ) } diff --git a/apps/web/src/components/AccountDrawer/UniwalletModal.tsx b/apps/web/src/components/AccountDrawer/UniwalletModal.tsx index 728211a8170..d75b87771f1 100644 --- a/apps/web/src/components/AccountDrawer/UniwalletModal.tsx +++ b/apps/web/src/components/AccountDrawer/UniwalletModal.tsx @@ -64,15 +64,12 @@ export default function UniwalletModal() { {uri && ( diff --git a/apps/web/src/components/AccountDrawer/__snapshots__/index.test.tsx.snap b/apps/web/src/components/AccountDrawer/__snapshots__/index.test.tsx.snap index f1a81a5850c..00c838c56c0 100644 --- a/apps/web/src/components/AccountDrawer/__snapshots__/index.test.tsx.snap +++ b/apps/web/src/components/AccountDrawer/__snapshots__/index.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable is false 1`] = ` +exports[`AccountDrawer tests AccountDrawer default styles 1`] = ` .c7 { box-sizing: border-box; @@ -9,646 +9,20 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i width: 100%; } -.c12 { - box-sizing: border-box; - margin: 0; - min-width: 0; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; -} - -.c8 { - 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: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.c13 { - width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - padding: 0; - -webkit-align-items: flex-start; - -webkit-box-align: flex-start; - -ms-flex-align: flex-start; - align-items: flex-start; - -webkit-box-pack: start; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; -} - -.c9 { - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.c9 > * { - margin: !important; -} - -.c10 { - color: #222222; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; - letter-spacing: -0.01em; -} - -.c22 { - color: #7D7D7D; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; - letter-spacing: -0.01em; -} - -.c23 { - -webkit-text-decoration: none; - text-decoration: none; - cursor: pointer; - -webkit-transition-duration: 125ms; - transition-duration: 125ms; - color: #FC72FF; - stroke: #FC72FF; - font-weight: 500; -} - -.c23:hover { - opacity: 0.6; -} - -.c23:active { - opacity: 0.4; -} - -.c4 { - 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; -} - -.c11 { - 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; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; -} - -.c20 { - 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; -} - -.c17 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: column nowrap; - -ms-flex-flow: column nowrap; - flex-flow: column nowrap; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.c16 { - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - background-color: unset; - border: none; - cursor: pointer; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex: 1 1 auto; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - opacity: 1; - padding: 18px; - -webkit-transition: 125ms; - transition: 125ms; -} - -.c19 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row nowrap; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - color: #222222; - font-size: 16px; - font-weight: 535; - padding: 0 8px; -} - -.c18 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: column nowrap; - -ms-flex-flow: column nowrap; - flex-flow: column nowrap; - -webkit-align-items: center; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} - -.c18 img { - border: 1px solid #22222212; - border-radius: 12px; -} - -.c18 > img, -.c18 span { - height: 40px; - width: 40px; -} - -.c15 { - -webkit-align-items: stretch; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - position: relative; - width: 100%; - background-color: #F9F9F9; -} - -.c15:hover { - cursor: pointer; - background-color: #22222212; -} - -.c15:focus { - background-color: #22222212; -} - -.c24 { - font-weight: 535; - color: #7D7D7D; -} - -.c6 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: column nowrap; - -ms-flex-flow: column nowrap; - flex-flow: column nowrap; - background-color: #FFFFFF; - width: 100%; - padding: 14px 16px 20px; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - gap: 16px; -} - -.c14 { - display: grid; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - grid-gap: 2px; - border-radius: 12px; - overflow: hidden; - opacity: 1; - max-height: 100vh; - -webkit-transition: max-height 125ms ease-in-out,opacity 125ms ease-in-out; - transition: max-height 125ms ease-in-out,opacity 125ms ease-in-out; -} - -.c21 { - padding: 0 4px; -} - -.c5 { - width: 100%; - height: 100%; -} - -.c1 { - z-index: 1040; - overflow: hidden; - top: 0; - left: 0; - position: fixed; - width: 100%; - height: 100%; - background-color: rgba(0,0,0,0.60); - opacity: 0; - pointer-events: none; -} - -.c3 { - overflow-y: auto; - overflow-x: hidden; - -webkit-scrollbar-width: thin; - -moz-scrollbar-width: thin; - -ms-scrollbar-width: thin; - scrollbar-width: thin; - -webkit-scrollbar-color: #22222212 transparent; - -moz-scrollbar-color: #22222212 transparent; - -ms-scrollbar-color: #22222212 transparent; - scrollbar-color: #22222212 transparent; - height: 100%; - overscroll-behavior: contain; - border-radius: 12px; -} - -.c3::-webkit-scrollbar { - background: transparent; - width: 4px; - overflow-y: scroll; -} - -.c3::-webkit-scrollbar-thumb { - background: #22222212; - border-radius: 8px; -} - -.c0 { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - height: calc(100% - 2 * 8px); - position: fixed; - right: 0; - top: 8px; - z-index: 1030; -} - -.c2 { - margin-right: -320px; - height: 100%; - overflow: hidden; - border-radius: 12px; - width: 320px; - max-width: 320px; - font-size: 16px; - background-color: #FFFFFF; - border: 1px solid #22222212; - box-shadow: 8px 12px 20px rgba(51,53,72,0.04),4px 6px 12px rgba(51,53,72,0.02),4px 4px 8px rgba(51,53,72,0.04); - -webkit-transition: margin-right 250ms; - transition: margin-right 250ms; -} - -@media (max-width:960px) { - .c18 { - -webkit-align-items: flex-end; - -webkit-box-align: flex-end; - -ms-flex-align: flex-end; - align-items: flex-end; - } -} - -@media (max-width:960px) { - .c14 { - grid-template-columns: 1fr; - } -} - -@media only screen and (max-width:640px) { - .c1 { - opacity: 0; - pointer-events: none; - -webkit-transition: opacity 250ms ease-in-out; - transition: opacity 250ms ease-in-out; - } -} - -@media only screen and (max-width:640px) { - .c0 { - height: 100%; - top: 100%; - left: 0; - right: 0; - width: 100%; - overflow: visible; - } -} - -@media only screen and (max-width:640px) { - .c2 { - z-index: 1060; - position: absolute; - margin-right: 0; - top: 0; - height: calc(100% - 72px); - width: 100%; - max-width: 100%; - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; - box-shadow: unset; - -webkit-transition: top 250ms; - transition: top 250ms; - } -} - -@media screen and (min-width:1440px) { - .c2 { - margin-right: -390px; - width: 390px; - max-width: 390px; - } -} - - - - -
-
- - - - - -`; - -exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable is true 1`] = ` - - .c7 { - box-sizing: border-box; - margin: 0; - min-width: 0; - width: 100%; -} - -.c13 { +.c14 { box-sizing: border-box; margin: 0; min-width: 0; } -.c17 { +.c20 { box-sizing: border-box; margin: 0; min-width: 0; padding: 8px 0px; } -.c21 { +.c24 { box-sizing: border-box; margin: 0; min-width: 0; @@ -656,7 +30,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i margin-right: 18px; } -.c25 { +.c27 { box-sizing: border-box; margin: 0; min-width: 0; @@ -682,7 +56,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i justify-content: space-between; } -.c14 { +.c15 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -697,10 +71,9 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; - gap: 12px; } -.c16 { +.c18 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -718,7 +91,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i gap: 4px; } -.c18 { +.c19 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -733,10 +106,10 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; - padding: 8px 0px; + gap: 12px; } -.c22 { +.c21 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -751,9 +124,10 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; + padding: 8px 0px; } -.c26 { +.c28 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -784,15 +158,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i margin: !important; } -.c10 { - color: #222222; - -webkit-letter-spacing: -0.01em; - -moz-letter-spacing: -0.01em; - -ms-letter-spacing: -0.01em; - letter-spacing: -0.01em; -} - -.c34 { +.c36 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -800,7 +166,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i letter-spacing: -0.01em; } -.c35 { +.c37 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -811,11 +177,11 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i font-weight: 500; } -.c35:hover { +.c37:hover { opacity: 0.6; } -.c35:active { +.c37:active { opacity: 0.4; } @@ -833,7 +199,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i justify-content: flex-start; } -.c11 { +.c10 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -848,7 +214,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i gap: 16px; } -.c12 { +.c11 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -863,7 +229,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i gap: 12px; } -.c24 { +.c26 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -881,7 +247,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i flex: 1; } -.c30 { +.c32 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -898,7 +264,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i align-items: center; } -.c29 { +.c31 { -webkit-align-items: center; -webkit-box-align: center; -ms-flex-align: center; @@ -926,7 +292,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i transition: 125ms; } -.c32 { +.c34 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -948,7 +314,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i padding: 0 8px; } -.c31 { +.c33 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -966,18 +332,18 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i justify-content: center; } -.c31 img { +.c33 img { border: 1px solid #22222212; border-radius: 12px; } -.c31 > img, -.c31 span { +.c33 > img, +.c33 span { height: 40px; width: 40px; } -.c28 { +.c30 { -webkit-align-items: stretch; -webkit-box-align: stretch; -ms-flex-align: stretch; @@ -998,21 +364,46 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i background-color: #F9F9F9; } -.c28:hover { +.c30:hover { cursor: pointer; background-color: #22222212; } -.c28:focus { +.c30:focus { background-color: #22222212; } -.c36 { +.c38 { font-weight: 535; color: #7D7D7D; } -.c15 { +.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 { padding: 16px; gap: 12px; border-radius: 16px; @@ -1028,10 +419,19 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i z-index: 1; } -.c15:hover { +.c16: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; @@ -1049,7 +449,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i gap: 16px; } -.c27 { +.c29 { display: grid; -webkit-flex: 1; -ms-flex: 1; @@ -1063,11 +463,11 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i transition: max-height 125ms ease-in-out,opacity 125ms ease-in-out; } -.c33 { +.c35 { padding: 0 4px; } -.c19 { +.c22 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -1079,21 +479,21 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i user-select: none; } -.c19:hover { +.c22:hover { opacity: 0.6; } -.c19:active { +.c22:active { opacity: 0.4; } -.c20 { +.c23 { height: 1px; width: 100%; background: #22222212; } -.c23 { +.c25 { height: 20px; width: 20px; fill: #7D7D7D; @@ -1240,7 +640,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i } @media (max-width:960px) { - .c31 { + .c33 { -webkit-align-items: flex-end; -webkit-box-align: flex-end; -ms-flex-align: flex-end; @@ -1249,7 +649,7 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i } @media (max-width:960px) { - .c27 { + .c29 { grid-template-columns: 1fr; } } @@ -1337,20 +737,58 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i class="c7 c8 c9" width="100%" > -
Connect a wallet -
+
+
+
+ uniswap-app-icon +
+
+ + Get Uniswap Wallet + + + Available on iOS, Android, and Chrome + +
+
+
+
+
Uniswap Mobile @@ -1390,13 +828,13 @@ exports[`AccountDrawer tests AccountDrawer styles when isUniExtensionAvailable i
By connecting a wallet, you agree to Uniswap Labs’ and consent to its ({ useIsUniExtensionAvailable: jest.fn(), - useUniswapWalletOptions: jest.fn(), })) describe('AccountDrawer tests', () => { - 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) + it('AccountDrawer default styles', () => { 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 eb167b2726e..66e0b81a436 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' -export const DRAWER_WIDTH = '320px' +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 04b45da9df4..e349269fd29 100644 --- a/apps/web/src/components/AddressQRModal/index.tsx +++ b/apps/web/src/components/AddressQRModal/index.tsx @@ -1,6 +1,5 @@ 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' @@ -12,6 +11,7 @@ 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 { smartColor } = useAvatarColorProps(accountAddress) + const addressColor = useAddressColorProps(accountAddress) const goBack = useCallback(() => { toggleModal() @@ -58,12 +58,8 @@ export function AddressQRModal({ accountAddress }: { accountAddress: Address }) diff --git a/apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx b/apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx deleted file mode 100644 index 9cf7c4b2381..00000000000 --- a/apps/web/src/components/AddressQRModal/useAvatarColorProps.tsx +++ /dev/null @@ -1,82 +0,0 @@ -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/Button/index.tsx b/apps/web/src/components/Button/index.tsx index 51c4e2d8a1b..6a402fa8c48 100644 --- a/apps/web/src/components/Button/index.tsx +++ b/apps/web/src/components/Button/index.tsx @@ -1,8 +1,8 @@ import { RowBetween } from 'components/Row' -import styled, { DefaultTheme, useTheme } from 'lib/styled-components' +import styled, { DefaultTheme } from 'lib/styled-components' import { darken } from 'polished' import { forwardRef } from 'react' -import { Check, ChevronDown } from 'react-feather' +import { ChevronDown } from 'react-feather' import { ButtonProps as ButtonPropsOriginal, Button as RebassButton } from 'rebass/styled-components' export { default as LoadingButtonSpinner } from './LoadingButtonSpinner' @@ -306,17 +306,6 @@ export function ButtonError({ error, ...rest }: { error?: boolean } & BaseButton } } -export function ButtonDropdown({ disabled = false, children, ...rest }: { disabled?: boolean } & ButtonProps) { - return ( - - -
{children}
- -
-
- ) -} - export function ButtonDropdownLight({ disabled = false, children, ...rest }: { disabled?: boolean } & ButtonProps) { return ( @@ -328,58 +317,6 @@ export function ButtonDropdownLight({ disabled = false, children, ...rest }: { d ) } -const ActiveOutlined = styled(ButtonOutlined)` - border: 1px solid; - border-color: ${({ theme }) => theme.accent1}; -` - -const Circle = styled.div` - height: 17px; - width: 17px; - border-radius: 50%; - background-color: ${({ theme }) => theme.accent1}; - display: flex; - align-items: center; - justify-content: center; -` - -const CheckboxWrapper = styled.div` - width: 20px; - padding: 0 10px; - position: absolute; - top: 11px; - right: 15px; -` - -const ResponsiveCheck = styled(Check)` - size: 13px; -` - -export function ButtonRadioChecked({ active = false, children, ...rest }: { active?: boolean } & ButtonProps) { - const theme = useTheme() - - if (!active) { - return ( - - {children} - - ) - } else { - return ( - - - {children} - - - - - - - - ) - } -} - export enum ButtonSize { small, medium, diff --git a/apps/web/src/components/Charts/ChartHeader.tsx b/apps/web/src/components/Charts/ChartHeader.tsx index 138877d5c65..3206ace161e 100644 --- a/apps/web/src/components/Charts/ChartHeader.tsx +++ b/apps/web/src/components/Charts/ChartHeader.tsx @@ -1,76 +1,91 @@ import { useHeaderDateFormatter } from 'components/Charts/hooks' -import Column from 'components/Column' -import Row from 'components/Row' +import { PROTOCOL_LEGEND_ELEMENT_ID } from 'components/Charts/types' import { getProtocolColor, getProtocolName } from 'graphql/data/util' -import styled, { useTheme } from 'lib/styled-components' +import { useTheme } from 'lib/styled-components' import { UTCTimestamp } from 'lightweight-charts' import { ReactElement, ReactNode } from 'react' -import { EllipsisStyle } from 'theme/components' +import { EllipsisTamaguiStyle } from 'theme/components' import { ThemedText } from 'theme/components/text' -import { textFadeIn } from 'theme/styles' +import { Flex, Text, styled } from 'ui/src' 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 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} -` +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', + }, + }, + }, +}) 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 }) - : getProtocolName(protocol) + : isMultichainExploreEnabled + ? null + : getProtocolName(protocol) return ( - - {display} - - + !!display && ( + + {isMultichainExploreEnabled ? ( + + {getProtocolName(protocol)} + + ) : ( + + {display} + + )} + + {isMultichainExploreEnabled && ( + + {display} + + )} + + ) ) }) .reverse()} @@ -93,7 +108,9 @@ function HeaderValueDisplay({ value, valueFormatterType = NumberType.ChartFiatVa } return ( - {formatFiatPrice({ price: value, type: valueFormatterType })} + + {formatFiatPrice({ price: value, type: valueFormatterType })} + ) } @@ -123,16 +140,27 @@ 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 accb5407539..33665a5220d 100644 --- a/apps/web/src/components/Charts/ChartModel.tsx +++ b/apps/web/src/components/Charts/ChartModel.tsx @@ -1,13 +1,12 @@ import { refitChartContentAtom } from 'components/Charts/TimeSelector' -import { SeriesDataItemType } from 'components/Charts/types' +import { PROTOCOL_LEGEND_ELEMENT_ID, 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 styled, { DefaultTheme, useTheme } from 'lib/styled-components' +import { DefaultTheme, useTheme } from 'lib/styled-components' import { BarPrice, CrosshairMode, @@ -21,8 +20,7 @@ import { } from 'lightweight-charts' import { ReactElement, useEffect, useMemo, useRef, useState } from 'react' import { ThemedText } from 'theme/components' -import { textFadeIn } from 'theme/styles' -import { Z_INDEX } from 'theme/zIndex' +import { Flex, TamaguiElement, assertWebElement, styled } from 'ui/src' import { Trans } from 'uniswap/src/i18n' import { useFormatter } from 'utils/formatNumbers' import { v4 as uuidv4 } from 'uuid' @@ -134,6 +132,7 @@ 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})` @@ -141,6 +140,28 @@ 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. */ @@ -219,13 +240,6 @@ 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, @@ -245,7 +259,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() @@ -262,6 +276,7 @@ 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()) @@ -287,7 +302,10 @@ export function Chart, TDataType e useOnClickOutside({ current: chartDivElement } as React.RefObject, () => setCrosshairData(undefined)) return ( - , TDataType e )} {params.stale && } - + ) } -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}; -` +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', +}) 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 586270f94bf..deb9d6067c8 100644 --- a/apps/web/src/components/Charts/PriceChart/index.tsx +++ b/apps/web/src/components/Charts/PriceChart/index.tsx @@ -6,9 +6,7 @@ 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, @@ -22,8 +20,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' @@ -194,14 +192,6 @@ 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 @@ -213,10 +203,10 @@ export function PriceChartDelta({ startingPrice, endingPrice, noColor }: PriceCh const { formatDelta } = useFormatter() return ( - + {formatDelta(delta)} - + ) } @@ -227,33 +217,34 @@ interface PriceChartProps { stale: boolean } -const TooltipText = styled(ThemedText.LabelSmall)` - color: ${({ theme }) => theme.neutral1}; - line-height: 20px; -` +const CandlestickTooltipRow = styled(Flex, { + row: true, + justifyContent: 'space-between', + gap: '$sm', +}) 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 58f8e927806..b12f22e4c54 100644 --- a/apps/web/src/components/Charts/SparklineChart/index.tsx +++ b/apps/web/src/components/Charts/SparklineChart/index.tsx @@ -1,11 +1,16 @@ 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%; @@ -25,7 +30,7 @@ const SparkLineLoadingBubble = styled(LongLoadingBubble)` interface SparklineChartProps { width: number height: number - tokenData: TopToken + tokenData: TopToken | TokenStat pricePercentChange?: number | null sparklineMap: SparklineMap } @@ -33,7 +38,12 @@ interface SparklineChartProps { function _SparklineChart({ width, height, tokenData, pricePercentChange, sparklineMap }: SparklineChartProps) { const theme = useTheme() // for sparkline - const pricePoints = tokenData?.address ? sparklineMap[tokenData.address] : null + 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 // 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 904826ec0c6..e33a17ea6a5 100644 --- a/apps/web/src/components/Charts/StackedLineChart/index.tsx +++ b/apps/web/src/components/Charts/StackedLineChart/index.tsx @@ -22,6 +22,7 @@ export interface StackedLineData extends WhitespaceData { interface TVLChartParams extends ChartModelParams { colors: string[] + gradients?: { start: string; end: string }[] } export class TVLChartModel extends ChartModel { @@ -74,7 +75,7 @@ export class TVLChartModel extends ChartModel { }, ...gridSettings, }) - const { data, colors } = params + const { data, colors, gradients } = params // Handles changes in data, e.g. time period selection if (this.data !== data) { @@ -87,6 +88,7 @@ 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 c1f163059bb..7a8396316ae 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,6 +8,7 @@ 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 } @@ -15,5 +16,6 @@ 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 fdd7418c415..beca9f26631 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,35 +80,47 @@ export class StackedAreaSeriesRenderer implements options.hoveredLogicalIndex, ) - const areaPaths = this._createAreas(linesMeshed) + const fullLinesMeshed = linesMeshed.slice(0, 3) + const highlightLinesMeshed = options.hoveredLogicalIndex ? linesMeshed.slice(3) : [] + + const areaPaths = this._createAreas(fullLinesMeshed) 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 { - 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 + } else if (!isMultichainExploreEnabled) { + ctx.globalAlpha = isHovered ? 0.24 : 1 } - ctx.fillStyle = options.colors[index % colorsCount] + 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.fill(areaPath) }) - ctx.globalAlpha = 1 - - ctx.lineWidth = options.lineWidth * renderingScope.verticalPixelRatio + ctx.lineWidth = options.lineWidth * (isMultichainExploreEnabled ? 1 : renderingScope.verticalPixelRatio) ctx.lineJoin = 'round' - linesMeshed.toReversed().forEach((linePath, index) => { - const unreversedIndex = linesMeshed.length - index + fullLinesMeshed.toReversed().forEach((linePath, index) => { + const unreversedIndex = fullLinesMeshed.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 !== linesMeshed.length - 1) { + if (index !== fullLinesMeshed.length - 1) { // Line rendering: ctx.beginPath() ctx.strokeStyle = color @@ -117,6 +129,8 @@ 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 @@ -143,6 +157,26 @@ 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 */ @@ -156,6 +190,8 @@ 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 @@ -194,6 +230,18 @@ 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 @@ -231,6 +279,20 @@ 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 @@ -249,6 +311,10 @@ 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 4563ec74b7e..0acc2f65d19 100644 --- a/apps/web/src/components/Charts/TimeSelector.tsx +++ b/apps/web/src/components/Charts/TimeSelector.tsx @@ -1,54 +1,56 @@ 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 styled from 'lib/styled-components' +import { Flex, Text, styled } from 'ui/src' export const refitChartContentAtom = atom<(() => void) | undefined>(undefined) const DEFAULT_TIME_SELECTOR_OPTIONS = ORDERED_TIMES.map((time: TimePeriod) => ({ time, display: DISPLAYS[time] })) -const TimeOptionsWrapper = styled.div` - display: flex; - width: 100%; - justify-content: flex-end; -` +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 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};`} - } -` +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, +}) interface TimePeriodSelectorOption { time: TimePeriod // Value to be selected/stored, used as default display value @@ -69,24 +71,29 @@ 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 bdac192755e..a4ec685b139 100644 --- a/apps/web/src/components/Charts/VolumeChart/CrosshairHighlightPrimitive.tsx +++ b/apps/web/src/components/Charts/VolumeChart/CrosshairHighlightPrimitive.tsx @@ -54,6 +54,7 @@ interface CrosshairHighlightData { interface HighlightBarCrosshairOptions { color: string crosshairYPosition: number + useThinCrosshair?: boolean } class CrosshairHighlightPaneRenderer implements ISeriesPrimitivePaneRenderer { @@ -81,16 +82,25 @@ class CrosshairHighlightPaneRenderer implements ISeriesPrimitivePaneRenderer { ) * 0.035 const crosshairXPosition = crosshairPos.position + margin - // Modification: use rounded rectangle + // Modification: use centered 2px wide line to top ctx.beginPath() - ctx.roundRect( - crosshairXPosition, - crosshairYPosition, - crosshairPos.length, - scope.bitmapSize.height - crosshairYPosition, - 9, - ) - ctx.fill() + 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() + } // 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 561d6b32bd0..91f1a36e15f 100644 --- a/apps/web/src/components/Charts/VolumeChart/CustomVolumeChartModel.tsx +++ b/apps/web/src/components/Charts/VolumeChart/CustomVolumeChartModel.tsx @@ -1,13 +1,16 @@ 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 } from 'components/Charts/VolumeChart/renderer' -import { BarPrice, ISeriesApi } from 'lightweight-charts' +import { CustomHistogramData, CustomHistogramSeriesOptions } from 'components/Charts/VolumeChart/renderer' +import { BarPrice, DeepPartial, ISeriesApi, Logical } 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 @@ -15,11 +18,18 @@ 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 })) + this.series = this.api.addCustomSeries( + new CustomHistogramSeries({ + colors: params.colors, + isMultichainExploreEnabled: params.isMultichainExploreEnabled, + background: params.background, + }), + ) this.series.setData(this.data) @@ -27,11 +37,21 @@ 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 d5f9fb500d8..53e04c96173 100644 --- a/apps/web/src/components/Charts/VolumeChart/custom-histogram-series.tsx +++ b/apps/web/src/components/Charts/VolumeChart/custom-histogram-series.tsx @@ -23,10 +23,14 @@ 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 8338c073133..a857bf38676 100644 --- a/apps/web/src/components/Charts/VolumeChart/renderer.tsx +++ b/apps/web/src/components/Charts/VolumeChart/renderer.tsx @@ -13,6 +13,7 @@ import { CustomData, CustomSeriesOptions, ICustomSeriesPaneRenderer, + Logical, PaneRendererCustomData, PriceToCoordinateConverter, Time, @@ -27,7 +28,7 @@ export interface SingleHistogramData extends CustomData { } export interface StackedHistogramData extends CustomData { - values: Record + values: Record time: UTCTimestamp } @@ -41,32 +42,43 @@ interface BarItem { export interface CustomHistogramSeriesOptions extends CustomSeriesOptions { colors: string[] + hoveredLogicalIndex?: Logical } function cumulativeBuildUp(data: StackedHistogramData): number[] { let sum = 0 - return Object.values(data.values).map((value) => { - const newValue = sum + value - sum = newValue - return newValue - }) + return Object.values(data.values) + .filter((value: number | undefined): value is number => value !== undefined) + .map((value) => { + const newValue = sum + value + sum = newValue + return newValue + }) } 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)) + target.useBitmapCoordinateSpace((scope) => + this._drawImpl(scope, priceConverter, this._options?.hoveredLogicalIndex), + ) } update(data: PaneRendererCustomData, options: CustomHistogramSeriesOptions): void { @@ -74,7 +86,11 @@ export class CustomHistogramSeriesRenderer im this._options = options } - _drawImpl(renderingScope: BitmapCoordinatesRenderingScope, priceToCoordinate: PriceToCoordinateConverter): void { + _drawImpl( + renderingScope: BitmapCoordinatesRenderingScope, + priceToCoordinate: PriceToCoordinateConverter, + hoveredIndex?: number | null, + ): void { if ( this._data === null || this._data.bars.length === 0 || @@ -120,16 +136,36 @@ 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() - ctx.roundRect(column.left + margin, totalBox.position, width - margin, totalBox.length, 8) + + 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.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/VolumeChart/utils.ts b/apps/web/src/components/Charts/VolumeChart/utils.ts index 30be9b505f2..b247b2666e6 100644 --- a/apps/web/src/components/Charts/VolumeChart/utils.ts +++ b/apps/web/src/components/Charts/VolumeChart/utils.ts @@ -8,7 +8,11 @@ export function isStackedHistogramData(data: CustomHistogramData): data is Stack // Get summed value of each bar of data export function getCumulativeSum(data: CustomHistogramData): number { - return isStackedHistogramData(data) ? Object.values(data.values).reduce((sum, curr) => (sum += curr), 0) : data.value + return isStackedHistogramData(data) + ? Object.values(data.values) + .filter((value: number | undefined): value is number => value !== undefined) + .reduce((sum, curr) => (sum += curr), 0) + : data.value } // Get summed value of all bars of data diff --git a/apps/web/src/components/Charts/types.ts b/apps/web/src/components/Charts/types.ts index 3d22348ccd2..6a463df48ca 100644 --- a/apps/web/src/components/Charts/types.ts +++ b/apps/web/src/components/Charts/types.ts @@ -1,3 +1,5 @@ import { SeriesDataItemTypeMap, SeriesOptionsMap, Time } from 'lightweight-charts' export type SeriesDataItemType = SeriesDataItemTypeMap
- - - - - - - {children} - - - - - - ) -} - -export function SubmittedView({ children, onDismiss, hash }: { children: any; onDismiss: () => void; hash?: string }) { - const theme = useTheme() - const { chainId } = useAccount() - - return ( - - -
- - - - - - - {children} - {chainId && hash && ( - - - - - - )} - - - ) -} diff --git a/apps/web/src/components/NavBar/ChainSelector/ChainSelectorRow.tsx b/apps/web/src/components/NavBar/ChainSelector/ChainSelectorRow.tsx index ab62bf7f57a..f28422703a1 100644 --- a/apps/web/src/components/NavBar/ChainSelector/ChainSelectorRow.tsx +++ b/apps/web/src/components/NavBar/ChainSelector/ChainSelectorRow.tsx @@ -57,7 +57,7 @@ const CaptionText = styled.div` interface ChainSelectorRowProps { disabled?: boolean targetChain: InterfaceChainId - onSelectChain: (targetChain: number) => void + onSelectChain?: (targetChain: number) => void isPending: boolean } export default function ChainSelectorRow({ disabled, targetChain, onSelectChain, isPending }: ChainSelectorRowProps) { @@ -75,7 +75,7 @@ export default function ChainSelectorRow({ disabled, targetChain, onSelectChain, data-testid={`${label}-selector`} $disabled={!!disabled} onClick={() => { - if (!disabled) { + if (!disabled && onSelectChain) { onSelectChain(targetChain) } }} diff --git a/apps/web/src/components/NavBar/ChainSelector/index.tsx b/apps/web/src/components/NavBar/ChainSelector/index.tsx index a8741706561..2888fce2440 100644 --- a/apps/web/src/components/NavBar/ChainSelector/index.tsx +++ b/apps/web/src/components/NavBar/ChainSelector/index.tsx @@ -51,6 +51,7 @@ type ChainSelectorProps = { hideArrow?: boolean } export const ChainSelector = ({ isNavSelector, hideArrow }: ChainSelectorProps) => { + const account = useAccount() const { chainId, setSelectedChainId, multichainUXEnabled } = useSwapAndLimitContext() // multichainFlagEnabled is different from multichainUXEnabled, multichainUXEnabled applies to swap // flag can be true but multichainUXEnabled can be false (TDP page) @@ -108,11 +109,7 @@ export const ChainSelector = ({ isNavSelector, hideArrow }: ChainSelectorProps) [multichainUXEnabled, setSelectedChainId, selectChain, searchParams, setSearchParams], ) - const menuLabel = !chainId ? ( - - ) : ( - - ) + const isUnsupportedConnectedChain = account.isConnected && !isSupportedChain(account.chainId) if (multichainFlagEnabled) { return ( @@ -120,6 +117,7 @@ export const ChainSelector = ({ isNavSelector, hideArrow }: ChainSelectorProps) + ) : ( + + ) + return ( @@ -146,13 +151,7 @@ export const ChainSelector = ({ isNavSelector, hideArrow }: ChainSelectorProps) /> ))} {unsupportedChains.map((selectorChain) => ( - undefined} - targetChain={selectorChain} - key={selectorChain} - isPending={false} - /> + ))} diff --git a/apps/web/src/components/NavBar/CompanyMenu/Content.tsx b/apps/web/src/components/NavBar/CompanyMenu/Content.tsx index 081416f0c62..c3cc398c5a8 100644 --- a/apps/web/src/components/NavBar/CompanyMenu/Content.tsx +++ b/apps/web/src/components/NavBar/CompanyMenu/Content.tsx @@ -28,6 +28,7 @@ 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/GetTheAppButton.test.tsx b/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.test.tsx deleted file mode 100644 index 63ad1c4f8ac..00000000000 --- a/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.test.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { render, screen } from 'test-utils/render' - -beforeEach(() => { - window.matchMedia = jest.fn().mockImplementation(() => ({ - addListener: jest.fn(), - removeListener: jest.fn(), - })) -}) - -import { GetTheAppButton } from 'components/NavBar/DownloadApp/GetTheAppButton' - -describe('GetTheAppButton', () => { - it('displays a button with call to action text and icons', () => { - 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 deleted file mode 100644 index e6a3184f892..00000000000 --- a/apps/web/src/components/NavBar/DownloadApp/GetTheAppButton.tsx +++ /dev/null @@ -1,35 +0,0 @@ -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 67690c76023..eff7750525c 100644 --- a/apps/web/src/components/NavBar/DownloadApp/Modal/Content.tsx +++ b/apps/web/src/components/NavBar/DownloadApp/Modal/Content.tsx @@ -1,12 +1,22 @@ -import { PropsWithChildren } from 'react' +import { useIsAccountCTAExperimentControl } from 'components/NavBar/accountCTAsExperimentUtils' +import { useScreenSize } from 'hooks/screenSize' +import { PropsWithChildren, ReactNode } from 'react' import { ThemedText } from 'theme/components' -import { Flex, Image } from 'ui/src' +import { Flex, Image, Text } from 'ui/src' import { UNISWAP_LOGO } from 'ui/src/assets' import { iconSizes } from 'ui/src/theme' -export function ModalContent({ title, subtext, children }: PropsWithChildren<{ title: string; subtext: string }>) { - return ( - +export function ModalContent({ + title, + subtext, + rightThumbnail, + children, +}: PropsWithChildren<{ title: string; subtext: string; rightThumbnail?: ReactNode }>) { + const { isControl: isAccountCTAExperimentControl } = useIsAccountCTAExperimentControl() + const showRightThumbnail = useScreenSize()['lg'] + + return isAccountCTAExperimentControl ? ( + @@ -18,5 +28,23 @@ export function ModalContent({ title, subtext, children }: PropsWithChildren<{ t {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 4b945afdfc4..43d20ea0eb5 100644 --- a/apps/web/src/components/NavBar/DownloadApp/Modal/GetStarted.tsx +++ b/apps/web/src/components/NavBar/DownloadApp/Modal/GetStarted.tsx @@ -2,17 +2,22 @@ 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 { GooglePlayStoreLogo } from 'components/Icons/GooglePlayStoreLogo' import { ModalContent } from 'components/NavBar/DownloadApp/Modal/Content' +import { AccountCTAsExperimentGroup } from 'components/NavBar/accountCTAsExperimentUtils' import styled, { useTheme } from 'lib/styled-components' import { Wiggle } from 'pages/Landing/components/animations' import { PropsWithChildren } from 'react' -import { Flex, Text } from 'ui/src' +import { StyledInternalLink } from 'theme/components' +import { Button, Flex, Text, styled as tamaguiStyled } 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 { useTranslation } from 'uniswap/src/i18n' +import { ElementName } from 'uniswap/src/features/telemetry/constants' +import { Trans, useTranslation } from 'uniswap/src/i18n' const WiggleIcon = styled(Wiggle)` flex: 0; @@ -41,14 +46,37 @@ const Card = styled(Column)` } } ` -const RightContent = styled.div` - margin-top: 4px; + +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; ` function CardInfo({ title, details, children }: PropsWithChildren<{ title: string; details: string }>) { return ( - - + + {title} @@ -56,16 +84,78 @@ function CardInfo({ title, details, children }: PropsWithChildren<{ title: strin {details} - {children} + {children} ) } -export function GetStarted({ toAppDownload }: { toAppDownload: () => void }) { +export function GetStarted({ + toAppDownload, + toConnectWalletDrawer, +}: { + toAppDownload: () => void + toConnectWalletDrawer: () => void +}) { const theme = useTheme() const { t } = useTranslation() - return ( - + + 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')} + + + ), + }} + /> + + + + ) : ( + @@ -77,7 +167,7 @@ export function GetStarted({ toAppDownload }: { toAppDownload: () => void }) { - + diff --git a/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx b/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx index effa676d7ee..3a1a8a96600 100644 --- a/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx +++ b/apps/web/src/components/NavBar/DownloadApp/Modal/index.tsx @@ -1,37 +1,51 @@ import { InterfaceModalName } from '@uniswap/analytics-events' +import { useAccountDrawer } from 'components/AccountDrawer/MiniPortfolio/hooks' import Modal from 'components/Modal' +import { useIsAccountCTAExperimentControl } from 'components/NavBar/accountCTAsExperimentUtils' import { GetStarted } from 'components/NavBar/DownloadApp/Modal/GetStarted' import { GetTheApp } from 'components/NavBar/DownloadApp/Modal/GetTheApp' -import styled, { css } from 'lib/styled-components' +import styled 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 { ClickableStyle } from 'theme/components' -import { AnimateTransition, Flex } from 'ui/src' -import { iconSizes } from 'ui/src/theme' +import { ClickableTamaguiStyle } from 'theme/components' +import { AnimateTransition, Flex, styled as tamaguiStyled } from 'ui/src' +import { iconSizes, zIndices } from 'ui/src/theme' import Trace from 'uniswap/src/features/telemetry/Trace' const StyledModal = styled(Modal)` display: block; ` -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} -` + +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, +}) enum Page { GetStarted = 'GetStarted', @@ -47,23 +61,57 @@ export function GetTheAppModal() { setTimeout(() => setPage(Page.GetStarted), 500) }, [closeModal, setPage]) const showBackButton = page !== Page.GetStarted + const accountDrawer = useAccountDrawer() + + const { isControl: isAccountCTAExperimentControl } = useIsAccountCTAExperimentControl() return ( - - - - {showBackButton && setPage(Page.GetStarted)} size={iconSizes.icon24} />} - - + + + {showBackButton && setPage(Page.GetStarted)} size={iconSizes.icon24} />} + + + - setPage(Page.GetApp)} /> + setPage(Page.GetApp)} + toConnectWalletDrawer={() => { + close() + accountDrawer.open() + }} + /> - + ) diff --git a/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.test.tsx b/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.test.tsx new file mode 100644 index 00000000000..2aeba3a6cce --- /dev/null +++ b/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.test.tsx @@ -0,0 +1,29 @@ +import { AccountCTAsExperimentGroup } from 'components/NavBar/accountCTAsExperimentUtils' +import { NewUserCTAButton } from 'components/NavBar/DownloadApp/NewUserCTAButton' +import { mocked } from 'test-utils/mocked' +import { render, screen } from 'test-utils/render' +import { useExperimentGroupNameWithLoading } from 'uniswap/src/features/gating/hooks' + +jest.mock('uniswap/src/features/gating/hooks', () => ({ + useFeatureFlag: jest.fn(), +})) + +beforeEach(() => { + window.matchMedia = jest.fn().mockImplementation(() => ({ + addListener: jest.fn(), + removeListener: jest.fn(), + })) + mocked(useExperimentGroupNameWithLoading).mockReturnValue({ + value: AccountCTAsExperimentGroup.Control, + isLoading: false, + }) +}) + +describe('NewUserCTAButton', () => { + it('displays a button with call to action text and icons', () => { + const { container } = render() + + expect(container).toMatchSnapshot() + expect(screen.getByText('Get the app')).toBeVisible() + }) +}) diff --git a/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx b/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx new file mode 100644 index 00000000000..b536b533cfd --- /dev/null +++ b/apps/web/src/components/NavBar/DownloadApp/NewUserCTAButton.tsx @@ -0,0 +1,55 @@ +import { + AccountCTAsExperimentGroup, + useIsAccountCTAExperimentControl, +} from 'components/NavBar/accountCTAsExperimentUtils' +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 { isControl: 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 deleted file mode 100644 index c793ce325ac..00000000000 --- a/apps/web/src/components/NavBar/DownloadApp/__snapshots__/GetTheAppButton.test.tsx.snap +++ /dev/null @@ -1,38 +0,0 @@ -// 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 new file mode 100644 index 00000000000..ce044612c64 --- /dev/null +++ b/apps/web/src/components/NavBar/DownloadApp/__snapshots__/NewUserCTAButton.test.tsx.snap @@ -0,0 +1,34 @@ +// 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 06682f0c602..f4a01ea23b8 100644 --- a/apps/web/src/components/NavBar/MobileBottomBar/MobileBottomBar.tsx +++ b/apps/web/src/components/NavBar/MobileBottomBar/MobileBottomBar.tsx @@ -1,26 +1,35 @@ -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.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; - } -` +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, +}) diff --git a/apps/web/src/components/NavBar/PreferencesMenu/Preferences.tsx b/apps/web/src/components/NavBar/PreferencesMenu/Preferences.tsx index 9da6ba2eb74..30780385fbb 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 7a73bd8bfbe..08179c095fa 100644 --- a/apps/web/src/components/NavBar/SearchBar/RecentlySearchedAssets.ts +++ b/apps/web/src/components/NavBar/SearchBar/RecentlySearchedAssets.ts @@ -1,122 +1,49 @@ +import { chainIdToBackendChain } from 'constants/chains' import { NATIVE_CHAIN_ID, nativeOnChain } from 'constants/tokens' -import { SearchToken, TokenSearchResultWeb } from 'graphql/data/SearchTokens' -import { supportedChainIdFromGQLChain } from 'graphql/data/util' -import { useAtom } from 'jotai' -import { atomWithStorage, useAtomValue } from 'jotai/utils' +import { GqlSearchToken } from 'graphql/data/SearchTokens' import { GenieCollection } from 'nft/types' -import { useCallback, useMemo } from 'react' -import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' +import { useMemo } from 'react' +import { useSelector } from 'react-redux' +import { MAX_RECENT_SEARCH_RESULTS } from 'uniswap/src/components/TokenSelector/hooks' import { Chain, NftCollection, useRecentlySearchedAssetsQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -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 { + 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 { 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], - ) -} -// Used by NavBar -export function useAddRecentlySearchedAsset() { - const [searchHistory, updateSearchHistory] = useAtom(recentlySearchedAssetsAtom) +export type InterfaceRemoteSearchHistoryItem = GqlSearchToken | GenieCollection - 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]) +export function useRecentlySearchedAssets(): { data?: InterfaceRemoteSearchHistoryItem[]; loading: boolean } { + const history = useSelector(selectSearchHistory) + const shortenedHistory = useMemo(() => history.slice(0, MAX_RECENT_SEARCH_RESULTS), [history]) const { data: queryData, loading } = useRecentlySearchedAssetsQuery({ variables: { - 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, - })), + collectionAddresses: shortenedHistory.filter(isNFTCollectionSearchResult).map((asset) => asset.address), + contracts: shortenedHistory.filter(isTokenSearchResult).map((token) => ({ + address: token.address ?? undefined, + chain: chainIdToBackendChain({ chainId: token.chainId }), + })), }, + skip: shortenedHistory.length === 0, }) - const data = useMemo(() => { + const data = useMemo((): InterfaceRemoteSearchHistoryItem[] | undefined => { 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]: GenieCollection | SearchToken } = {} + const resultsMap: { [key: string]: InterfaceRemoteSearchHistoryItem } = {} const queryCollections = queryData?.nftCollections?.edges.map((edge) => edge.node as NonNullable) const collections = queryCollections?.map( @@ -141,32 +68,11 @@ export function useRecentlySearchedAssets() { } }) - 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) - } + const data: InterfaceRemoteSearchHistoryItem[] = [] + shortenedHistory.forEach((asset: SearchResult) => { + const result = generateInterfaceHistoryItem(asset, resultsMap) + if (result) { + data.push(result) } }) return data @@ -174,3 +80,46 @@ export function useRecentlySearchedAssets() { 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 4fda1e9e2df..a372ccd93d2 100644 --- a/apps/web/src/components/NavBar/SearchBar/SearchBarDropdown.tsx +++ b/apps/web/src/components/NavBar/SearchBar/SearchBarDropdown.tsx @@ -1,27 +1,28 @@ import { InterfaceSectionName, NavBarSearchTypes } from '@uniswap/analytics-events' import Badge from 'components/Badge' -import Column from 'components/Column' -import { ScrollBarStyles } from 'components/Common' import { ChainLogo } from 'components/Logo/ChainLogo' -import { useRecentlySearchedAssets } from 'components/NavBar/SearchBar/RecentlySearchedAssets' +import { + InterfaceRemoteSearchHistoryItem, + useRecentlySearchedAssets, +} from 'components/NavBar/SearchBar/RecentlySearchedAssets' import { SkeletonRow, SuggestionRow } from 'components/NavBar/SearchBar/SuggestionRow' -import Row from 'components/Row' +import QuestionHelper from 'components/QuestionHelper' import { SuspendConditionally } from 'components/Suspense/SuspendConditionally' import { SuspenseWithPreviousRenderAsFallback } from 'components/Suspense/SuspenseWithPreviousRenderAsFallback' import { BACKEND_NOT_YET_SUPPORTED_CHAIN_IDS } from 'constants/chains' -import { SearchToken } from 'graphql/data/SearchTokens' +import { GqlSearchToken } from 'graphql/data/SearchTokens' import useTrendingTokens from 'graphql/data/TrendingTokens' import { useTrendingCollections } from 'graphql/data/nft/TrendingCollections' import { useAccount } from 'hooks/useAccount' import { useDisableNFTRoutes } from 'hooks/useDisableNFTRoutes' import { useIsNftPage } from 'hooks/useIsNftPage' -import styled from 'lib/styled-components' +import deprecatedStyled from 'lib/styled-components' import { GenieCollection } from 'nft/types' import { useEffect, useMemo, useState } from 'react' import { Clock, TrendingUp } from 'react-feather' import { useLocation } from 'react-router-dom' import { ThemedText } from 'theme/components' -import { Flex } from 'ui/src' +import { Flex, Text, useScrollbarStyles } from 'ui/src' import { UNIVERSE_CHAIN_INFO } from 'uniswap/src/constants/chains' import { HistoryDuration, SafetyLevel } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' import { InterfaceSearchResultSelectionProperties } from 'uniswap/src/features/telemetry/types' @@ -29,34 +30,12 @@ import { Trans } from 'uniswap/src/i18n' import { InterfaceChainId } from 'uniswap/src/types/chains' import { useTrace } from 'utilities/src/telemetry/trace/TraceContext' -const SearchBarDropdownContainer = styled(Column)<{ $loading: boolean }>` - width: 100%; - backdrop-filter: blur(60px); - overflow-y: auto; - transition: 125; - opacity: ${({ $loading }) => ($loading ? '0.3' : '1')}; - ${ScrollBarStyles} -` -const DropdownHeader = styled(Row)` - color: ${({ theme }) => theme.neutral2}; - line-height: 20px; - padding: 4px 16px; - font-weight: 500; - font-size: 14px; -` -const NotFoundContainer = styled.div` - font-size: 14px; - line-height: 20px; - font-weight: 500; - color: ${({ theme }) => theme.neutral2}; - padding: 4px 16px; -` - interface SearchBarDropdownSectionProps { toggleOpen: () => void - suggestions: (GenieCollection | SearchToken | undefined)[] + suggestions: (InterfaceRemoteSearchHistoryItem | undefined)[] header: JSX.Element headerIcon?: JSX.Element + headerInfoText?: JSX.Element hoveredIndex?: number startingIndex: number setHoveredIndex: (index: number | undefined) => void @@ -69,6 +48,7 @@ function SearchBarDropdownSection({ suggestions, header, headerIcon = undefined, + headerInfoText, hoveredIndex, startingIndex, setHoveredIndex, @@ -77,10 +57,11 @@ function SearchBarDropdownSection({ }: SearchBarDropdownSectionProps) { return ( - + {headerIcon ? headerIcon : null} - {header} - + {header} + {headerInfoText ? : null} + {suggestions.map((suggestion, index) => isLoading || !suggestion ? ( @@ -107,11 +88,11 @@ function SearchBarDropdownSection({ ) } -function isKnownToken(token: SearchToken) { +function isKnownToken(token: GqlSearchToken) { return token.project?.safetyLevel == SafetyLevel.Verified || token.project?.safetyLevel == SafetyLevel.MediumWarning } -const ChainComingSoonBadge = styled(Badge)` +const ChainComingSoonBadge = deprecatedStyled(Badge)` align-items: center; background-color: ${({ theme }) => theme.surface2}; color: ${({ theme }) => theme.neutral2}; @@ -127,7 +108,7 @@ const ChainComingSoonBadge = styled(Badge)` interface SearchBarDropdownProps { toggleOpen: () => void - tokens: SearchToken[] + tokens: GqlSearchToken[] collections: GenieCollection[] queryText: string hasInput: boolean @@ -139,9 +120,19 @@ export function SearchBarDropdown(props: SearchBarDropdownProps) { const account = useAccount() const showChainComingSoonBadge = account.chainId && BACKEND_NOT_YET_SUPPORTED_CHAIN_IDS.includes(account.chainId) && !isLoading + const scrollBarStyles = useScrollbarStyles() return ( - + @@ -155,7 +146,7 @@ export function SearchBarDropdown(props: SearchBarDropdownProps) { )} - + ) } @@ -168,7 +159,7 @@ function SearchBarDropdownContents({ }: SearchBarDropdownProps): JSX.Element { const [hoveredIndex, setHoveredIndex] = useState(0) const { data: searchHistory } = useRecentlySearchedAssets() - const shortenedHistory = useMemo(() => searchHistory ?? [...Array(2)], [searchHistory]) + const shortenedHistory = useMemo(() => searchHistory ?? [...Array(2)], [searchHistory]) const { pathname } = useLocation() const isNFTPage = useIsNftPage() const isTokenPage = pathname.includes('/explore') @@ -201,7 +192,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], ) @@ -265,9 +256,11 @@ function SearchBarDropdownContents({ header={} /> ) : ( - - - + + + + + ) const collectionSearchResults = @@ -285,9 +278,9 @@ function SearchBarDropdownContents({ header={} /> ) : ( - + - +
) return hasInput ? ( @@ -337,6 +330,7 @@ function SearchBarDropdownContents({ }} header={} headerIcon={} + headerInfoText={} isLoading={!trendingTokenData} /> )} @@ -353,6 +347,7 @@ function SearchBarDropdownContents({ }} header={} headerIcon={} + headerInfoText={} isLoading={trendingCollectionsAreLoading} /> )} diff --git a/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx b/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx index be2cf4d89d4..4fb26e9ecd6 100644 --- a/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx +++ b/apps/web/src/components/NavBar/SearchBar/SuggestionRow.tsx @@ -1,23 +1,24 @@ 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 { SearchToken } from 'graphql/data/SearchTokens' +import { GqlSearchToken } 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 { TokenStandard } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' +import { addToSearchHistory } from 'uniswap/src/features/search/searchHistorySlice' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' import { InterfaceSearchResultSelectionProperties } from 'uniswap/src/features/telemetry/types' import { Trans, useTranslation } from 'uniswap/src/i18n' @@ -80,7 +81,7 @@ const SecondaryContainer = styled(Column)` ` interface SuggestionRowProps { - suggestion: GenieCollection | SearchToken + suggestion: GenieCollection | GqlSearchToken isHovered: boolean setHoveredIndex: (index: number | undefined) => void toggleOpen: () => void @@ -88,8 +89,8 @@ interface SuggestionRowProps { eventProperties: InterfaceSearchResultSelectionProperties } -function suggestionIsToken(suggestion: GenieCollection | SearchToken): suggestion is SearchToken { - return (suggestion as SearchToken).decimals !== undefined +function suggestionIsToken(suggestion: GenieCollection | GqlSearchToken): suggestion is GqlSearchToken { + return (suggestion as GqlSearchToken).decimals !== undefined } export function SuggestionRow({ @@ -102,7 +103,7 @@ export function SuggestionRow({ }: SuggestionRowProps) { const { t } = useTranslation() const isToken = suggestionIsToken(suggestion) - const addRecentlySearchedAsset = useAddRecentlySearchedAsset() + const dispatch = useDispatch() const navigate = useNavigate() const { formatFiatPrice, formatDelta, formatNumberOrString } = useFormatter() const [brokenCollectionImage, setBrokenCollectionImage] = useState(false) @@ -114,21 +115,21 @@ export function SuggestionRow({ const handleClick = useCallback(() => { const address = !suggestion.address && suggestion.standard === TokenStandard.Native ? NATIVE_CHAIN_ID : suggestion.address - 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) + + 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 })) + } toggleOpen() sendAnalyticsEvent(InterfaceEventName.NAVBAR_RESULT_SELECTED, { ...eventProperties }) - }, [suggestion, isToken, addRecentlySearchedAsset, toggleOpen, eventProperties]) + }, [suggestion, isToken, toggleOpen, eventProperties, dispatch]) const path = isToken ? getTokenDetailsURL({ ...suggestion }) : `/nfts/collection/${suggestion.address}` // Close the modal on escape diff --git a/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap b/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap index da67ed55370..e3090c69137 100644 --- a/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap +++ b/apps/web/src/components/NavBar/SearchBar/__snapshots__/SearchBarDropdown.test.tsx.snap @@ -1,21 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`disable nft on searchbar dropdown should not render popular nft collections 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; -} - -.c7 { +.c5 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -30,31 +16,7 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect gap: 8px; } -.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: 8px; -} - -.c9 { +.c7 { border-radius: 12px; border-radius: 12px; height: 20px; @@ -69,7 +31,7 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect background-size: 400%; } -.c10 { +.c8 { border-radius: 12px; border-radius: 12px; height: 20px; @@ -84,7 +46,7 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect background-size: 400%; } -.c11 { +.c9 { border-radius: 12px; border-radius: 12px; height: 16px; @@ -99,7 +61,7 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect background-size: 400%; } -.c12 { +.c10 { border-radius: 12px; border-radius: 12px; height: 16px; @@ -114,7 +76,7 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect background-size: 400%; } -.c5 { +.c3 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -137,11 +99,11 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect transition: background 250ms ease; } -.c5:hover { +.c3:hover { background: #22222212; } -.c6 { +.c4 { width: 36px; height: 36px; border-radius: 9999px; @@ -151,46 +113,54 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect flex-shrink: 0; } -.c8 { +.c6 { width: 100%; } -.c1 { - width: 100%; - -webkit-backdrop-filter: blur(60px); - backdrop-filter: blur(60px); - overflow-y: auto; - -webkit-transition: 125; - transition: 125; - opacity: 1; - -webkit-scrollbar-width: thin; - -moz-scrollbar-width: thin; - -ms-scrollbar-width: thin; - scrollbar-width: thin; - -webkit-scrollbar-color: #22222212 transparent; - -moz-scrollbar-color: #22222212 transparent; - -ms-scrollbar-color: #22222212 transparent; - scrollbar-color: #22222212 transparent; - height: 100%; +.c0 { + display: inline-block; + height: inherit; } -.c1::-webkit-scrollbar { - background: transparent; - width: 4px; - overflow-y: scroll; +.c1 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0px; + width: 18px; + height: 18px; + border: none; + background: none; + outline: none; + cursor: default; + border-radius: 36px; + font-size: 12px; + border-radius: 12px; } -.c1::-webkit-scrollbar-thumb { - background: #22222212; - border-radius: 8px; +.c1:hover, +.c1:focus { + opacity: 0.7; } -.c4 { - color: #7D7D7D; - line-height: 20px; - padding: 4px 16px; - font-weight: 500; +.c2 { font-size: 14px; + margin-left: 8px; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #7D7D7D; + margin-top: 2.5px; }
@@ -205,7 +175,8 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect class=" t_light _dsp_contents is_Theme" >
- Popular tokens + + Popular tokens + + +
+
+
+ + + + + +
+
+
+
@@ -270,12 +275,12 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
@@ -284,27 +289,27 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect
@@ -313,12 +318,12 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
@@ -327,27 +332,27 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect
@@ -356,12 +361,12 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
@@ -380,21 +385,7 @@ exports[`disable nft on searchbar dropdown should not render popular nft collect `; exports[`disable nft on searchbar dropdown should render popular nft collections 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; -} - -.c7 { +.c5 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -409,31 +400,7 @@ exports[`disable nft on searchbar dropdown should render popular nft collections gap: 8px; } -.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: 8px; -} - -.c9 { +.c7 { border-radius: 12px; border-radius: 12px; height: 20px; @@ -448,7 +415,7 @@ exports[`disable nft on searchbar dropdown should render popular nft collections background-size: 400%; } -.c10 { +.c8 { border-radius: 12px; border-radius: 12px; height: 20px; @@ -463,7 +430,7 @@ exports[`disable nft on searchbar dropdown should render popular nft collections background-size: 400%; } -.c11 { +.c9 { border-radius: 12px; border-radius: 12px; height: 16px; @@ -478,7 +445,7 @@ exports[`disable nft on searchbar dropdown should render popular nft collections background-size: 400%; } -.c12 { +.c10 { border-radius: 12px; border-radius: 12px; height: 16px; @@ -493,7 +460,7 @@ exports[`disable nft on searchbar dropdown should render popular nft collections background-size: 400%; } -.c5 { +.c3 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -516,11 +483,11 @@ exports[`disable nft on searchbar dropdown should render popular nft collections transition: background 250ms ease; } -.c5:hover { +.c3:hover { background: #22222212; } -.c6 { +.c4 { width: 36px; height: 36px; border-radius: 9999px; @@ -530,46 +497,54 @@ exports[`disable nft on searchbar dropdown should render popular nft collections flex-shrink: 0; } -.c8 { +.c6 { width: 100%; } -.c1 { - width: 100%; - -webkit-backdrop-filter: blur(60px); - backdrop-filter: blur(60px); - overflow-y: auto; - -webkit-transition: 125; - transition: 125; - opacity: 1; - -webkit-scrollbar-width: thin; - -moz-scrollbar-width: thin; - -ms-scrollbar-width: thin; - scrollbar-width: thin; - -webkit-scrollbar-color: #22222212 transparent; - -moz-scrollbar-color: #22222212 transparent; - -ms-scrollbar-color: #22222212 transparent; - scrollbar-color: #22222212 transparent; - height: 100%; +.c0 { + display: inline-block; + height: inherit; } -.c1::-webkit-scrollbar { - background: transparent; - width: 4px; - overflow-y: scroll; +.c1 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0px; + width: 18px; + height: 18px; + border: none; + background: none; + outline: none; + cursor: default; + border-radius: 36px; + font-size: 12px; + border-radius: 12px; } -.c1::-webkit-scrollbar-thumb { - background: #22222212; - border-radius: 8px; +.c1:hover, +.c1:focus { + opacity: 0.7; } -.c4 { - color: #7D7D7D; - line-height: 20px; - padding: 4px 16px; - font-weight: 500; +.c2 { font-size: 14px; + margin-left: 8px; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + color: #7D7D7D; + margin-top: 2.5px; }
@@ -584,7 +559,8 @@ exports[`disable nft on searchbar dropdown should render popular nft collections class=" t_light _dsp_contents is_Theme" >
- Popular tokens + + Popular tokens + + +
+
+
+ + + + + +
+
+
+
@@ -649,12 +659,12 @@ exports[`disable nft on searchbar dropdown should render popular nft collections class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
@@ -663,27 +673,27 @@ exports[`disable nft on searchbar dropdown should render popular nft collections
@@ -692,12 +702,12 @@ exports[`disable nft on searchbar dropdown should render popular nft collections class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
@@ -706,27 +716,27 @@ exports[`disable nft on searchbar dropdown should render popular nft collections
@@ -735,12 +745,12 @@ exports[`disable nft on searchbar dropdown should render popular nft collections class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
@@ -755,7 +765,7 @@ exports[`disable nft on searchbar dropdown should render popular nft collections data-testid="searchbar-dropdown" >
- Popular NFT collections + + Popular NFT collections + + +
+
+
+ + + + + +
+
+
+
@@ -810,12 +854,12 @@ exports[`disable nft on searchbar dropdown should render popular nft collections class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
@@ -824,27 +868,27 @@ exports[`disable nft on searchbar dropdown should render popular nft collections
@@ -853,12 +897,12 @@ exports[`disable nft on searchbar dropdown should render popular nft collections class="_display-flex _alignItems-stretch _flexBasis-auto _boxSizing-border-box _position-relative _minHeight-0px _minWidth-0px _flexShrink-0 _flexDirection-row _justifyContent-441309761" >
diff --git a/apps/web/src/components/NavBar/Tabs/TabsContent.tsx b/apps/web/src/components/NavBar/Tabs/TabsContent.tsx index e7c46056f9e..6212af510c1 100644 --- a/apps/web/src/components/NavBar/Tabs/TabsContent.tsx +++ b/apps/web/src/components/NavBar/Tabs/TabsContent.tsx @@ -26,6 +26,7 @@ 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() @@ -80,7 +81,7 @@ export const useTabsContent = (props?: { includeNftsLink?: boolean }): TabsSecti { label: t('common.transactions'), quickKey: 'X', - href: '/explore/transactions', + href: `/explore/transactions${isMultichainExploreEnabled ? '/ethereum' : ''}`, internal: true, }, { label: t('common.nfts'), quickKey: 'N', href: '/nfts', internal: true }, diff --git a/apps/web/src/components/NavBar/accountCTAsExperimentUtils.ts b/apps/web/src/components/NavBar/accountCTAsExperimentUtils.ts new file mode 100644 index 00000000000..dcd3d36cee1 --- /dev/null +++ b/apps/web/src/components/NavBar/accountCTAsExperimentUtils.ts @@ -0,0 +1,16 @@ +import { Experiments } from 'uniswap/src/features/gating/experiments' +import { useExperimentGroupNameWithLoading } 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 { value: experimentGroupName, isLoading } = useExperimentGroupNameWithLoading(Experiments.AccountCTAs) + return { + isControl: experimentGroupName === AccountCTAsExperimentGroup.Control || experimentGroupName === null, + isLoading, + } +} diff --git a/apps/web/src/components/NavBar/index.tsx b/apps/web/src/components/NavBar/index.tsx index 58b89317788..40b81eaa09c 100644 --- a/apps/web/src/components/NavBar/index.tsx +++ b/apps/web/src/components/NavBar/index.tsx @@ -1,15 +1,17 @@ import { Bag } from 'components/NavBar/Bag' import { ChainSelector } from 'components/NavBar/ChainSelector' import { CompanyMenu } from 'components/NavBar/CompanyMenu' -import { GetTheAppButton } from 'components/NavBar/DownloadApp/GetTheAppButton' +import { NewUserCTAButton } from 'components/NavBar/DownloadApp/NewUserCTAButton' import { PreferenceMenu } from 'components/NavBar/PreferencesMenu' import { useTabsVisible } from 'components/NavBar/ScreenSizes' import { SearchBar } from 'components/NavBar/SearchBar' import { Tabs } from 'components/NavBar/Tabs/Tabs' +import { useIsAccountCTAExperimentControl } from 'components/NavBar/accountCTAsExperimentUtils' 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' @@ -66,27 +68,50 @@ const SearchContainer = styled.div` height: 42px; ` -export default function Navbar() { +function useShouldHideChainSelector() { 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 { value: multichainFlagEnabled, isLoading: isMultichainFlagLoading } = useFeatureFlagWithLoading( - FeatureFlags.MultichainUX, - ) - const hideChainSelector = - multichainFlagEnabled || isMultichainFlagLoading - ? isLandingPage || isSendPage || isSwapPage || isLimitPage || isNftPage - : isNftPage + const hideChainSelector = useShouldHideChainSelector() + + const { isControl: isSignInExperimentControl, isLoading: isSignInExperimentControlLoading } = + useIsAccountCTAExperimentControl() return ( diff --git a/apps/web/src/components/Pools/PoolDetails/ChartSection/hooks.ts b/apps/web/src/components/Pools/PoolDetails/ChartSection/hooks.ts index e99a6445f1b..415cb336aa6 100644 --- a/apps/web/src/components/Pools/PoolDetails/ChartSection/hooks.ts +++ b/apps/web/src/components/Pools/PoolDetails/ChartSection/hooks.ts @@ -20,7 +20,14 @@ import { usePoolVolumeHistoryQuery, } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -type PDPChartQueryVars = { address: string; chain: Chain; duration: HistoryDuration; isV3: boolean } +type PDPChartQueryVars = { + addressOrId: string + chain: Chain + duration: HistoryDuration + isV2: boolean + isV3: boolean + isV4: boolean +} export function usePDPPriceChartData( variables: PDPChartQueryVars, poolData: PoolData | undefined, diff --git a/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx b/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx index 501c9af6d93..6c68681c63a 100644 --- a/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx +++ b/apps/web/src/components/Pools/PoolDetails/ChartSection/index.tsx @@ -48,10 +48,6 @@ const ChartTypeSelectorContainer = styled.div` } ` -const StyledChart: typeof Chart = styled(Chart)` - height: ${PDP_CHART_HEIGHT_PX}px; -` - const PDPChartTypeSelector = ({ chartType, onChartTypeChange, @@ -103,8 +99,17 @@ function usePDPChartState( const [timePeriod, setTimePeriod] = useState(TimePeriod.DAY) const [chartType, setChartType] = useState(ChartType.VOLUME) + const isV2 = protocolVersion === ProtocolVersion.V2 const isV3 = protocolVersion === ProtocolVersion.V3 - const variables = { address: poolData?.address ?? '', chain, duration: toHistoryDuration(timePeriod), isV3 } + const isV4 = protocolVersion === ProtocolVersion.V4 + const variables = { + addressOrId: poolData?.address ?? '', + chain, + duration: toHistoryDuration(timePeriod), + isV4, + isV3, + isV2, + } const priceQuery = usePDPPriceChartData(variables, poolData, tokenA, tokenB, isReversed) const volumeQuery = usePDPVolumeChartData(variables) @@ -275,7 +280,7 @@ function PriceChart({ const lastPrice = data[data.length - 1] return ( - + {(crosshairData) => { const displayValue = crosshairData ?? lastPrice const currencyBAmountRaw = Math.floor( @@ -303,7 +308,7 @@ function PriceChart({ /> ) }} - + ) } @@ -399,7 +404,8 @@ 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 9f0cc3e19f3..33b1caae07b 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( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -23,8 +23,8 @@ describe('PoolDetailsHeader', () => { }), ) store.dispatch( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { 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 b2d72090a6e..4b39035d427 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( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -22,8 +22,8 @@ describe('PoolDetailsHeader', () => { }), ) store.dispatch( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { 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 3fad1107592..8133e380231 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( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -30,8 +30,8 @@ describe('PoolDetailsStats', () => { }), ) store.dispatch( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { 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 fc280c11e13..41d25416c95 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( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { chainId: 1, address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', symbol: 'USDC', @@ -45,8 +45,8 @@ describe('PoolDetailsStatsButton', () => { }), ) store.dispatch( - addSerializedToken({ - serializedToken: { + dismissTokenWarning({ + token: { 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 31de388c257..4a0b6cece91 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, useState } from 'react' +import { useMemo, useReducer, useRef, 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,6 +72,7 @@ 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, @@ -97,7 +98,7 @@ export function PoolDetailsTransactionsTable({ - + @@ -150,13 +151,14 @@ export function PoolDetailsTransactionsTable({ id: 'swap-type', header: () => ( - toggleFilterModal()}> + toggleFilterModal()} ref={filterAnchorRef}> 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 261641b42d7..291b5c39105 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,30 +2,13 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` - .c4 { + .c1 { 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 { +.c2 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -43,37 +26,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` gap: 4px; } -.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 { +.c5 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -81,7 +34,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` letter-spacing: -0.01em; } -.c28 { +.c11 { color: #40B66B; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -89,7 +42,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` letter-spacing: -0.01em; } -.c29 { +.c12 { color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -97,7 +50,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` letter-spacing: -0.01em; } -.c21 { +.c13 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -108,175 +61,20 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` font-weight: 500; } -.c21:hover { +.c13:hover { opacity: 0.6; } -.c21:active { +.c13:active { opacity: 0.4; } -.c25 { +.c8 { 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; @@ -285,33 +83,7 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` transform: rotate(0deg); } -.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 { +.c7 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -327,110 +99,22 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` width: 100%; } -.c27 { +.c10 { display: none; height: 16px; width: 16px; color: #7D7D7D; } -.c22:hover .c26 { +.c6:hover .c9 { display: block; } -.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 { +.c4 { position: relative; } -.c30 { +.c14 { color: #7D7D7D; stroke: #7D7D7D; } @@ -439,12 +123,6 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` min-height: 256px; } -@media not all and (hover:none) { - .c20:hover { - background: #22222212; - } -} -
-
Time -
+
Type
@@ -544,48 +224,48 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = `
USD
Wallet
@@ -594,36 +274,38 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = `
@@ -758,30 +417,13 @@ exports[`PoolDetailsTransactionsTable renders data filled state 1`] = ` exports[`PoolDetailsTransactionsTable renders error state 1`] = ` - .c4 { + .c1 { 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 { +.c2 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -799,23 +441,7 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` gap: 4px; } -.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 { +.c9 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -829,7 +455,7 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` justify-content: flex-start; } -.c12 { +.c5 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -837,7 +463,7 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` letter-spacing: -0.01em; } -.c24 { +.c10 { color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -845,7 +471,7 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` letter-spacing: -0.01em; } -.c23 { +.c8 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -875,179 +501,16 @@ 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; - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); -} - -.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; + height: 16px; + width: 16px; + color: #222222; + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); } -.c18 { +.c6 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -1062,100 +525,12 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` background-size: 400%; } -.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 { +.c7 { width: 75%; height: 16px; } -.c16 { +.c4 { position: relative; } @@ -1163,12 +538,6 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` min-height: 256px; } -@media not all and (hover:none) { - .c22:hover { - background: #22222212; - } -} -
-
Time -
+
Type
@@ -1268,50 +639,50 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = `
USD
Wallet
@@ -1320,542 +691,542 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = `
@@ -1888,44 +1259,21 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = `
Error loading data
Data is unavailable at the moment; we’re working on a fix
-
-
- - - - Loading -
-
@@ -1937,30 +1285,13 @@ exports[`PoolDetailsTransactionsTable renders error state 1`] = ` exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` - .c4 { + .c1 { 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 { +.c2 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -1978,37 +1309,7 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` gap: 4px; } -.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 { +.c5 { color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; @@ -2016,143 +1317,7 @@ 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; @@ -2161,33 +1326,7 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` transform: rotate(0deg); } -.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 { +.c6 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -2202,100 +1341,12 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` background-size: 400%; } -.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 { +.c7 { width: 75%; height: 16px; } -.c16 { +.c4 { position: relative; } @@ -2303,12 +1354,6 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = ` min-height: 256px; } -@media not all and (hover:none) { - .c22:hover { - background: #22222212; - } -} -
-
Time -
+
Type
@@ -2408,50 +1455,50 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = `
USD
Wallet
@@ -2460,564 +1507,541 @@ exports[`PoolDetailsTransactionsTable renders loading state 1`] = `
-
-
- - - - Loading -
-
diff --git a/apps/web/src/components/Pools/PoolTable/PoolTable.test.tsx b/apps/web/src/components/Pools/PoolTable/PoolTable.test.tsx index d6f3c5e8f51..5e63dd478a8 100644 --- a/apps/web/src/components/Pools/PoolTable/PoolTable.test.tsx +++ b/apps/web/src/components/Pools/PoolTable/PoolTable.test.tsx @@ -58,7 +58,8 @@ describe('PoolTable', () => { tvl: 300, volume24h: 400, volumeWeek: 500, - oneDayApr: new Percent(6, 100), + apr: new Percent(6, 100), + volOverTvl: 1.84, protocolVersion: ProtocolVersion.V3, }, ] diff --git a/apps/web/src/components/Pools/PoolTable/PoolTable.tsx b/apps/web/src/components/Pools/PoolTable/PoolTable.tsx index 96d42d084cc..84ae2407d65 100644 --- a/apps/web/src/components/Pools/PoolTable/PoolTable.tsx +++ b/apps/web/src/components/Pools/PoolTable/PoolTable.tsx @@ -1,69 +1,82 @@ 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 { DoubleCurrencyAndChainLogo } from 'components/DoubleLogo' -import Row from 'components/Row' +import { PortfolioLogo } from 'components/AccountDrawer/MiniPortfolio/PortfolioLogo' import { Table } from 'components/Table' import { Cell } from 'components/Table/Cell' import { ClickableHeaderRow, HeaderArrow, HeaderSortText } from 'components/Table/styled' -import { NameText } from 'components/Tokens/TokenTable' +import { EllipsisText } 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 { SupportedInterfaceChainId, chainIdToBackendChain, useChainFromUrlParam } from 'constants/chains' +import { MouseoverTooltip, TooltipSize } from 'components/Tooltip' +import { 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, unwrapToken } from 'graphql/data/util' +import { + OrderDirection, + getSupportedGraphQlChain, + gqlToCurrency, + supportedChainIdFromGQLChain, + unwrapToken, +} from 'graphql/data/util' +import { useCurrencyInfo } from 'hooks/Tokens' 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 { ThemedText } from 'theme/components' -import { ProtocolVersion, Token } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' +import { ReactElement, ReactNode, memo, 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 { Trans } from 'uniswap/src/i18n' -import { InterfaceChainId } from 'uniswap/src/types/chains' +import { InterfaceChainId, UniverseChainId } from 'uniswap/src/types/chains' import { NumberType, useFormatter } from 'utils/formatNumbers' const HEADER_DESCRIPTIONS: Record = { - [PoolSortFields.TVL]: undefined, - [PoolSortFields.Volume24h]: undefined, - [PoolSortFields.VolumeWeek]: undefined, - [PoolSortFields.TxCount]: undefined, - [PoolSortFields.OneDayApr]: , + [PoolSortFields.TVL]: , + [PoolSortFields.Volume24h]: , + [PoolSortFields.VolumeWeek]: , + [PoolSortFields.VolOverTvl]: undefined, + [PoolSortFields.Apr]: , } -const TableWrapper = styled.div` - margin: 0 auto; - max-width: ${MAX_WIDTH_MEDIA_BREAKPOINT}; -` +const TableWrapper = styled(Flex, { + m: '0 auto', + maxWidth: MAX_WIDTH_MEDIA_BREAKPOINT, +}) -const Badge = styled(ThemedText.LabelMicro)` - padding: 2px 6px; - background: ${({ theme }) => theme.surface2}; - border-radius: 5px; -` +const Badge = styled(Text, { + py: 2, + px: 6, + backgroundColor: '$surface2', + borderRadius: '$rounded6', + variant: 'body4', + color: '$neutral2', +}) interface PoolTableValues { index: number poolDescription: ReactElement - txCount: number tvl: number + apr: Percent volume24h: number - volumeWeek: number - oneDayApr: Percent + volumeWeek: number // TODO(WEB-4856): update to 30D once this data is available + volOverTvl?: number link: string } -export enum PoolTableColumns { - Index, - PoolDescription, - Transactions, - TVL, - Volume24h, - VolumeWeek, - 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({ @@ -73,22 +86,31 @@ function PoolDescription({ chainId, protocolVersion = ProtocolVersion.V3, }: { - token0: Token - token1: Token - feeTier: number + token0?: Token | TokenStats + token1?: Token | TokenStats + feeTier?: number chainId: InterfaceChainId - protocolVersion: ProtocolVersion + protocolVersion?: ProtocolVersion | string }) { - const currencies = [gqlToCurrency(token0), gqlToCurrency(token1)] + 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 return ( - - - - {token0.symbol}/{token1.symbol} - + + + + {token0?.symbol}/{token1?.symbol} + {protocolVersion === ProtocolVersion.V2 && {protocolVersion.toLowerCase()}} - {feeTier / BIPS_BASE}% - + {feeTier && {feeTier / BIPS_BASE}%} + ) } @@ -113,10 +135,10 @@ function useSetSortMethod(newSortMethod: PoolSortFields) { const HEADER_TEXT: Record = { [PoolSortFields.TVL]: , - [PoolSortFields.Volume24h]: , - [PoolSortFields.VolumeWeek]: , - [PoolSortFields.OneDayApr]: , - [PoolSortFields.TxCount]: , + [PoolSortFields.Volume24h]: , + [PoolSortFields.VolumeWeek]: , + [PoolSortFields.Apr]: , + [PoolSortFields.VolOverTvl]: , } function PoolTableHeader({ @@ -130,16 +152,21 @@ function PoolTableHeader({ }) { const handleSortCategory = useSetSortMethod(category) return ( - - + + {isCurrentSortMethod && } - {HEADER_TEXT[category]} + {HEADER_TEXT[category]} ) } -export function TopPoolTable() { +export const TopPoolTable = memo(function TopPoolTable() { const chain = getSupportedGraphQlChain(useChainFromUrlParam(), { fallbackToEthereum: true }) const sortMethod = useAtomValue(sortMethodAtom) const sortAscending = useAtomValue(sortAscendingAtom) @@ -151,7 +178,12 @@ export function TopPoolTable() { resetSortAscending() }, [resetSortAscending, resetSortMethod]) - const { topPools, loading, errorV3, errorV2 } = useTopPools( + const { + topPools: gqlTopPools, + loading: gqlLoading, + errorV3, + errorV2, + } = useTopPools( { sortBy: sortMethod, sortDirection: sortAscending ? OrderDirection.Asc : OrderDirection.Desc }, chain.id, ) @@ -159,40 +191,43 @@ export function TopPoolTable() { errorV2 && errorV3 ? new ApolloError({ errorMessage: `Could not retrieve V2 and V3 Top Pools on chain: ${chain.id}` }) : undefined - const allDataStillLoading = loading && !topPools.length + const allDataStillLoading = gqlLoading && !gqlTopPools.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 ( - + ) -} +}) export function PoolsTable({ pools, loading, error, loadMore, - chainId, maxWidth, maxHeight, hiddenColumns, }: { - pools?: TablePool[] + pools?: TablePool[] | PoolStat[] loading: boolean - error?: ApolloError + error?: ApolloError | boolean loadMore?: ({ onComplete }: { onComplete?: () => void }) => void - chainId: SupportedInterfaceChainId maxWidth?: number maxHeight?: number - hiddenColumns?: PoolTableColumns[] + hiddenColumns?: PoolSortFields[] }) { const { formatNumber, formatPercent } = useFormatter() const sortAscending = useAtomValue(sortAscendingAtom) @@ -204,7 +239,8 @@ 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: ( @@ -216,21 +252,21 @@ export function PoolsTable({ protocolVersion={pool.protocolVersion} /> ), - txCount: pool.txCount, - tvl: pool.tvl, - volume24h: pool.volume24h, - volumeWeek: pool.volumeWeek, - oneDayApr: pool.oneDayApr, - link: `/explore/pools/${chainIdToBackendChain({ chainId, withFallback: true }).toLowerCase()}/${pool.hash}`, + tvl: isGqlPool ? pool.tvl : giveExploreStatDefaultValue(pool.totalLiquidity?.value), + volume24h: isGqlPool ? pool.volume24h : giveExploreStatDefaultValue(pool.volume1Day?.value), + volumeWeek: isGqlPool ? pool.volumeWeek : giveExploreStatDefaultValue(pool.volume1Week?.value), + volOverTvl: pool.volOverTvl, + apr: pool.apr, + link: `/explore/pools/${chainIdToBackendChain({ chainId, withFallback: true }).toLowerCase()}/${isGqlPool ? pool.hash : pool.id}`, analytics: { elementName: InterfaceElementName.POOLS_TABLE_ROW, properties: { chain_id: chainId, - 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_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_list_index: index, pool_list_rank: poolSortRank, pool_list_length: pools.length, @@ -239,88 +275,88 @@ export function PoolsTable({ }, } }) ?? [], - [chainId, filterString, pools], + [filterString, pools], ) const showLoadingSkeleton = loading || !!error const columns = useMemo(() => { const columnHelper = createColumnHelper() return [ - !hiddenColumns?.includes(PoolTableColumns.Index) - ? columnHelper.accessor((row) => row.index, { - id: 'index', - header: () => ( - - # - - ), - cell: (index) => ( - - {index.getValue?.()} - - ), - }) - : null, - !hiddenColumns?.includes(PoolTableColumns.PoolDescription) - ? columnHelper.accessor((row) => row.poolDescription, { - id: 'poolDescription', - header: () => ( - - - - - - ), - cell: (poolDescription) => ( - - {poolDescription.getValue?.()} - - ), - }) - : null, - !hiddenColumns?.includes(PoolTableColumns.Transactions) - ? columnHelper.accessor((row) => row.txCount, { - id: 'transactions', + columnHelper.accessor((row) => row.index, { + id: 'index', + header: () => ( + + + # + + + ), + cell: (index) => ( + + + {index.getValue?.()} + + + ), + }), + columnHelper.accessor((row) => row.poolDescription, { + id: 'poolDescription', + header: () => ( + + + + + + ), + cell: (poolDescription) => ( + + {poolDescription.getValue?.()} + + ), + }), + !hiddenColumns?.includes(PoolSortFields.TVL) + ? columnHelper.accessor((row) => row.tvl, { + id: 'tvl', header: () => ( - + ), - cell: (txCount) => ( - - - {formatNumber({ input: txCount.getValue?.(), type: NumberType.NFTCollectionStats })} - + cell: (tvl) => ( + + + {formatNumber({ input: tvl.getValue?.(), type: NumberType.FiatTokenStats })} + ), }) : null, - !hiddenColumns?.includes(PoolTableColumns.TVL) - ? columnHelper.accessor((row) => row.tvl, { - id: 'tvl', + !hiddenColumns?.includes(PoolSortFields.Apr) + ? columnHelper.accessor((row) => row.apr, { + id: 'apr', header: () => ( - + ), - cell: (tvl) => ( - - - {formatNumber({ input: tvl.getValue?.(), type: NumberType.FiatTokenStats })} - + cell: (oneDayApr) => ( + + + {formatPercent(oneDayApr.getValue?.())} + ), }) : null, - !hiddenColumns?.includes(PoolTableColumns.Volume24h) + !hiddenColumns?.includes(PoolSortFields.Volume24h) ? columnHelper.accessor((row) => row.volume24h, { id: 'volume24h', header: () => ( @@ -334,14 +370,14 @@ export function PoolsTable({ ), cell: (volume24h) => ( - + {formatNumber({ input: volume24h.getValue?.(), type: NumberType.FiatTokenStats })} - + ), }) : null, - !hiddenColumns?.includes(PoolTableColumns.VolumeWeek) + !hiddenColumns?.includes(PoolSortFields.VolumeWeek) ? columnHelper.accessor((row) => row.volumeWeek, { id: 'volumeWeek', header: () => ( @@ -355,40 +391,45 @@ export function PoolsTable({ ), cell: (volumeWeek) => ( - + {formatNumber({ input: volumeWeek.getValue?.(), type: NumberType.FiatTokenStats })} - + ), }) : null, - !hiddenColumns?.includes(PoolTableColumns.OneDayApr) - ? columnHelper.accessor((row) => row.oneDayApr, { - id: 'oneDayApr', + !hiddenColumns?.includes(PoolSortFields.VolOverTvl) + ? columnHelper.accessor((row) => row.volOverTvl, { + id: 'volOverTvl', header: () => ( - + ), - cell: (oneDayApr) => ( + cell: (volOverTvl) => ( - {formatPercent(oneDayApr.getValue?.())} + + {formatNumber({ + input: volOverTvl.getValue?.(), + type: NumberType.TokenQuantityStats, + placeholder: '-', + })} + ), }) : null, - // Filter out null values - ].filter(Boolean) as ColumnDef[] + ].filter((column): column is ColumnDef => Boolean(column)) }, [formatNumber, formatPercent, hiddenColumns, orderDirection, showLoadingSkeleton, sortMethod]) return ( - .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 { + .c4 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -86,230 +13,55 @@ exports[`PoolTable renders data filled state 1`] = ` left: 0; } -.c23 img { +.c4 img { width: 14px; height: 28px; object-fit: cover; } -.c23 img:first-child { +.c4 img:first-child { border-radius: 14px 0 0 14px; object-position: 0 0; } -.c23 img:last-child { +.c4 img:last-child { border-radius: 0 14px 14px 0; object-position: 100% 0; } -.c24 { +.c5 { width: 14px; height: 28px; border-radius: 50%; } -.c22 { - position: relative; - top: 0; - left: 0; -} - -.c1 { +.c3 { 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; - 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; -} - -.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; + top: 0; + left: 0; } -.c8:first-child { - -webkit-box-flex: 0; - -webkit-flex-grow: 0; - -ms-flex-positive: 0; - flex-grow: 0; +.c0 { + display: inline-block; + height: inherit; } -.c19 { +.c2 { color: none; -webkit-text-decoration: none; text-decoration: none; cursor: pointer; } -.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 { +.c1 { height: 16px; width: 16px; color: #222222; @@ -318,121 +70,6 @@ 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 -
+ APR +
-
- 7 day volume -
+ 1D vol +
-
- 1 day APR -
+ 7D vol + +
+
+
+
+
+
+
+
+
+
+ + 1D vol/TVL +
@@ -624,160 +271,149 @@ exports[`PoolTable renders data filled state 1`] = `
-
-
- - - - Loading -
-
@@ -789,62 +425,23 @@ exports[`PoolTable renders data filled state 1`] = ` exports[`PoolTable renders error state 1`] = ` - .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; + .c6 { + color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c23 { - color: #222222; +.c7 { + color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c1 { +.c5 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -858,7 +455,7 @@ exports[`PoolTable renders error state 1`] = ` justify-content: flex-start; } -.c22 { +.c4 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -888,182 +485,12 @@ exports[`PoolTable renders error state 1`] = ` border-radius: 20px; } -.c13 { +.c0 { 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; - 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 { +.c1 { height: 16px; width: 16px; color: #222222; @@ -1072,11 +499,7 @@ exports[`PoolTable renders error state 1`] = ` transform: rotate(0deg); } -.c16 { - color: #222222; -} - -.c20 { +.c2 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -1091,110 +514,11 @@ exports[`PoolTable renders error state 1`] = ` background-size: 400%; } -.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 { +.c3 { width: 75%; height: 16px; } -.c0 { - margin: 0 auto; - max-width: 1200px; -} - -@media not all and (hover:none) { - .c19:hover { - background: #22222212; - } -} -
+
-
- # -
-
-
-
-
-
- Pool -
+ # +
-
-
-
-
- Transactions -
-
-
-
+ Pool +
-
TVL -
+
-
- 1 day volume -
+ APR +
-
- 7 day volume -
+ 1D vol +
-
- 1 day APR -
+ 7D vol + +
+
+
+
+
+
+
+
+
+
+ + 1D vol/TVL +
@@ -1386,626 +720,626 @@ exports[`PoolTable renders error state 1`] = `
@@ -2038,44 +1372,21 @@ exports[`PoolTable renders error state 1`] = `
Error loading data
Data is unavailable at the moment; we’re working on a fix
-
-
- - - - Loading -
-
@@ -2087,242 +1398,12 @@ exports[`PoolTable renders error state 1`] = ` exports[`PoolTable renders loading state 1`] = ` - .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 { + .c0 { 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; - 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 { +.c1 { height: 16px; width: 16px; color: #222222; @@ -2331,11 +1412,7 @@ exports[`PoolTable renders loading state 1`] = ` transform: rotate(0deg); } -.c16 { - color: #222222; -} - -.c20 { +.c2 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -2350,110 +1427,11 @@ exports[`PoolTable renders loading state 1`] = ` background-size: 400%; } -.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 { +.c3 { 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 -
+ APR +
-
- 7 day volume -
+ 1D vol +
-
- 1 day APR -
+ 7D vol + +
+
+
+
+
+
+
+
+
+
+ + 1D vol/TVL +
@@ -2645,648 +1633,625 @@ exports[`PoolTable renders loading state 1`] = `
-
-
- - - - Loading -
-
diff --git a/apps/web/src/components/Popover/index.tsx b/apps/web/src/components/Popover/index.tsx index 9841a2230d8..9fa7475799d 100644 --- a/apps/web/src/components/Popover/index.tsx +++ b/apps/web/src/components/Popover/index.tsx @@ -2,7 +2,7 @@ import { Options, Placement } from '@popperjs/core' import Portal from '@reach/portal' import useInterval from 'lib/hooks/useInterval' import styled from 'lib/styled-components' -import React, { CSSProperties, useCallback, useMemo, useState } from 'react' +import React, { CSSProperties, memo, useCallback, useMemo, useState } from 'react' import { usePopper } from 'react-popper' import { Z_INDEX } from 'theme/zIndex' @@ -86,7 +86,7 @@ export interface PopoverProps { style?: CSSProperties } -export default function Popover({ +const Popover = memo(function Popover({ content, show, children, @@ -143,4 +143,6 @@ export default function Popover({ ) -} +}) + +export default Popover diff --git a/apps/web/src/components/SearchModal/CurrencyList/index.tsx b/apps/web/src/components/SearchModal/CurrencyList/index.tsx index 689a9be08bd..10980a115b8 100644 --- a/apps/web/src/components/SearchModal/CurrencyList/index.tsx +++ b/apps/web/src/components/SearchModal/CurrencyList/index.tsx @@ -9,7 +9,6 @@ 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' @@ -20,6 +19,7 @@ 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, { - flexDirection: 'row', + row: true, height: '$spacing60', }) @@ -148,7 +148,7 @@ export function CurrencyRow({ }) { const account = useAccount() const key = currencyListRowKey(currency) - const customAdded = useIsUserAddedToken(currency) + const { tokenWarningDismissed: customAdded } = useDismissedTokenWarnings(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 2c08339f437..3ad8ac227d0 100644 --- a/apps/web/src/components/SearchModal/CurrencySearch.tsx +++ b/apps/web/src/components/SearchModal/CurrencySearch.tsx @@ -1,39 +1,22 @@ import { InterfaceEventName, InterfaceModalName } from '@uniswap/analytics-events' -import { Currency, Token } from '@uniswap/sdk-core' -import { - recentlySearchedAssetsAtom, - useAddRecentlySearchedCurrency, -} from 'components/NavBar/SearchBar/RecentlySearchedAssets' +import { Currency } from '@uniswap/sdk-core' 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 { 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 { useShowSwapNetworkNotification } from 'hooks/useShowSwapNetworkNotification' +import { useCallback, useEffect } from 'react' 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 { @@ -46,34 +29,15 @@ 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) { @@ -85,7 +49,6 @@ export function CurrencySearch({ currencyField, onCurrencySelect, onDismiss }: C onCurrencySelect(currency) setSelectedChainId(currency.chainId) - setFilteredChainId(currency.chainId) setIsUserSelectedToken(true) onDismiss() }, @@ -96,19 +59,9 @@ export function CurrencySearch({ currencyField, onCurrencySelect, onDismiss }: C if ((currentTab !== SwapTab.Swap && currentTab !== SwapTab.Send) || !multichainUXEnabled) { return } - if (chainId && prevChainId && chainId !== prevChainId) { - removePopup(`switchNetwork-${prevChainId}`) - addPopup( - { - type: PopupType.SwitchNetwork, - chainId, - action: currentTab, - }, - `switchNetwork-${chainId}`, - 3000, - ) - } - }, [currentTab, chainId, prevChainId, multichainUXEnabled, addPopup, removePopup]) + + showSwapNetworkNotification(chainId, prevChainId) + }, [currentTab, chainId, prevChainId, multichainUXEnabled, showSwapNetworkNotification]) return ( formatNumber({ input: fromAmount as number, @@ -147,56 +91,12 @@ 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={() => { - setFilteredChainId(null) - onDismiss() - }} - onDismiss={() => null} - onPressAnimation={() => null} - onSelectChain={(chainId) => { - setFilteredChainId(chainId) - }} + onClose={onDismiss} onSelectCurrency={handleCurrencySelectTokenSelectorCallback} /> diff --git a/apps/web/src/components/Settings/MultipleRoutingOptions.test.tsx b/apps/web/src/components/Settings/MultipleRoutingOptions.test.tsx index 9a236d6e9c9..910c202983d 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')).toHaveStyleRule('pointer-events', 'none') + expect(screen.getByTestId('route-preference-toggle-v2')).toHaveAttribute('aria-disabled', 'true') 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')).toHaveStyleRule('pointer-events', 'none') + expect(screen.getByTestId('route-preference-toggle-v2')).toHaveAttribute('aria-disabled', 'true') }) 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 944f73e8d59..edc9d8ba926 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,7 +106,13 @@ 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 96b344de572..d8e22063608 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,10 +35,11 @@ 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 0197ac82294..59c8d2eee00 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 5d73c2fc913..ba217c6e50f 100644 --- a/apps/web/src/components/Table/Cell.tsx +++ b/apps/web/src/components/Table/Cell.tsx @@ -1,57 +1,38 @@ import { LoadingBubble } from 'components/Tokens/loading' -import styled from 'lib/styled-components' +import deprecatedStyled from 'lib/styled-components' import { PropsWithChildren } from 'react' +import { Flex, FlexProps } from 'ui/src' -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)` +const LoadingDataBubble = deprecatedStyled(LoadingBubble)` width: 75%; height: 16px; ` export function Cell({ loading, - width, - minWidth, - maxWidth, - justifyContent, - grow, children, testId, -}: PropsWithChildren<{ - loading?: boolean - width?: number - minWidth?: number - maxWidth?: number - grow?: boolean - justifyContent?: string - testId?: string -}>) { + ...rest +}: PropsWithChildren< + { + loading?: boolean + testId?: string + } & Partial +>) { return ( - {loading ? : children} - + ) } diff --git a/apps/web/src/components/Table/Filter.tsx b/apps/web/src/components/Table/Filter.tsx index 470a7e34844..1b372cd7add 100644 --- a/apps/web/src/components/Table/Filter.tsx +++ b/apps/web/src/components/Table/Filter.tsx @@ -1,49 +1,46 @@ -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 styled from 'lib/styled-components' +import deprecatedStyled from 'lib/styled-components' import { Portal } from 'nft/components/common/Portal' -import { Checkbox } from 'nft/components/layout/Checkbox' -import { Fragment, useCallback, useRef, useState } from 'react' -import { ThemedText } from 'theme/components' -import { Z_INDEX } from 'theme/zIndex' +import { RefObject, useCallback, useRef } from 'react' +import { Checkbox, Flex, Text, styled } from 'ui/src' -const StyledDropdownIcon = styled(DropdownIcon)` +const StyledDropdownIcon = deprecatedStyled(DropdownIcon)` position: relative; ` -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 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', + }, +}) - @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}; - } -` +const FilterRow = styled(Flex, { + row: true, + py: 10, + px: '$padding8', + justifyContent: 'space-between', + borderRadius: '$rounded8', + hoverStyle: { + backgroundColor: '$surface3', + }, +}) interface FilterProps { allFilters: T[] @@ -51,7 +48,7 @@ interface FilterProps { setFilters: (filter: T[]) => void isOpen: boolean toggleFilterModal: () => void - isSticky?: boolean + anchorRef: RefObject } export function Filter({ @@ -60,9 +57,8 @@ export function Filter({ setFilters, isOpen, toggleFilterModal, - isSticky, + anchorRef, }: FilterProps) { - const [hoveredRow, setHoveredRow] = useState(-1) const isScreenSize = useScreenSize() const isMobile = !isScreenSize['sm'] const filterModalRef = useRef(null) @@ -78,32 +74,31 @@ 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 && ( - - - {allFilters.map((filter, index) => ( - { - e.stopPropagation() - e.preventDefault() - handleFilterOptionClick(filter) - }} - onMouseEnter={() => setHoveredRow(index)} - onMouseLeave={() => setHoveredRow(-1)} - > - {filter} - + {isOpen && anchorRef.current && ( + + + {allFilters.map((filter) => ( + + + {filter} + + handleFilterOptionClick(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 9300ac70180..15e6723abc3 100644 --- a/apps/web/src/components/Table/__snapshots__/styled.test.tsx.snap +++ b/apps/web/src/components/Table/__snapshots__/styled.test.tsx.snap @@ -2,40 +2,7 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` - .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 { + .c2 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -46,19 +13,19 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` left: 0; } -.c4 img { +.c2 img { width: 16px; height: 16px; border-radius: 50%; } -.c5 { +.c3 { width: 8px; height: 16px; border-radius: 50%; } -.c6 { +.c4 { background-color: #F9F9F9; border-radius: 2px; width: 6px; @@ -81,7 +48,7 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` justify-content: center; } -.c3 { +.c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -114,12 +81,6 @@ 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 -
+
@@ -182,40 +144,7 @@ exports[`TokenLinkCell renders known token on a different chain 1`] = ` exports[`TokenLinkCell renders known token on mainnet 1`] = ` - .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 { + .c2 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -226,19 +155,19 @@ exports[`TokenLinkCell renders known token on mainnet 1`] = ` left: 0; } -.c4 img { +.c2 img { width: 16px; height: 16px; border-radius: 50%; } -.c5 { +.c3 { width: 8px; height: 16px; border-radius: 50%; } -.c3 { +.c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -271,12 +200,6 @@ exports[`TokenLinkCell renders known token on mainnet 1`] = ` opacity: 0.4; } -.c7 { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -
-
USDC -
+
@@ -327,40 +251,7 @@ exports[`TokenLinkCell renders known token on mainnet 1`] = ` exports[`TokenLinkCell renders unknown token 1`] = ` - .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 { + .c2 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -371,19 +262,19 @@ exports[`TokenLinkCell renders unknown token 1`] = ` left: 0; } -.c4 img { +.c2 img { width: 16px; height: 16px; border-radius: 50%; } -.c5 { +.c3 { width: 8px; height: 16px; border-radius: 50%; } -.c3 { +.c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -416,12 +307,6 @@ 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 4666a9b1ac1..6638d31b4fc 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 + error?: ApolloError | boolean }) { const analyticsContext = useTrace() @@ -131,7 +131,7 @@ export function Table({ columns: ColumnDef[] data: Data[] loading?: boolean - error?: ApolloError + error?: ApolloError | boolean 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,16 +242,18 @@ export function Table({ )} - + - - - - - - + {loadingMore && ( + + + + + + + )}
diff --git a/apps/web/src/components/Table/styled.tsx b/apps/web/src/components/Table/styled.tsx index 399b69a748f..db03fbb3ddc 100644 --- a/apps/web/src/components/Table/styled.tsx +++ b/apps/web/src/components/Table/styled.tsx @@ -1,19 +1,18 @@ 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 styled, { css } from 'lib/styled-components' +import deprecatedStyled from 'lib/styled-components' +import { PropsWithChildren } from 'react' import { ArrowDown, CornerLeftUp, ExternalLink as ExternalLinkIcon } from 'react-feather' import { Link } from 'react-router-dom' -import { ClickableStyle, EllipsisStyle, ExternalLink, ThemedText } from 'theme/components' +import { ClickableStyle, ClickableTamaguiStyle, EllipsisTamaguiStyle, 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' @@ -21,177 +20,227 @@ 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(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 TableContainer = styled(Flex, { + centered: true, + m: '0 auto 24px auto', + className: 'scrollbar-hidden', +}) - :before { - content: ''; - height: 12px; +export const TableHead = (props: PropsWithChildren<{ $isSticky: boolean; $top: number }>): JSX.Element => { + if (props.$isSticky) { + return ( + + {props.$isSticky &&
} + {props.children} + + ) + } else { + return ( + + {props.children} + + ) } -` -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)` +} + +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)` font-size: 16px; border-radius: 900px; width: fit-content; margin-top: 8px; ` -export const ReturnIcon = styled(CornerLeftUp)` + +export const ReturnIcon = deprecatedStyled(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}; -` -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 ReturnButtonContainer = styled(Flex, { + position: 'absolute', + justifyContent: 'center', + left: '50%', + transform: 'translateX(-50%)', + width: 'max-content', +}) -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; +export const LoadingIndicatorContainer = styled(Flex, { + row: true, + alignItems: 'center', + justifyContent: 'center', + mt: -48, + '$platform-web': { + position: 'sticky', + }, +}) - ${({ $dimmed }) => $dimmed && 'opacity: 0.4;'} -` -export const CellContainer = styled.div` - display: flex; - flex-grow: 1; +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, +}) - &:last-child { - justify-content: flex-end; - } +const TableRow = styled(Flex, { + row: true, + alignItems: 'center', + px: '$padding12', + width: 'fit-content', + minWidth: '100%', + minHeight: 64, +}) - &:first-child { - flex-grow: 0; - } -` -export const StyledExternalLink = styled(ExternalLink)` - text-decoration: none; - ${ClickableStyle} - color: ${({ theme }) => theme.neutral1}; -` -const StyledInternalLink = styled(Link)` +export const DataRow = styled(TableRow, { + hoverStyle: { + backgroundColor: '$surface3', + }, +}) + +export const NoDataFoundTableRow = styled(TableRow, { + justifyContent: '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', + + '$platform-web': { + overscrollBehavior: 'none', + overflow: 'auto', + }, + variants: { + dimmed: { + true: { + opacity: 0.4, + }, + }, + } as const, +}) + +export const CellContainer = styled(Flex, { + grow: true, + className: 'first-child-flex-grow-0 last-child-justify-end', +}) + +export const StyledExternalLink = styled(Anchor, { + textDecorationLine: 'none', + ...ClickableTamaguiStyle, + color: '$neutral1', + target: '_blank', + rel: 'noopener noreferrer', +}) +const StyledInternalLink = deprecatedStyled(Link)` text-decoration: none; ${ClickableStyle} color: ${({ theme }) => theme.neutral1}; ` -export const TableRowLink = styled(Link)` +export const TableRowLink = deprecatedStyled(Link)` color: none; text-decoration: none; cursor: pointer; ` -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 }>` +export const ClickableHeaderRow = styled(Flex, { + row: true, + alignItems: 'center', + justifyContent: 'flex-end', + width: '100%', + gap: '$gap4', + + ...ClickableTamaguiStyle, +}) + +export const HeaderArrow = deprecatedStyled(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 FilterHeaderRow = styled(Row)<{ modalOpen?: boolean }>` - ${({ modalOpen }) => !modalOpen && ClickableStyle} - cursor: pointer; - user-select: none; - gap: 4px; -` -const StyledTimestampRow = styled(StyledExternalLink)` +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)` display: flex; flex-direction: row; align-items: center; gap: 8px; width: 100%; ` -const StyledExternalLinkIcon = styled(ExternalLinkIcon)` +const StyledExternalLinkIcon = deprecatedStyled(ExternalLinkIcon)` display: none; height: 16px; width: 16px; @@ -236,9 +285,12 @@ export const TimestampCell = ({ timestamp, link }: { timestamp: number; link: st ) } -const TokenSymbolText = styled(ThemedText.BodyPrimary)` - ${EllipsisStyle} -` +const TokenSymbolText = styled(Text, { + variant: 'body2', + color: '$neutral1', + ...EllipsisTamaguiStyle, +}) + /** * Given a token displays the Token's Logo and Symbol with a link to its TDP * @param token @@ -257,7 +309,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 deleted file mode 100644 index 527c8e55261..00000000000 --- a/apps/web/src/components/Toggle/index.tsx +++ /dev/null @@ -1,98 +0,0 @@ -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 e4f95c48fc2..9ca98bd23f9 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,15 +234,12 @@ export default function TokenSafety({ token0, token1, onContinue, onCancel, onBl displayWarning = token1Warning } - // If a warning is acknowledged, import these tokens - const addToken = useAddUserToken() + // dismiss token warnings on acknowledgement + const { onDismissTokenWarning: onDismissToken0 } = useDismissedTokenWarnings(token0) + const { onDismissTokenWarning: onDismissToken1 } = useDismissedTokenWarnings(token1) const acknowledge = () => { - if (token0) { - addToken(token0) - } - if (token1) { - addToken(token1) - } + onDismissToken0() + onDismissToken1() onContinue() } diff --git a/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx b/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx index 0eebc47f627..5494a45b981 100644 --- a/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/ActivitySection.tsx @@ -1,22 +1,21 @@ -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 { ClickableStyle, ThemedText } from 'theme/components' +import { ClickableTamaguiStyle } from 'theme/components' +import { Flex, styled, Text } from 'ui/src' import { Trans } from 'uniswap/src/i18n' -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}; -` +const Container = styled(Flex, { + width: '100%', +}) + +const Tab = styled(Text, { + color: '$neutral1', + variant: 'heading3', + ...ClickableTamaguiStyle, +}) + enum ActivityTab { Txs, Pools, @@ -31,14 +30,20 @@ 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 5b3a12aa191..92432d66ae0 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,34 +36,17 @@ export const DEFAULT_PILL_TIME_SELECTOR_OPTIONS = ORDERED_TIMES.map((time: TimeP value: DISPLAYS[time], })) as PillMultiToggleOption[] -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)); - } -` +export const ChartActionsContainer = styled(Flex, { + flexDirection: 'row-reverse', + width: '100%', + justifyContent: 'space-between', + alignItems: 'center', + mt: 12, + $md: { + flexDirection: 'column', + gap: 16, + }, +}) /** Represents a variety of query result shapes, discriminated via additional `chartType` field. */ type ActiveQuery = @@ -178,7 +161,15 @@ 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 8c73d332f4e..6ee0ffbd0f8 100644 --- a/apps/web/src/components/Tokens/TokenDetails/Skeleton.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/Skeleton.tsx @@ -2,7 +2,6 @@ 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' @@ -13,168 +12,186 @@ import { useChainFromUrlParam } from 'constants/chains' import { NATIVE_CHAIN_ID } from 'constants/tokens' import { getSupportedGraphQlChain } from 'graphql/data/util' import { useCurrency } from 'hooks/Tokens' -import styled, { css } from 'lib/styled-components' +import deprecatedStyled from 'lib/styled-components' import { ReactNode } from 'react' import { ChevronRight } from 'react-feather' import { useParams } from 'react-router-dom' -import { BREAKPOINTS } from 'theme' -import { ClickableStyle } from 'theme/components' -import { textFadeIn } from 'theme/styles' +import { ClickableTamaguiStyle } from 'theme/components' 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.div` - display: flex; - padding: 0 16px 52px; - justify-content: center; - width: 100%; - gap: 40px; +export const TokenDetailsLayout = styled(Flex, { + row: true, + justifyContent: 'center', + width: '100%', + gap: 40, + py: '$spacing48', + px: '$padding20', - @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; - } -` + $lg: { + pt: 0, + px: '$padding16', + pb: 52, + }, + $xl: { + flexDirection: 'column', + alignItems: 'center', + }, + $xxl: { + gap: 60, + }, +}) -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 LeftPanel = styled(Flex, { + maxWidth: 780, + overflow: 'hidden', + width: '100%', + flexGrow: 1, + flexShrink: 1, +}) - @media screen and (max-width: ${({ theme }) => theme.breakpoint.lg}px) { - width: 100%; - max-width: 780px; - } -` +export const RightPanel = styled(Flex, { + pt: 53, + gap: 40, + width: SWAP_COMPONENT_WIDTH, + + $xl: { + width: '100%', + maxWidth: 780, + }, +}) + +export const TokenInfoContainer = styled(Flex, { + row: true, + justifyContent: 'space-between', + alignItems: 'center', + gap: '$gap20', + pt: '$padding8', + mb: '$spacing20', + animation: 'quick', + zIndex: '$default', +}) + +export const TokenNameCell = styled(Flex, { + row: true, + gap: '$gap12', + alignItems: 'center', + pt: '$spacing4', + minWidth: 32, + $md: { + flexDirection: 'column', + alignItems: 'flex-start', + }, +}) -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 = styled(LoadingBubble)` +const DetailBubble = deprecatedStyled(LoadingBubble)` height: 16px; width: 180px; ` -const SquaredBubble = styled(DetailBubble)` + +const SquaredBubble = deprecatedStyled(DetailBubble)` height: 32px; border-radius: 8px; ` -const NavBubble = styled(DetailBubble)` + +const NavBubble = deprecatedStyled(DetailBubble)` width: 169px; ` -const TokenLogoBubble = styled(DetailBubble)` + +const TokenLogoBubble = deprecatedStyled(DetailBubble)` width: 32px; height: 32px; border-radius: 50%; ` -const TitleBubble = styled(DetailBubble)` +const TitleBubble = deprecatedStyled(DetailBubble)` height: 36px; width: 136px; ` -const SectionBubble = styled(SquaredBubble)` +const SectionBubble = deprecatedStyled(SquaredBubble)` width: 120px; ` -const StatTitleBubble = styled(DetailBubble)` +const StatTitleBubble = deprecatedStyled(DetailBubble)` width: 80px; margin-bottom: 4px; ` -const StatBubble = styled(SquaredBubble)` + +const StatBubble = deprecatedStyled(SquaredBubble)` width: 116px; ` -const WideBubble = styled(DetailBubble)` +const WideBubble = deprecatedStyled(DetailBubble)` margin-bottom: 6px; width: 100%; ` -const ThinTitleBubble = styled(WideBubble)` +const ThinTitleBubble = deprecatedStyled(WideBubble)` width: 120px; ` -const HalfWideBubble = styled(WideBubble)` +const HalfWideBubble = deprecatedStyled(WideBubble)` width: 50%; ` -const StatsLoadingContainer = styled.div` - width: 100%; - display: flex; - flex-wrap: wrap; -` - -const ExtraDetailsContainer = styled.div` - padding-top: 24px; -` +const StatsLoadingContainer = styled(Flex, { + row: true, + flexWrap: 'wrap', + width: '100%', +}) -const Space = styled.div<{ heightSize: number }>` - height: ${({ heightSize }) => `${heightSize}px`}; -` +const ExtraDetailsContainer = styled(Flex, { + row: true, + pt: '$spacing24', +}) -const loadingFooterTextCss = css` - color: ${({ theme }) => theme.neutral3}; - font-size: 12px; - font-weight: 500; - line-height: 16px; - text-decoration: none; -` +const loadingFooterTextStyle = { + color: '$neutral3', + fontSize: 12, + fontWeight: '500', + lineHeight: 16, + '$platform-web': { + textDecoration: 'none', + }, +} satisfies TextProps -const LoadingFooterHeaderContainer = styled(Row)` - align-items: center; - ${loadingFooterTextCss} +const LoadingFooterHeaderContainer = styled(Flex, { + row: true, + alignItems: 'center', + pt: '$padding16', + pr: 90, + pb: '$padding8', + pl: 0, + bottom: 0, + right: 0, + justifyContent: 'flex-end', + ...loadingFooterTextStyle, - @media screen and (min-width: ${BREAKPOINTS.md}px) { - padding: 16px 90px 8px 0; - position: fixed; - bottom: 0; - right: 0; - justify-content: flex-end; - } -` + '$platform-web': { + position: 'fixed', + }, + $lg: { + p: 'unset', + position: 'unset', + bottom: 'unset', + right: 'unset', + justifyContent: 'unset', + }, +}) -const LoadingFooterHeader = styled.h1` - ${loadingFooterTextCss} -` +const LoadingFooterHeader = styled(Text, { + variant: 'heading1', + ...loadingFooterTextStyle, +}) -const LoadingFooterLink = styled.a` - ${loadingFooterTextCss} - ${ClickableStyle} -` +const LoadingFooterLink = styled(Anchor, { + fontFamily: '$body', + ...loadingFooterTextStyle, + ...ClickableTamaguiStyle, +}) // exported for testing export function getLoadingTitle( @@ -274,7 +291,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 09b3ced1ed2..361c6ca6fc2 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).toHaveStyleRule('display', 'inline') - expect(fullDescription).toHaveStyleRule('display', 'none') + expect(truncatedDescription).toHaveClass('_display-inline') + expect(fullDescription).toHaveClass('_display-none') await act(() => userEvent.click(screen.getByText('Show more'))) - expect(truncatedDescription).toHaveStyleRule('display', 'none') - expect(fullDescription).toHaveStyleRule('display', 'inline') + expect(truncatedDescription).toHaveClass('_display-none') + expect(fullDescription).toHaveClass('_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 33295772833..c8c2b774ed9 100644 --- a/apps/web/src/components/Tokens/TokenDetails/TokenDescription.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/TokenDescription.tsx @@ -1,73 +1,82 @@ -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 styled, { useTheme } from 'lib/styled-components' +import { useTheme } from 'lib/styled-components' import { useTDPContext } from 'pages/TokenDetails/TDPContext' import { useCallback, useReducer } from 'react' import { Copy } from 'react-feather' -import { ClickableStyle, EllipsisStyle, ExternalLink, ThemedText } from 'theme/components' +import { ClickableTamaguiStyle, EllipsisTamaguiStyle, ExternalLink, ThemedText } from 'theme/components' +import { Flex, Paragraph, styled, Text } from 'ui/src' 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(Column)` - gap: 16px; - width: 100%; +const TokenInfoSection = styled(Flex, { + gap: '$gap16', + width: '100%', + $xl: { + gap: 24, + }, +}) - @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 InfoSectionHeader = styled(Text, { + variant: 'subheading1', +}) -const TokenNameRow = styled(Row)` - gap: 8px; - width: 100%; -` +const TokenNameRow = styled(Flex, { + row: true, + gap: '$gap8', + width: '100%', +}) -const TokenButtonRow = styled(TokenNameRow)` - flex-wrap: wrap; -` +const TokenButtonRow = styled(TokenNameRow, { + flexWrap: 'wrap', +}) -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 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 TokenDescriptionContainer = styled(ThemedText.BodyPrimary)` - ${EllipsisStyle} - max-width: 100%; - // max-height: fit-content; - line-height: 24px; - white-space: pre-wrap; -` +const TokenDescriptionContainer = styled(Text, { + variant: 'body1', + color: '$neutral1', + maxWidth: '100%', + maxHeight: 'fit-content', + ...EllipsisTamaguiStyle, + whiteSpace: 'pre-wrap', + lineHeight: 24, +}) -const DescriptionVisibilityWrapper = styled.p<{ $visible: boolean }>` - display: ${({ $visible }) => ($visible ? 'inline' : 'none')}; -` +const DescriptionVisibilityWrapper = styled(Paragraph, { + fontWeight: '$book', + variants: { + visible: { + true: { + display: 'inline', + }, + false: { + display: 'none', + }, + }, + } as const, +}) const TRUNCATE_CHARACTER_COUNT = 200 @@ -108,7 +117,7 @@ export function TokenDescription() { {!currency.isNative && ( - + {shortenAddress(currency.address)} @@ -149,10 +158,10 @@ export function TokenDescription() { )} {description && ( <> - + {description} - + {truncatedDescription} @@ -180,7 +189,7 @@ export function TokenDescription() { } > - + {sameFee ? ( {currency.symbol}  @@ -201,7 +210,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 b4791e45733..da8cebc75e1 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 { TamaguiEllipsisStyle } from 'theme/components' +import { EllipsisTamaguiStyle } 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 a03c80ebb89..58b5e6c5ac3 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`] = ` - .c11 { + .c7 { box-sizing: border-box; margin: 0; min-width: 0; } -.c12 { +.c8 { width: 100%; display: -webkit-box; display: -webkit-flex; @@ -25,7 +25,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` justify-content: flex-start; } -.c24 { +.c18 { 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; } -.c2 { +.c0 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -52,7 +52,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` width: fit-content; } -.c3 { +.c1 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -68,22 +68,22 @@ exports[`TDP Skeleton should render correctly 1`] = ` text-decoration: none; } -.c3:hover { +.c1:hover { color: #CECECE; } -.c23 { +.c17 { gap: 16px; padding: 24px 0px; -webkit-animation: iAjNNh 125ms ease-in; animation: iAjNNh 125ms ease-in; } -.c25 { +.c19 { font-size: 28px !important; } -.c4 { +.c2 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -98,7 +98,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` background-size: 400%; } -.c19 { +.c13 { color: #7D7D7D; font-size: 14px; min-width: 121px; @@ -109,7 +109,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` padding-bottom: 0px; } -.c18 { +.c12 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -122,19 +122,19 @@ exports[`TDP Skeleton should render correctly 1`] = ` flex-wrap: wrap; } -.c14 { +.c9 { gap: 16px; -webkit-animation: iAjNNh 125ms ease-in; animation: iAjNNh 125ms ease-in; } -.c22 { +.c16 { background-color: #22222212; border: none; height: 0.5px; } -.c39 { +.c31 { border-radius: 12px; height: 40px; width: 40px; @@ -149,7 +149,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` z-index: 2; } -.c41 { +.c33 { 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%; } -.c40 { +.c32 { position: absolute; left: 50%; -webkit-transform: translate(-50%,-50%); @@ -175,7 +175,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` margin: 0; } -.c31 { +.c23 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -194,37 +194,37 @@ exports[`TDP Skeleton should render correctly 1`] = ` background-color: #FFFFFF; } -.c35 { +.c27 { background-color: #F9F9F9; border-radius: 4px; height: 56px; width: 60px; } -.c37 { +.c29 { background-color: #F9F9F9; border-radius: 16px; height: 56px; width: 100px; } -.c42 { +.c34 { background-color: #F9F9F9; border-radius: 16px; height: 56px; width: 100%; } -.c36 { +.c28 { background-color: #22222212; height: 36px; } -.c32 { +.c24 { padding: 8px; } -.c34 { +.c26 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -239,7 +239,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` justify-content: space-between; } -.c33 { +.c25 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -257,203 +257,67 @@ exports[`TDP Skeleton should render correctly 1`] = ` padding: 48px 12px; } -.c38 { - position: relative; -} - -.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; + position: relative; } -.c5 { +.c3 { height: 16px; width: 180px; } -.c15 { +.c10 { height: 32px; border-radius: 8px; } -.c6 { +.c4 { width: 169px; } -.c9 { +.c5 { width: 32px; height: 32px; border-radius: 50%; } -.c10 { +.c6 { height: 36px; width: 136px; } -.c16 { +.c11 { width: 120px; } -.c20 { +.c14 { width: 80px; margin-bottom: 4px; } -.c21 { +.c15 { width: 116px; } -.c26 { +.c20 { margin-bottom: 6px; width: 100%; } -.c29 { +.c22 { width: 120px; } -.c27 { +.c21 { 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) { - .c19 { + .c13 { 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
@@ -900,7 +765,7 @@ exports[`TDP Skeleton should render correctly 1`] = `
@@ -914,29 +779,7 @@ exports[`TDP Skeleton should render correctly 1`] = ` exports[`getLoadingTitle should return correct title 1`] = ` - .c0 { - color: #CECECE; - font-size: 12px; - font-weight: 500; - line-height: 16px; - -webkit-text-decoration: none; - text-decoration: none; - -webkit-text-decoration: none; - text-decoration: none; - cursor: pointer; - -webkit-transition-duration: 125ms; - transition-duration: 125ms; -} - -.c0:hover { - opacity: 0.6; -} - -.c0:active { - opacity: 0.4; -} - - @@ -948,9 +791,11 @@ 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 b8eed37d75c..8706d70fdcd 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,52 +2,7 @@ exports[`TokenDescription no description or social buttons shown when not available 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; -} - -.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 { + .c1 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -58,90 +13,25 @@ exports[`TokenDescription no description or social buttons shown when not availa font-weight: 500; } -.c10:hover { +.c1:hover { opacity: 0.6; } -.c10:active { +.c1:active { opacity: 0.4; } -.c8 { +.c0 { display: inline-block; height: inherit; } -.c12 { +.c2 { 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 -
+
-

No token information available

-
+
@@ -245,52 +139,7 @@ exports[`TokenDescription no description or social buttons shown when not availa exports[`TokenDescription renders token information correctly with defaults 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; -} - -.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 { + .c1 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -301,105 +150,32 @@ exports[`TokenDescription renders token information correctly with defaults 1`] font-weight: 500; } -.c10:hover { +.c1:hover { opacity: 0.6; } -.c10:active { +.c1:active { opacity: 0.4; } -.c8 { +.c0 { display: inline-block; height: inherit; } -.c14 { +.c2 { color: #7D7D7D; font-weight: 485; font-size: 0.85em; padding-top: 0.5em; } -.c14:hover, -.c14:focus { +.c2:hover, +.c2: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 -
+ -

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
-
+
@@ -566,52 +348,7 @@ exports[`TokenDescription renders token information correctly with defaults 1`] exports[`TokenDescription truncates description and shows more 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; -} - -.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 { + .c1 { -webkit-text-decoration: none; text-decoration: none; cursor: pointer; @@ -622,105 +359,32 @@ exports[`TokenDescription truncates description and shows more 1`] = ` font-weight: 500; } -.c10:hover { +.c1:hover { opacity: 0.6; } -.c10:active { +.c1:active { opacity: 0.4; } -.c8 { +.c0 { display: inline-block; height: inherit; } -.c14 { +.c2 { color: #7D7D7D; font-weight: 485; font-size: 0.85em; padding-top: 0.5em; } -.c14:hover, -.c14:focus { +.c2:hover, +.c2: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 -
+ -

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 02d6c7bca49..00568479fec 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 styled from 'lib/styled-components' +import deprecatedStyled 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 { useIsTouchDevice } from 'ui/src' +import { Flex, 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 = styled(Hr)` +const DividerLine = deprecatedStyled(Hr)` margin-top: 40px; margin-bottom: 40px; @media screen and (max-width: ${({ theme }) => theme.breakpoint.sm}px) { @@ -41,9 +41,6 @@ const DividerLine = styled(Hr)` margin-bottom: 0; } ` -const BalanceSummaryContainer = styled.div` - margin-top: 40px; -` function TDPBreadcrumb() { const { address, currency, currencyChain } = useTDPContext() @@ -209,9 +206,9 @@ export default function TokenDetails() { {!showRightPanel && !!pageChainBalance && ( - + - + )} @@ -226,11 +223,12 @@ 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 54e795a6c71..44ebc73fc38 100644 --- a/apps/web/src/components/Tokens/TokenDetails/shared.ts +++ b/apps/web/src/components/Tokens/TokenDetails/shared.ts @@ -1,4 +1,4 @@ -import styled from 'lib/styled-components' +import deprecatedStyled 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 = styled.hr` +export const Hr = deprecatedStyled.hr` background-color: ${({ theme }) => theme.surface3}; border: none; height: 0.5px; ` -export const NoInfoAvailable = styled.p` +export const NoInfoAvailable = deprecatedStyled.p` color: ${({ theme }) => theme.neutral3}; font-weight: 485; font-size: 16px; ` -export const TruncateDescriptionButton = styled.div` +export const TruncateDescriptionButton = deprecatedStyled.div` color: ${({ theme }) => theme.neutral2}; font-weight: 485; font-size: 0.85em; diff --git a/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.test.tsx b/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.test.tsx index 90595a0a560..b1d1b3233d1 100644 --- a/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.test.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.test.tsx @@ -67,7 +67,8 @@ describe('TDPPoolTable', () => { tvl: 300, volume24h: 400, volumeWeek: 500, - oneDayApr: new Percent(6, 100), + volOverTvl: 1.84, + apr: new Percent(6, 100), protocolVersion: ProtocolVersion.V3, }, ] diff --git a/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx b/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx index bffdee4498d..502ae37d6e8 100644 --- a/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/tables/TokenDetailsPoolsTable.tsx @@ -1,14 +1,15 @@ import { ApolloError } from '@apollo/client' import { Token } from '@uniswap/sdk-core' -import { PoolTableColumns, PoolsTable, sortAscendingAtom, sortMethodAtom } from 'components/Pools/PoolTable/PoolTable' +import { PoolsTable, sortAscendingAtom, sortMethodAtom } from 'components/Pools/PoolTable/PoolTable' import { SupportedInterfaceChainId } from 'constants/chains' import { useUpdateManualOutage } from 'featureFlags/flags/outageBanner' import { usePoolsFromTokenAddress } from 'graphql/data/pools/usePoolsFromTokenAddress' +import { PoolSortFields } from 'graphql/data/pools/useTopPools' import { OrderDirection } from 'graphql/data/util' import { useAtomValue, useResetAtom } from 'jotai/utils' import { useEffect, useMemo } from 'react' -const HIDDEN_COLUMNS = [PoolTableColumns.Transactions] +const HIDDEN_COLUMNS = [PoolSortFields.VolOverTvl] export function TokenDetailsPoolsTable({ chainId, @@ -50,7 +51,6 @@ 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 0219d4ad54c..6b68277d0ca 100644 --- a/apps/web/src/components/Tokens/TokenDetails/tables/TransactionsTable.tsx +++ b/apps/web/src/components/Tokens/TokenDetails/tables/TransactionsTable.tsx @@ -1,7 +1,6 @@ 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' @@ -18,24 +17,28 @@ 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 styled from 'lib/styled-components' -import { useMemo, useReducer, useState } from 'react' -import { EllipsisStyle, ThemedText } from 'theme/components' +import { useMemo, useReducer, useRef, useState } from 'react' +import { EllipsisTamaguiStyle } from 'theme/components' +import { Flex, Text, styled } from 'ui/src' 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(ThemedText.BodyPrimary)` - display: inline-block; - ${EllipsisStyle} - max-width: 75px; -` +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 TableWrapper = styled.div` - min-height: 158px; -` interface SwapTransaction { hash: string timestamp: number @@ -62,6 +65,7 @@ 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, @@ -115,12 +119,12 @@ export function TransactionsTable({ id: 'timestamp', header: () => ( - + - + - + ), cell: (row) => ( @@ -136,17 +140,23 @@ export function TransactionsTable({ id: 'swap-type', header: () => ( - + - + - + ), @@ -154,9 +164,9 @@ export function TransactionsTable({ const isBuy = String(outputTokenAddress.getValue?.()).toLowerCase() === referenceToken.address.toLowerCase() return ( - + {isBuy ? : } - + ) }, @@ -170,16 +180,18 @@ export function TransactionsTable({ id: 'reference-amount', header: () => ( - ${unwrappedReferenceToken.symbol} + + ${unwrappedReferenceToken.symbol} + ), cell: (inputTokenAmount) => ( - + {formatNumber({ input: Math.abs(inputTokenAmount.getValue?.()) || 0, })} - + ), }, @@ -189,23 +201,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) => ( @@ -219,14 +231,16 @@ export function TransactionsTable({ id: 'fiat-value', header: () => ( - + {activeLocalCurrency} - + ), cell: (fiat) => ( - {formatFiatPrice({ price: fiat.getValue?.() })} + + {formatFiatPrice({ price: fiat.getValue?.() })} + ), }), @@ -234,9 +248,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 034f81dcbc4..a1d1342de98 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,80 +2,7 @@ exports[`TDPPoolTable renders data filled state 1`] = ` - .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 { + .c4 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -86,220 +13,55 @@ exports[`TDPPoolTable renders data filled state 1`] = ` left: 0; } -.c22 img { +.c4 img { width: 14px; height: 28px; object-fit: cover; } -.c22 img:first-child { +.c4 img:first-child { border-radius: 14px 0 0 14px; object-position: 0 0; } -.c22 img:last-child { +.c4 img:last-child { border-radius: 0 14px 14px 0; object-position: 100% 0; } -.c23 { +.c5 { width: 14px; height: 28px; border-radius: 50%; } -.c21 { - position: relative; - top: 0; - left: 0; -} - -.c0 { +.c3 { 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; -} - -.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; + top: 0; + left: 0; } -.c7:first-child { - -webkit-box-flex: 0; - -webkit-flex-grow: 0; - -ms-flex-positive: 0; - flex-grow: 0; +.c0 { + display: inline-block; + height: inherit; } -.c18 { +.c2 { color: none; -webkit-text-decoration: none; text-decoration: none; cursor: pointer; } -.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 { +.c1 { height: 16px; width: 16px; color: #222222; @@ -308,116 +70,6 @@ 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 -
+ APR +
-
- 7 day volume -
+ 1D vol +
-
- 1 day APR -
+ 7D vol +
@@ -585,147 +243,135 @@ exports[`TDPPoolTable renders data filled state 1`] = `
-
-
- - - - Loading -
-
@@ -737,62 +383,23 @@ exports[`TDPPoolTable renders data filled state 1`] = ` exports[`TDPPoolTable renders error state 1`] = ` - .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; + .c6 { + color: #222222; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c22 { - color: #222222; +.c7 { + color: #7D7D7D; -webkit-letter-spacing: -0.01em; -moz-letter-spacing: -0.01em; -ms-letter-spacing: -0.01em; letter-spacing: -0.01em; } -.c0 { +.c5 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -806,7 +413,7 @@ exports[`TDPPoolTable renders error state 1`] = ` justify-content: flex-start; } -.c21 { +.c4 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -825,183 +432,23 @@ exports[`TDPPoolTable renders error state 1`] = ` -webkit-transform: translate(-50%,-50%); -ms-transform: translate(-50%,-50%); transform: translate(-50%,-50%); - width: 320px; - padding: 12px; - gap: 12px; - background-color: #00000004; - -webkit-backdrop-filter: blur(24px); - backdrop-filter: blur(24px); - box-shadow: 0 4px 6px rgba(0,0,0,0.1); - border: 1px #22222212 solid; - border-radius: 20px; -} - -.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; -} - -.c13:hover { - opacity: 0.6; + width: 320px; + padding: 12px; + gap: 12px; + background-color: #00000004; + -webkit-backdrop-filter: blur(24px); + backdrop-filter: blur(24px); + box-shadow: 0 4px 6px rgba(0,0,0,0.1); + border: 1px #22222212 solid; + border-radius: 20px; } -.c13:active { - opacity: 0.4; +.c0 { + display: inline-block; + height: inherit; } -.c14 { +.c1 { height: 16px; width: 16px; color: #222222; @@ -1010,11 +457,7 @@ exports[`TDPPoolTable renders error state 1`] = ` transform: rotate(0deg); } -.c15 { - color: #222222; -} - -.c19 { +.c2 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -1029,105 +472,11 @@ exports[`TDPPoolTable renders error state 1`] = ` background-size: 400%; } -.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 { +.c3 { width: 75%; height: 16px; } -@media not all and (hover:none) { - .c18:hover { - background: #22222212; - } -} -
-
# -
+
-
Pool -
+
-
TVL -
+
-
- 1 day volume -
+ APR +
-
- 7 day volume -
+ 1D vol +
-
- 1 day APR -
+ 7D vol +
@@ -1295,542 +650,542 @@ exports[`TDPPoolTable renders error state 1`] = `
@@ -1863,44 +1218,21 @@ exports[`TDPPoolTable renders error state 1`] = `
Error loading data
Data is unavailable at the moment; we’re working on a fix
-
-
- - - - Loading -
-
@@ -1912,232 +1244,12 @@ exports[`TDPPoolTable renders error state 1`] = ` exports[`TDPPoolTable renders loading state 1`] = ` - .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 { + .c0 { 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; @@ -2146,11 +1258,7 @@ exports[`TDPPoolTable renders loading state 1`] = ` transform: rotate(0deg); } -.c15 { - color: #222222; -} - -.c19 { +.c2 { border-radius: 12px; border-radius: 12px; height: 24px; @@ -2165,105 +1273,11 @@ exports[`TDPPoolTable renders loading state 1`] = ` background-size: 400%; } -.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 { +.c3 { width: 75%; height: 16px; } -@media not all and (hover:none) { - .c18:hover { - background: #22222212; - } -} -
-
# -
+
-
Pool -
+
-
TVL -
+
-
- 1 day volume -
+ APR +
-
- 7 day volume -
+ 1D vol +
-
- 1 day APR -
+ 7D vol +
@@ -2431,564 +1451,541 @@ 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 65a2fa80b78..64906a38e53 100644 --- a/apps/web/src/components/Tokens/TokenTable/NetworkFilter.tsx +++ b/apps/web/src/components/Tokens/TokenTable/NetworkFilter.tsx @@ -1,3 +1,4 @@ +import { InterfaceEventName, InterfacePageName } from '@uniswap/analytics-events' import Badge from 'components/Badge' import { DropdownSelector, InternalMenuItem } from 'components/DropdownSelector' import { ChainLogo } from 'components/Logo/ChainLogo' @@ -5,6 +6,7 @@ import { AllNetworksIcon } from 'components/Tokens/TokenTable/icons' import { BACKEND_NOT_YET_SUPPORTED_CHAIN_IDS, BACKEND_SUPPORTED_CHAINS, + InterfaceGqlChain, useChainFromUrlParam, useIsSupportedChainIdCallback, } from 'constants/chains' @@ -12,15 +14,18 @@ import { getSupportedGraphQlChain, supportedChainIdFromGQLChain } from 'graphql/ import deprecatedStyled, { useTheme } from 'lib/styled-components' import { ExploreTab } from 'pages/Explore' import { useExploreParams } from 'pages/Explore/redirects' -import { useState } from 'react' +import { Dispatch, SetStateAction, memo, useState } from 'react' import { Check } from 'react-feather' import { useNavigate } from 'react-router-dom' -import { TamaguiEllipsisStyle } from 'theme/components' +import { EllipsisTamaguiStyle } 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', @@ -40,103 +45,135 @@ const StyledDropdown = { minWidth: 256, right: 0, px: 0, - $xl: { + $lg: { 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: true }) + const currentChain = getSupportedGraphQlChain(useChainFromUrlParam(), { + fallbackToEthereum: !isMultichainExploreEnabled, + }) const tab = exploreParams.tab return (
- - {!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} - /> + + + {!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} + /> +
) } + +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 cf03b40f247..27132948258 100644 --- a/apps/web/src/components/Tokens/TokenTable/index.tsx +++ b/apps/web/src/components/Tokens/TokenTable/index.tsx @@ -4,7 +4,6 @@ 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' @@ -19,33 +18,44 @@ import { useSetSortMethod, } from 'components/Tokens/state' import { MouseoverTooltip } from 'components/Tooltip' -import { SupportedInterfaceChainId, chainIdToBackendChain, useChainFromUrlParam } from 'constants/chains' +import { chainIdToBackendChain, getChainFromChainUrlParam, useChainFromUrlParam } from 'constants/chains' import { NATIVE_CHAIN_ID } from 'constants/tokens' import { SparklineMap, TopToken, useTopTokens } from 'graphql/data/TopTokens' -import { OrderDirection, getSupportedGraphQlChain, getTokenDetailsURL } from 'graphql/data/util' +import { OrderDirection, getSupportedGraphQlChain, getTokenDetailsURL, unwrapToken } from 'graphql/data/util' import { useAtomValue } from 'jotai/utils' -import styled from 'lib/styled-components' -import { ReactElement, ReactNode, useMemo } from 'react' -import { EllipsisStyle, ThemedText } from 'theme/components' +import { ReactElement, ReactNode, memo, 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 { Trans } from 'uniswap/src/i18n' import { NumberType, useFormatter } from 'utils/formatNumbers' -const TableWrapper = styled.div` - margin: 0 auto; - max-width: ${MAX_WIDTH_MEDIA_BREAKPOINT}; -` +const TableWrapper = styled(Flex, { + m: '0 auto', + maxWidth: MAX_WIDTH_MEDIA_BREAKPOINT, +}) -export const NameText = styled(ThemedText.BodyPrimary)` - ${EllipsisStyle} -` -const ValueText = styled(ThemedText.BodyPrimary)` - ${EllipsisStyle} -` +export const EllipsisText = styled(Text, { + variant: 'body2', + color: '$neutral1', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', +}) -const SparklineContainer = styled.div` - width: 124px; - height: 40px; -` +const SparklineContainer = styled(Flex, { + width: '124px', + height: '$spacing40', +}) + +const TokenTableText = styled(Text, { + variant: 'body2', + color: '$neutral2', + maxWidth: '100%', +}) interface TokenTableValue { index: number @@ -61,19 +71,69 @@ interface TokenTableValue { linkState: { preloadedLogoSrc?: string } } -function TokenDescription({ token }: { token: TopToken }) { +function TokenDescription({ token }: { token: TopToken | TokenStat }) { return ( - + - {token?.project?.name ?? token?.name} - {token?.symbol} - + {token?.project?.name ?? token?.name} + + {token?.symbol} + + ) } -export function TopTokensTable() { +export const TopTokensTable = memo(function TopTokensTable() { const chain = getSupportedGraphQlChain(useChainFromUrlParam(), { fallbackToEthereum: true }) - const { tokens, tokenSortRank, loadingTokens, sparklines, error } = useTopTokens(chain.backendChain.chain) + 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, + ]) return ( @@ -81,13 +141,12 @@ export function TopTokensTable() { tokens={tokens} tokenSortRank={tokenSortRank} sparklines={sparklines} - loading={loadingTokens} + loading={loading} error={error} - chainId={chain.id} /> ) -} +}) const HEADER_TEXT: Record = { [TokenSortMethod.FULLY_DILUTED_VALUATION]: , @@ -118,9 +177,9 @@ function TokenTableHeader({ return ( - + {isCurrentSortMethod && } - {HEADER_TEXT[category]} + {HEADER_TEXT[category]} ) @@ -133,15 +192,13 @@ function TokenTable({ loading, error, loadMore, - chainId, }: { - tokens?: readonly TopToken[] + tokens?: readonly TopToken[] | TokenStat[] tokenSortRank: Record sparklines: SparklineMap loading: boolean - error?: ApolloError + error?: ApolloError | boolean loadMore?: ({ onComplete }: { onComplete?: () => void }) => void - chainId: SupportedInterfaceChainId }) { const { formatFiatPrice, formatNumber, formatDelta } = useFormatter() const sortAscending = useAtomValue(sortAscendingAtom) @@ -153,14 +210,19 @@ function TokenTable({ const tokenTableValues: TokenTableValue[] | undefined = useMemo( () => tokens?.map((token, i) => { - const delta1hr = token?.market?.pricePercentChange1Hour?.value - const delta1d = token?.market?.pricePercentChange1Day?.value + 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 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: token?.market?.price?.value ?? 0, + tokenDescription: , + price: isGqlToken ? token?.market?.price?.value ?? 0 : giveExploreStatDefaultValue(token?.price?.value), testId: `token-table-row-${token?.address}`, percentChange1hr: ( <> @@ -174,8 +236,10 @@ function TokenTable({ {formatDelta(delta1d)} ), - fdv: token?.project?.markets?.[0]?.fullyDilutedValuation?.value ?? 0, - volume: token?.market?.volume?.value ?? 0, + fdv: isGqlToken + ? token?.project?.markets?.[0]?.fullyDilutedValuation?.value ?? 0 + : giveExploreStatDefaultValue(token?.fullyDilutedValuation?.value), + volume: isGqlToken ? token?.market?.volume?.value ?? 0 : giveExploreStatDefaultValue(token?.volume?.value), sparkline: ( @@ -185,7 +249,9 @@ function TokenTable({ width={width} height={height} tokenData={token} - pricePercentChange={token?.market?.pricePercentChange?.value} + pricePercentChange={ + isGqlToken ? token?.market?.pricePercentChange?.value : token?.pricePercentChange1Day?.value + } sparklineMap={sparklines} /> ) @@ -194,7 +260,7 @@ function TokenTable({ ), link: getTokenDetailsURL({ - address: token?.address, + address: unwrappedToken?.address, chain: chainIdToBackendChain({ chainId, withFallback: true }), }), analytics: { @@ -210,10 +276,10 @@ function TokenTable({ search_token_address_input: filterString, }, }, - linkState: { preloadedLogoSrc: token?.project?.logoUrl }, + linkState: { preloadedLogoSrc: isGqlToken ? token?.project?.logoUrl : token?.logo }, } }) ?? [], - [chainId, filterString, formatDelta, sparklines, timePeriod, tokenSortRank, tokens], + [filterString, formatDelta, sparklines, timePeriod, tokenSortRank, tokens], ) const showLoadingSkeleton = loading || !!error @@ -224,12 +290,12 @@ function TokenTable({ id: 'index', header: () => ( - # + # ), cell: (index) => ( - {index.getValue?.()} + {index.getValue?.()} ), }), @@ -237,14 +303,14 @@ function TokenTable({ id: 'tokenDescription', header: () => ( - + - + ), cell: (tokenDescription) => ( - {tokenDescription.getValue?.()} + {tokenDescription.getValue?.()} ), }), @@ -261,12 +327,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 })} - + ), }), @@ -317,7 +383,7 @@ function TokenTable({ ), cell: (fdv) => ( - {formatNumber({ input: fdv.getValue?.(), type: NumberType.FiatTokenStats })} + {formatNumber({ input: fdv.getValue?.(), type: NumberType.FiatTokenStats })} ), }), @@ -334,7 +400,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 bfcc25cc316..64f3bc94cd0 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 styled from 'lib/styled-components' +import deprecatedStyled from 'lib/styled-components' import { lighten } from 'polished' /* Loading state bubbles (animation style from: src/components/Loader/styled.tsx) */ -export const LoadingBubble = styled.div<{ +export const LoadingBubble = deprecatedStyled.div<{ height?: string width?: string round?: boolean diff --git a/apps/web/src/components/Tooltip/index.tsx b/apps/web/src/components/Tooltip/index.tsx index e4bf223d746..7dbfed4dfe2 100644 --- a/apps/web/src/components/Tooltip/index.tsx +++ b/apps/web/src/components/Tooltip/index.tsx @@ -2,7 +2,7 @@ import { Placement } from '@popperjs/core' import Popover, { PopoverProps } from 'components/Popover' import styled from 'lib/styled-components' import { transparentize } from 'polished' -import { PropsWithChildren, ReactNode, useCallback, useEffect, useState } from 'react' +import { PropsWithChildren, ReactNode, memo, useCallback, useEffect, useState } from 'react' import noop from 'utilities/src/react/noop' export enum TooltipSize { @@ -83,7 +83,7 @@ type MouseoverTooltipProps = Omit & forceShow?: boolean }> -export function MouseoverTooltip(props: MouseoverTooltipProps) { +export const MouseoverTooltip = memo(function MouseoverTooltip(props: MouseoverTooltipProps) { const { text, disabled, children, onOpen, forceShow, timeout, ...rest } = props const [show, setShow] = useState(false) const open = () => { @@ -119,7 +119,7 @@ export function MouseoverTooltip(props: MouseoverTooltipProps) {
) -} +}) const CursorFollowerContainer = styled.div` position: fixed; diff --git a/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx b/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx index 8382ad8a671..84b7cb11363 100644 --- a/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx +++ b/apps/web/src/components/TopLevelBanners/MobileAppPromoBanner.tsx @@ -11,7 +11,8 @@ import { hideMobileAppPromoBannerAtom } from 'state/application/atoms' import { BREAKPOINTS } from 'theme' import { ThemedText } from 'theme/components' import { Z_INDEX } from 'theme/zIndex' -import { Trans } from 'uniswap/src/i18n' +import { Text } from 'ui/src' +import { Trans, useTranslation } from 'uniswap/src/i18n' import { isWebAndroid, isWebIOS } from 'utilities/src/platform' import { getWalletMeta } from 'utils/walletMeta' @@ -84,6 +85,7 @@ function getDownloadLink(userAgent: string, peerWalletAgent?: string): string { } export function MobileAppPromoBanner() { + const { t } = useTranslation() const [isVisible, setIsVisible] = useState(true) const theme = useTheme() const mobileAppPromoBannerEligible = useMobileAppPromoBannerEligible() @@ -120,9 +122,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 59f16ea4118..c5ec5581467 100644 --- a/apps/web/src/components/TopLevelModals/index.tsx +++ b/apps/web/src/components/TopLevelModals/index.tsx @@ -18,8 +18,6 @@ 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() { @@ -30,7 +28,6 @@ export default function TopLevelModals() { useAccountRiskCheck(account.address) const accountBlocked = Boolean(blockedAccountModalOpen && account.isConnected) const shouldShowDevFlags = isDevEnv() || isBetaEnv() - const extensionIsLaunched = useFeatureFlag(FeatureFlags.ExtensionLaunch) return ( <> @@ -51,7 +48,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 719aaac5384..df9f2b6cb24 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 c79da6a7080..b320a086b13 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 and launch flag is true', () => { + it('Download wallet option should be visible if extension is not detected', () => { mocked(useConnectorWithId).mockImplementation((id) => id === CONNECTION.UNISWAP_EXTENSION_RDNS ? undefined : WALLET_CONNECT_CONNECTOR, ) @@ -30,16 +30,6 @@ 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 f2d5f54983f..8f2581b36a2 100644 --- a/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx +++ b/apps/web/src/components/WalletModal/UniswapWalletOptions.tsx @@ -1,4 +1,6 @@ +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' @@ -7,13 +9,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 { Image, Text } from 'ui/src' +import { Flex, Image, Text } from 'ui/src' import { UNISWAP_LOGO } from 'ui/src/assets' -import { ScanQr } from 'ui/src/components/icons/ScanQr' +import { AppStoreLogo, PhoneDownload, ScanQr } from 'ui/src/components/icons' 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; @@ -44,7 +46,6 @@ export function UniswapWalletOptions() { const uniswapWalletConnectConnector = useConnectorWithId(CONNECTION.UNISWAP_WALLET_CONNECT_CONNECTOR_ID, { shouldThrow: true, }) - const extensionIsLaunched = useFeatureFlag(FeatureFlags.ExtensionLaunch) const { connect } = useConnect() @@ -59,21 +60,21 @@ export function UniswapWalletOptions() { > - + - ) : // If the extension is not detected, show the option to download the app - extensionIsLaunched ? ( + ) : // If not on a mobile web browser show the download wallet modal (includes link to download extension) + !isMobileWeb ? ( ) : null} connect({ connector: uniswapWalletConnectConnector })}> - + @@ -82,6 +83,35 @@ 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 0f748b7ee0d..bbb30d2bf95 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 and launch flag is true 1`] = ` +exports[`UniswapWalletOptions Test Download wallet option should be visible if extension is not detected 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,177 +236,7 @@ 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 @@ -592,7 +422,7 @@ exports[`UniswapWalletOptions Test Extension connecter should be shown if detect class="c2 c5" > Uniswap Extension @@ -633,7 +463,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 3bff6131427..541b1385796 100644 --- a/apps/web/src/components/WalletModal/index.tsx +++ b/apps/web/src/components/WalletModal/index.tsx @@ -2,19 +2,22 @@ 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/accountCTAsExperimentUtils' 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, useUniswapWalletOptions } from 'hooks/useUniswapWalletOptions' +import { useIsUniExtensionAvailable } 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 { Trans } from 'uniswap/src/i18n' +import { Experiments } from 'uniswap/src/features/gating/experiments' +import { useExperimentGroupName } from 'uniswap/src/features/gating/hooks' +import { Trans, useTranslation } from 'uniswap/src/i18n' const Wrapper = styled.div<{ isUniExtensionAvailable?: boolean }>` ${flexColumnNoWrap}; @@ -69,40 +72,39 @@ const StyledCollapsedIcon = styled(CollapsedIcon)` ` export default function WalletModal() { + const { t } = useTranslation() const showMoonpayText = useShowMoonpayText() - const showUniswapWalletOptions = useUniswapWalletOptions() - const connectors = useOrderedConnections(showUniswapWalletOptions) + const connectors = useOrderedConnections(true /** exclude uniswap connectors since they're shown separately */) 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')} + - {showUniswapWalletOptions && ( - <> - - isUniExtensionAvailable && toggleShowOtherWallets()} - > - - - - - - {isUniExtensionAvailable ? showOtherWallets ? : : null} - - - - - )} + + isUniExtensionAvailable && toggleShowOtherWallets()} + > + + + + + + {isUniExtensionAvailable ? showOtherWallets ? : : null} + + + diff --git a/apps/web/src/components/Web3Provider/WebUniswapContext.tsx b/apps/web/src/components/Web3Provider/WebUniswapContext.tsx index 183a7897f4f..ca0d15d628a 100644 --- a/apps/web/src/components/Web3Provider/WebUniswapContext.tsx +++ b/apps/web/src/components/Web3Provider/WebUniswapContext.tsx @@ -1,27 +1,24 @@ 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 { +function useWagmiAccount(): AccountMeta | undefined { const account = useAccount() + return useMemo(() => { - // TODO(WEB-4736): remove this default account stub once swap flow supports unconnected state. if (!account.address) { - return { - address: '0x67d615D6bccAA1562B1cca9786384b4840597ecD', - type: AccountType.Readonly, - } + return undefined } + return { address: account.address, type: AccountType.SignerMnemonic, @@ -33,11 +30,15 @@ function useWagmiAccount(): AccountMeta { export function WebUniswapProvider({ children }: PropsWithChildren) { const account = useWagmiAccount() const signer = useEthersSigner() - - const sharedSwapEnabled = useFeatureFlag(FeatureFlags.UniversalSwap) + const showSwapNetworkNotification = useShowSwapNetworkNotification() return ( - + {children} ) diff --git a/apps/web/src/components/Web3Status/index.tsx b/apps/web/src/components/Web3Status/index.tsx index 09a12f0227f..f4062ef3990 100644 --- a/apps/web/src/components/Web3Status/index.tsx +++ b/apps/web/src/components/Web3Status/index.tsx @@ -5,6 +5,7 @@ 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/accountCTAsExperimentUtils' import { RowBetween } from 'components/Row' import { useAccountIdentifier } from 'components/Web3Status/useAccountIdentifier' import { PrefetchBalancesWrapper } from 'graphql/data/apollo/TokenBalancesProvider' @@ -17,10 +18,13 @@ 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 { useExperimentGroupNameWithLoading } from 'uniswap/src/features/gating/hooks' import Trace from 'uniswap/src/features/telemetry/Trace' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' -import { Trans } from 'uniswap/src/i18n' +import { Trans, useTranslation } from 'uniswap/src/i18n' import { isIFramed } from 'utils/isIFramed' // https://stackoverflow.com/a/31617326 @@ -106,7 +110,7 @@ const AddressAndChevronContainer = styled.div<{ $loading?: boolean }>` } ` -const Text = styled.span` +const StyledText = styled.span` flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; @@ -129,6 +133,22 @@ const StyledConnectButton = styled.button` color: inherit; ` +function ExistingUserCTAButton() { + const { t } = useTranslation() + + const { value: accountsCTAExperimentGroup } = useExperimentGroupNameWithLoading(Experiments.AccountCTAs) + const isSignIn = accountsCTAExperimentGroup === AccountCTAsExperimentGroup.SignInSignUp + const isLogIn = accountsCTAExperimentGroup === 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() { @@ -145,21 +165,23 @@ function Web3StatusInner() { const accountDrawer = useAccountDrawer() const handleWalletDropdownClick = useCallback(() => { sendAnalyticsEvent(InterfaceEventName.ACCOUNT_DROPDOWN_BUTTON_CLICKED) - accountDrawer.open() + accountDrawer.toggle() }, [accountDrawer]) const { hasPendingActivity, pendingActivityCount } = usePendingActivity() const { accountIdentifier, hasUnitag, hasRecent } = useAccountIdentifier() + const { isLoading: isExperimentGroupNameLoading } = useExperimentGroupNameWithLoading(Experiments.AccountCTAs) + // TODO(WEB-4173): Remove isIFrame check when we can update wagmi to version >= 2.9.4 - if ((account.isConnecting || account.isReconnecting) && hasRecent && !isIFramed()) { + if (((account.isConnecting || account.isReconnecting) && hasRecent && !isIFramed()) || isExperimentGroupNameLoading) { return ( - {accountIdentifier} + {accountIdentifier} {hasUnitag && } @@ -179,14 +201,14 @@ function Web3StatusInner() { {!hasPendingActivity && } {hasPendingActivity ? ( - + - {' '} + {' '} ) : ( - {accountIdentifier} + {accountIdentifier} {hasUnitag && } )} @@ -206,9 +228,7 @@ 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 c32e3556bfe..1e1b6a37901 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 { AlertTriangle } from 'ui/src/components/icons/AlertTriangle' +import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled' 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 afe31970910..47e0305cf86 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 { AlertTriangle } from 'ui/src/components/icons/AlertTriangle' +import { AlertTriangleFilled } from 'ui/src/components/icons/AlertTriangleFilled' 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/components/vote/DelegateModal.tsx b/apps/web/src/components/vote/DelegateModal.tsx deleted file mode 100644 index 50ffe189e77..00000000000 --- a/apps/web/src/components/vote/DelegateModal.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { isAddress } from '@ethersproject/address' -import AddressInputPanel from 'components/AddressInputPanel' -import { ButtonPrimary } from 'components/Button' -import { AutoColumn } from 'components/Column' -import Modal from 'components/Modal' -import { LoadingView, SubmittedView } from 'components/ModalViews' -import { RowBetween } from 'components/Row' -import { UNI } from 'constants/tokens' -import { useAccount } from 'hooks/useAccount' -import useENS from 'hooks/useENS' -import { useTokenBalance } from 'lib/hooks/useCurrencyBalance' -import styled from 'lib/styled-components' -import { ReactNode, useState } from 'react' -import { X } from 'react-feather' -import { useDelegateCallback } from 'state/governance/hooks' -import { ThemedText } from 'theme/components' -import { Text } from 'ui/src' -import { Trans } from 'uniswap/src/i18n' -import { logger } from 'utilities/src/logger/logger' -import { formatCurrencyAmount } from 'utils/formatCurrencyAmount' - -const ContentWrapper = styled(AutoColumn)` - width: 100%; - padding: 24px; -` - -const StyledClosed = styled(X)` - :hover { - cursor: pointer; - } -` - -const TextButton = styled.div` - :hover { - cursor: pointer; - } -` - -interface VoteModalProps { - isOpen: boolean - onDismiss: () => void - title: ReactNode -} - -export default function DelegateModal({ isOpen, onDismiss, title }: VoteModalProps) { - const account = useAccount() - - // state for delegate input - const [usingDelegate, setUsingDelegate] = useState(false) - const [typed, setTyped] = useState('') - function handleRecipientType(val: string) { - setTyped(val) - } - - // monitor for self delegation or input for third part delegate - // default is self delegation - const activeDelegate = usingDelegate ? typed : account.address - const { address: parsedAddress } = useENS(activeDelegate) - - // get the number of votes available to delegate - const uniBalance = useTokenBalance(account.address, account.chainId ? UNI[account.chainId] : undefined) - - const delegateCallback = useDelegateCallback() - - // monitor call to help UI loading state - const [hash, setHash] = useState() - const [attempting, setAttempting] = useState(false) - - // wrapper to reset state on modal close - function wrappedOnDismiss() { - setHash(undefined) - setAttempting(false) - onDismiss() - } - - async function onDelegate() { - setAttempting(true) - - // if callback not returned properly ignore - if (!delegateCallback) { - return - } - - // try delegation and store hash - const hash = await delegateCallback(parsedAddress ?? undefined)?.catch((error) => { - setAttempting(false) - logger.info('DelegateModal', 'onDelegate', error) - }) - - if (hash) { - setHash(hash) - } - } - - return ( - - {!attempting && !hash && ( - - - - {title} - - - - - - - - - {usingDelegate && } - - - {usingDelegate ? : } - - - setUsingDelegate(!usingDelegate)}> - - {usingDelegate ? : } - - - - - )} - {attempting && !hash && ( - - - - {usingDelegate ? : } - - {formatCurrencyAmount(uniBalance, 4)} - - - )} - {hash && ( - - - - - - {formatCurrencyAmount(uniBalance, 4)} - - - )} - - ) -} diff --git a/apps/web/src/components/vote/ExecuteModal.tsx b/apps/web/src/components/vote/ExecuteModal.tsx deleted file mode 100644 index 7bfa124c262..00000000000 --- a/apps/web/src/components/vote/ExecuteModal.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import Circle from 'assets/images/blue-loader.svg' -import { ButtonPrimary } from 'components/Button' -import { AutoColumn, ColumnCenter } from 'components/Column' -import Modal from 'components/Modal' -import { RowBetween } from 'components/Row' -import { useAccount } from 'hooks/useAccount' -import styled, { useTheme } from 'lib/styled-components' -import { useState } from 'react' -import { ArrowUpCircle, X } from 'react-feather' -import { useExecuteCallback } from 'state/governance/hooks' -import { CustomLightSpinner, ExternalLink, ThemedText } from 'theme/components' -import { Trans } from 'uniswap/src/i18n' -import { logger } from 'utilities/src/logger/logger' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -const ContentWrapper = styled(AutoColumn)` - width: 100%; - padding: 24px; -` - -const StyledClosed = styled(X)` - :hover { - cursor: pointer; - } -` - -const ConfirmOrLoadingWrapper = styled.div` - width: 100%; - padding: 24px; -` - -const ConfirmedIcon = styled(ColumnCenter)` - padding: 60px 0; -` - -interface ExecuteModalProps { - isOpen: boolean - onDismiss: () => void - proposalId?: string // id for the proposal to execute -} - -export default function ExecuteModal({ isOpen, onDismiss, proposalId }: ExecuteModalProps) { - const { chainId } = useAccount() - const executeCallback = useExecuteCallback() - - // monitor call to help UI loading state - const [hash, setHash] = useState() - const [attempting, setAttempting] = useState(false) - - // get theme for colors - const theme = useTheme() - - // wrapper to reset state on modal close - function wrappedOnDismiss() { - setHash(undefined) - setAttempting(false) - onDismiss() - } - - async function onExecute() { - setAttempting(true) - - // if callback not returned properly ignore - if (!executeCallback) { - return - } - - // try delegation and store hash - const hash = await executeCallback(proposalId)?.catch((error) => { - setAttempting(false) - logger.info('ExecuteModal', 'onExecute', error) - }) - - if (hash) { - setHash(hash) - } - } - - return ( - - {!attempting && !hash && ( - - - - - - - - - - - - - - - - - - - - - )} - {attempting && !hash && ( - - -
- - - - - - - - - - - - - - - - - )} - {hash && ( - - -
- - - - - - - - - - - - {chainId && ( - - - - - - )} - - - )} - - ) -} diff --git a/apps/web/src/components/vote/ProposalEmptyState.tsx b/apps/web/src/components/vote/ProposalEmptyState.tsx deleted file mode 100644 index 503e0864d2a..00000000000 --- a/apps/web/src/components/vote/ProposalEmptyState.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { useAccount } from 'hooks/useAccount' -import styled from 'lib/styled-components' -import { ThemedText } from 'theme/components' -import { Trans } from 'uniswap/src/i18n' -import { UniverseChainId } from 'uniswap/src/types/chains' - -const EmptyProposals = styled.div` - border: 1px solid ${({ theme }) => theme.neutral2}; - padding: 16px 12px; - border-radius: 12px; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -` -const Sub = styled.i` - align-items: center; - display: flex; - justify-content: center; - text-align: center; -` -interface EmptyStateProps { - HeaderContent: () => JSX.Element - SubHeaderContent: () => JSX.Element -} -const EmptyState = ({ HeaderContent, SubHeaderContent }: EmptyStateProps) => ( - - - - - - - - - - -) - -export default function ProposalEmptyState() { - const { chainId } = useAccount() - if (chainId && chainId !== UniverseChainId.Mainnet) { - return ( - } - SubHeaderContent={() => } - /> - ) - } - return ( - } - SubHeaderContent={() => } - /> - ) -} diff --git a/apps/web/src/components/vote/QueueModal.tsx b/apps/web/src/components/vote/QueueModal.tsx deleted file mode 100644 index 0ebee43e6c8..00000000000 --- a/apps/web/src/components/vote/QueueModal.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import Circle from 'assets/images/blue-loader.svg' -import { ButtonPrimary } from 'components/Button' -import { AutoColumn, ColumnCenter } from 'components/Column' -import Modal from 'components/Modal' -import { RowBetween } from 'components/Row' -import { useAccount } from 'hooks/useAccount' -import styled, { useTheme } from 'lib/styled-components' -import { useState } from 'react' -import { ArrowUpCircle, X } from 'react-feather' -import { useQueueCallback } from 'state/governance/hooks' -import { CustomLightSpinner, ExternalLink, ThemedText } from 'theme/components' -import { Trans } from 'uniswap/src/i18n' -import { logger } from 'utilities/src/logger/logger' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -const ContentWrapper = styled(AutoColumn)` - width: 100%; - padding: 24px; -` - -const StyledClosed = styled(X)` - :hover { - cursor: pointer; - } -` - -const ConfirmOrLoadingWrapper = styled.div` - width: 100%; - padding: 24px; -` - -const ConfirmedIcon = styled(ColumnCenter)` - padding: 60px 0; -` - -interface QueueModalProps { - isOpen: boolean - onDismiss: () => void - proposalId?: string // id for the proposal to queue -} - -export default function QueueModal({ isOpen, onDismiss, proposalId }: QueueModalProps) { - const { chainId } = useAccount() - const queueCallback = useQueueCallback() - - // monitor call to help UI loading state - const [hash, setHash] = useState() - const [attempting, setAttempting] = useState(false) - - // get theme for colors - const theme = useTheme() - - // wrapper to reset state on modal close - function wrappedOnDismiss() { - setHash(undefined) - setAttempting(false) - onDismiss() - } - - async function onQueue() { - setAttempting(true) - - // if callback not returned properly ignore - if (!queueCallback) { - return - } - - // try delegation and store hash - const hash = await queueCallback(proposalId)?.catch((error) => { - setAttempting(false) - logger.info('QueueModal', 'onQueue', error) - }) - - if (hash) { - setHash(hash) - } - } - - return ( - - {!attempting && !hash && ( - - - - - - - - - - - - - - - - - - - - - )} - {attempting && !hash && ( - - -
- - - - - - - - - - - - - - - - - )} - {hash && ( - - -
- - - - - - - - - - - - {chainId && ( - - - - - - )} - - - )} - - ) -} diff --git a/apps/web/src/components/vote/VoteModal.tsx b/apps/web/src/components/vote/VoteModal.tsx deleted file mode 100644 index 2f54e4494ce..00000000000 --- a/apps/web/src/components/vote/VoteModal.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import Circle from 'assets/images/blue-loader.svg' -import { ButtonPrimary } from 'components/Button' -import { AutoColumn, ColumnCenter } from 'components/Column' -import Modal from 'components/Modal' -import { RowBetween } from 'components/Row' -import { useAccount } from 'hooks/useAccount' -import styled, { useTheme } from 'lib/styled-components' -import { useState } from 'react' -import { ArrowUpCircle, X } from 'react-feather' -import { useUserVotes, useVoteCallback } from 'state/governance/hooks' -import { VoteOption } from 'state/governance/types' -import { CustomLightSpinner, ExternalLink, ThemedText } from 'theme/components' -import { Trans } from 'uniswap/src/i18n' -import { logger } from 'utilities/src/logger/logger' -import { formatCurrencyAmount } from 'utils/formatCurrencyAmount' -import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink' - -const ContentWrapper = styled(AutoColumn)` - width: 100%; - padding: 24px; -` - -const StyledClosed = styled(X)` - :hover { - cursor: pointer; - } -` - -const ConfirmOrLoadingWrapper = styled.div` - width: 100%; - padding: 24px; -` - -const ConfirmedIcon = styled(ColumnCenter)` - padding: 60px 0; -` - -interface VoteModalProps { - isOpen: boolean - onDismiss: () => void - voteOption?: VoteOption - proposalId?: string // id for the proposal to vote on -} - -export default function VoteModal({ isOpen, onDismiss, proposalId, voteOption }: VoteModalProps) { - const { chainId } = useAccount() - const voteCallback = useVoteCallback() - const { votes: availableVotes } = useUserVotes() - - // monitor call to help UI loading state - const [hash, setHash] = useState() - const [attempting, setAttempting] = useState(false) - - // get theme for colors - const theme = useTheme() - - // wrapper to reset state on modal close - function wrappedOnDismiss() { - setHash(undefined) - setAttempting(false) - onDismiss() - } - - async function onVote() { - setAttempting(true) - - // if callback not returned properly ignore - if (!voteCallback || voteOption === undefined) { - return - } - - // try delegation and store hash - const hash = await voteCallback(proposalId, voteOption)?.catch((error) => { - setAttempting(false) - logger.info('VoteModal', 'onVote', error) - }) - - if (hash) { - setHash(hash) - } - } - - return ( - - {!attempting && !hash && ( - - - - - {voteOption === VoteOption.Against ? ( - - ) : voteOption === VoteOption.For ? ( - - ) : ( - - )} - - - - - - - - - {voteOption === VoteOption.Against ? ( - - ) : voteOption === VoteOption.For ? ( - - ) : ( - - )} - - - - - )} - {attempting && !hash && ( - - -
- - - - - - - - - - - - - - - - - )} - {hash && ( - - -
- - - - - - - - - - - - {chainId && ( - - - - - - )} - - - )} - - ) -} diff --git a/apps/web/src/constants/chains.test.ts b/apps/web/src/constants/chains.test.ts index 1f79d191616..39a57200c15 100644 --- a/apps/web/src/constants/chains.test.ts +++ b/apps/web/src/constants/chains.test.ts @@ -199,6 +199,7 @@ const backendSupportedChains = [ Chain.Celo, Chain.Blast, Chain.Avalanche, + Chain.Zksync, ] as const test.each(backendSupportedChains)( @@ -209,7 +210,7 @@ test.each(backendSupportedChains)( }, ) -const backendNotyetSupportedChainIds = [UniverseChainId.Zora, UniverseChainId.Zksync] as const +const backendNotyetSupportedChainIds = [UniverseChainId.Zora] as const test.each(backendNotyetSupportedChainIds)( 'BACKEND_SUPPORTED_CHAINS generates the correct chains', diff --git a/apps/web/src/constants/governance.ts b/apps/web/src/constants/governance.ts deleted file mode 100644 index a8711de4815..00000000000 --- a/apps/web/src/constants/governance.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - GOVERNANCE_ALPHA_V0_ADDRESSES, - GOVERNANCE_ALPHA_V1_ADDRESSES, - GOVERNANCE_BRAVO_ADDRESSES, - TIMELOCK_ADDRESSES, - UNI_ADDRESSES, -} from '@uniswap/sdk-core' -import { UniverseChainId } from 'uniswap/src/types/chains' - -export const COMMON_CONTRACT_NAMES: Record = { - [UniverseChainId.Mainnet]: { - [UNI_ADDRESSES[UniverseChainId.Mainnet]]: 'UNI', - [TIMELOCK_ADDRESSES[UniverseChainId.Mainnet]]: 'Timelock', - [GOVERNANCE_ALPHA_V0_ADDRESSES[UniverseChainId.Mainnet]]: 'Governance (V0)', - [GOVERNANCE_ALPHA_V1_ADDRESSES[UniverseChainId.Mainnet]]: 'Governance (V1)', - [GOVERNANCE_BRAVO_ADDRESSES[UniverseChainId.Mainnet]]: 'Governance', - '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e': 'ENS Registry', - '0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41': 'ENS Public Resolver', - '0xf754A7E347F81cFdc70AF9FbCCe9Df3D826360FA': 'Franchiser Factory', - }, -} - -// in PoS, ethereum block time is 12s, see https://ethereum.org/en/developers/docs/blocks/#block-time -export const DEFAULT_AVERAGE_BLOCK_TIME_IN_SECS = 12 - -// Block time here is slightly higher (~1s) than average in order to avoid ongoing proposals past the displayed time -export const AVERAGE_BLOCK_TIME_IN_SECS: { [chainId: number]: number } = { - 1: DEFAULT_AVERAGE_BLOCK_TIME_IN_SECS, -} - -export const LATEST_GOVERNOR_INDEX = 2 diff --git a/apps/web/src/constants/lists.ts b/apps/web/src/constants/lists.ts index 895fdd3ee9f..48dc9e00204 100644 --- a/apps/web/src/constants/lists.ts +++ b/apps/web/src/constants/lists.ts @@ -1,6 +1,4 @@ // 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, COINGECKO_ZKSYNC_LIST, COINGECKO_ZORA_LIST] +export const DEFAULT_INACTIVE_LIST_URLS: string[] = [COINGECKO_AVAX_LIST] diff --git a/apps/web/src/constants/proposals/index.ts b/apps/web/src/constants/proposals/index.ts deleted file mode 100644 index 337aa84f695..00000000000 --- a/apps/web/src/constants/proposals/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const UNISWAP_GRANTS_START_BLOCK = 11473815 -export const BRAVO_START_BLOCK = 13059344 -export const ONE_BIP_START_BLOCK = 13551293 -export const POLYGON_START_BLOCK = 13786993 -export const MOONBEAN_START_BLOCK = 14732457 diff --git a/apps/web/src/constants/proposals/polygon_proposal_title.ts b/apps/web/src/constants/proposals/polygon_proposal_title.ts deleted file mode 100644 index 9e3897c7929..00000000000 --- a/apps/web/src/constants/proposals/polygon_proposal_title.ts +++ /dev/null @@ -1 +0,0 @@ -export const POLYGON_PROPOSAL_TITLE = 'Should Uniswap v3 be deployed to Polygon?' diff --git a/apps/web/src/constants/proposals/uniswap_grants_proposal_description.ts b/apps/web/src/constants/proposals/uniswap_grants_proposal_description.ts deleted file mode 100644 index 51347d38fd0..00000000000 --- a/apps/web/src/constants/proposals/uniswap_grants_proposal_description.ts +++ /dev/null @@ -1,106 +0,0 @@ -export const UNISWAP_GRANTS_PROPOSAL_DESCRIPTION = `# Uniswap Grants Program v0.1 - -*co-authored with [Ken Ng](https://twitter.com/nkennethk?lang=en)* - -## Summary: - -**This post outlines a framework for funding Uniswap ecosystem development with grants from the[ UNI Community Treasury](https://uniswap.org/blog/uni/).** The program starts small—sponsoring hackathons, [for example](https://gov.uniswap.org/c/proposal-discussion/5)—but could grow in significance over time (with renewals approved by governance) to fund core protocol development. Grants administration is a subjective process that cannot be easily automated, and thus we propose a nimble committee of 6 members —1 lead and 5 reviewers—to deliver an efficient, predictable process to applicants, such that funding can be administered without having to put each application to a vote. We propose the program start with an initial cap of $750K per quarter and a limit of 2 quarters before renewal—a sum that we feel is appropriate for an MVP relative to the size of the treasury that UNI token holders are entrusted with allocating. - -**Purpose:** - -**The mission of the UGP is to provide valuable resources to help grow the Uniswap ecosystem.** Through public discourse and inbound applications, the community will get first-hand exposure to identify and respond to the most pressing needs of the ecosystem, as well as the ability to support innovative projects expanding the capabilities of Uniswap. By rewarding talent early with developer incentives, bounties, and infrastructure support, UGP acts as a catalyst for growth and helps to maintain Uniswap as a nexus for DeFi on Ethereum. - -**Quarterly Budget:** - -* Max quarterly budget of up to $750k -* Budget and caps to be assessed every six months - -**Grant Allocation Committee:** - -* Of 6 committee members: 1 lead and 5 reviewers -* Each committee has a term of 2 quarters (6 months) after which the program needs to be renewed by UNI governance -* Committee functions as a 4 of 5 multi-sig - -**Committee Members** - -While the goals and priorities of the grant program will be thoroughly discussed and reviewed by the community through public discourse, **the decision to start UGP by operating as a small committee is to ensure that the application and decision process will be efficient and predictable, so applicants have clear objectives and timely decisions.** - -Starting with just six members enables the committee to efficiently fund projects with tight feedback loops and rapid iterations. The purpose of this committee would be to test the hypothesis that the Grants Program can successfully provide value for the UNI ecosystem before scaling the program. - -**We suggest the grants program is administered by a single lead. Here we propose Kenneth Ng, a co-author of this post**. Ken has helped grow the Ethereum Foundation Grants Program over the last two years in establishing high level priorities and adapting for the ecosystems needs. - -**The other 5 committee members should be thought of as “reviewers” — UNI community members who will keep the grants program functional by ensuring Ken is leading effectively and, of course, not absconding with funds.** Part of the reviewers job is to hold the program accountable for success (defined below) and/or return any excess funds to the UNI treasury. Reviewers are not compensated as part of this proposal as we expect their time commitment to be minimal. Compensation for the lead role is discussed below, as we expect this to be a labor intensive role. - -**Program Lead:** [Ken Ng](https://twitter.com/nkennethk?lang=en) (HL Creative Corp) -*Ecosystem Support Program at the Ethereum Foundation* - -1. Reviewer: [Jesse Walden](https://twitter.com/jessewldn) (o/b/o Unofficial LLC dba [Variant Fund](http://twitter.com/variantfund)) -*Founder and Investor at Variant Fund (holds UNI)* - -2. Reviewer: [Monet Supply](https://twitter.com/MonetSupply) -*Risk Analyst at MakerDAO* - -3. Reviewer: [Robert Leshner](https://twitter.com/rleshner) -*Founder and CEO of Compound Finance* - -4. Reviewer: [Kain Warwick](https://twitter.com/kaiynne) -*Founder of Synthetix* - -5. Reviewer: [Ashleigh Schap](https://twitter.com/ashleighschap) -*Growth Lead, Uniswap (Company)* - -## Methodology - -**1.1 Budget** - -This proposal recommends a max cap of $750K per quarter, with the ability to reevaluate biannually at each epoch (two fiscal quarters). While the UGP Grants Committee will be the decision makers around individual grants, respective budgets, roadmaps, and milestones, any top-level changes to UGP including epochs and max cap, will require full community quorum (4% approval). - -The UGP will be funded by the UNI treasury according to the[ release schedule](https://uniswap.org/blog/uni/) set out by the Uniswap team, whereby 43% of the UNI treasury is released over a four-year timeline. In Year 1 this will total to 172,000,000 UNI (~$344M as of writing). - -Taking into consideration the current landscape of ecosystem funding across Ethereum, the community would be hard-pressed to allocate even 5% of Year 1’s treasury. For context Gitcoin CLR Round 7 distributed $725k ($450k in matched) across 857 projects and YTD, Moloch has granted just under $200k but in contrast, the EF has committed to somewhere in the 8 figure range. - -**1.2 Committee Compensation** - -Operating a successful grants program takes considerable time and effort. Take, for instance, the EF Ecosystem Support Program, which has awarded grants since 2018, consists of an internal team at the Foundation as well as an ever increasing roster of community advisors in order to keep expanding and adapting to best serve the needs of the Ethereum ecosystem. While the structure of the allocation committee has six members, we propose that only the lead will be remunerated for their work in establishing the initial processes, vetting applications, and managing the program overall as this role is expected to be time consuming if the program is to be succesful. We propose that the other committee members be unpaid UNI ecosystem stakeholders who have an interest in seeing the protocol ecosystem continue to operate and grow. - -**We propose the lead be compensated 25 UNI/hr (approximately $100 USD at time of this writing) capped at 30 hours/week. This compensation, along with the quarterly budget, will be allocated to the UGP multisig from the UNI treasury**. In keeping with the committee’s commitment to the community, hours and duties will be logged publicly and transparently . - -**2.1 Priorities** - -Initially, the program aims to start narrow in scope, funding peripheral ecosystem initiatives, such as targeted bounties, hackathon sponsorships, and other low-stakes means of building out the Uniswap developer ecosystem. Over time, if the program proves effective, the grant allocations can grow in scope to include, for example, improved frontends, trading interfaces, and eventually, core protocol development. - -![|624x199](upload://vNP0APCOjiwQMurCmYI47cTLklc.png) - -With the initial priorities in mind, some effective measures for quick successes might look like: - -* Total number of projects funded -* Quarterly increase in applications -* Project engagement post-event/funding -* Overall community engagement/sentiment - -**2.2 Timeline** - -In keeping with the fast pace of the UNI ecosystem, we organize time in epochs, or two calendar quarters. Each epoch will see two funding rounds, one per quarter, after which the community can review and create proposals to improve or revamp the program as they deem fit. - -**![|624x245](upload://n56TSh5X3mt4TSqVVMFhbnZM0eM.png)** - -**Rolling Wave 1 & 2 Applications** - -* Starting in Q1 2021, UGP will start accepting applications for events looking for support in the form of bounties or prizes that in parallel can be proactively sourced. During these first two waves of funding projects, the allocation committee lead can begin laying out guardrails for continued funding - -* Considering the immediate feedback loops for the first epoch, we expect these allocation decisions to be discussed and reviewed by the larger community. Should this not be of value, the community can submit a formal governance proposal to change any piece of UGP that was not effective - -**Wave 3 & Beyond** - -* Beginning with Wave 3, there should have been enough time with impactful projects funded to be considered for follow-on funding, should it make sense. In the same vein, projects within scope will be expanded to also include those working on integrations and and other key components. - -* Beyond the second epoch, as the community helps to review and help adapt UGP to be most effective, the scope will continue to grow in order to accommodate the state of the ecosystem including that of core protocol improvements - -## Conclusion: - -**If this proposal is successfully approved, UGP will start accepting applications on a rolling basis beginning at the start of 2021.** With the phases and priorities laid out above, UGP will aim to make a significant impact by catalyzing growth and innovation in the UNI ecosystem. - -**This program is meant to be the simplest possible MVP of a Uniswap Ecosystem Grants initiative.** While the multi-sig committee comes with trust assumptions about the members, our hope is the community will approve this limited engagement to get the ball rolling in an efficient structure. **After the first epoch (2 fiscal quarters) the burden of proof will be on UGP to show empirical evidence that the program is worth continuing in its existing form and will submit to governance to renew treasury funding.** - -If this program proves successful, we hope it will inspire others to follow suit and create their own funding committees for allocating treasury capital—ideally with different specializations. -` diff --git a/apps/web/src/global.css b/apps/web/src/global.css index 9e68ce9192a..52899c09fbe 100644 --- a/apps/web/src/global.css +++ b/apps/web/src/global.css @@ -39,3 +39,21 @@ 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 de10c574d4c..5ff779402d4 100644 --- a/apps/web/src/graphql/data/SearchTokens.ts +++ b/apps/web/src/graphql/data/SearchTokens.ts @@ -8,12 +8,11 @@ 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: SearchToken, existing: SearchToken | undefined, searchChain: Chain) { +function dedupeCrosschainTokens(current: GqlSearchToken, existing: GqlSearchToken | undefined, searchChain: Chain) { if (!existing) { return current } @@ -47,8 +46,8 @@ function dedupeCrosschainTokens(current: SearchToken, existing: SearchToken | un function searchTokenSortFunction( searchChain: Chain, wrappedNativeAddress: string | undefined, - a: SearchToken, - b: SearchToken, + a: GqlSearchToken, + b: GqlSearchToken, ) { if (a.standard === NATIVE_CHAIN_ID) { if (b.standard === NATIVE_CHAIN_ID) { @@ -84,7 +83,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]: SearchToken } = {} + const selectionMap: { [projectId: string]: GqlSearchToken } = {} const filteredTokens = data?.searchTokens?.filter( (token): token is Token => token !== undefined && (BACKEND_SUPPORTED_CHAINS as ReadonlyArray).includes(token.chain), @@ -107,13 +106,4 @@ export function useSearchTokens(searchQuery: string | undefined, chainId: Suppor } } -export type TokenSearchResultWeb = Omit & { - type: SearchResultType.Token | SearchResultType.NFTCollection - address: string - chain: Chain - isNft?: boolean - isToken?: boolean - isNative?: boolean -} - -export type SearchToken = NonNullable[number]> +export type GqlSearchToken = NonNullable[number]> diff --git a/apps/web/src/graphql/data/TopTokens.ts b/apps/web/src/graphql/data/TopTokens.ts index 9cb5fb3267e..68a41be69b2 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): UseTopTokensReturnValue { +export function useTopTokens(chain: Chain, skip?: boolean): UseTopTokensReturnValue { const chainId = supportedChainIdFromGQLChain(chain) const duration = toHistoryDuration(useAtomValue(filterTimeAtom)) const isWindowVisible = useIsWindowVisible() @@ -100,7 +100,7 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { const { data: sparklineQuery } = usePollQueryWhileMounted( useTopTokensSparklineQuery({ variables: { duration, chain }, - skip: !isWindowVisible, + skip: !isWindowVisible || skip, }), PollingInterval.Slow, ) @@ -123,7 +123,7 @@ export function useTopTokens(chain: Chain): UseTopTokensReturnValue { } = usePollQueryWhileMounted( useTopTokens100Query({ variables: { duration, chain }, - skip: !isWindowVisible, + skip: !isWindowVisible || skip, }), PollingInterval.Fast, ) diff --git a/apps/web/src/graphql/data/apollo/TokenBalancesProvider.tsx b/apps/web/src/graphql/data/apollo/TokenBalancesProvider.tsx index 64d0247bf8d..684907de9cc 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() + const [lazyFetch, query] = usePortfolioBalancesWebLazyQuery({ errorPolicy: 'all' }) 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 26f0480905b..0bfec4bba49 100644 --- a/apps/web/src/graphql/data/nft/NftBalance.ts +++ b/apps/web/src/graphql/data/nft/NftBalance.ts @@ -8,6 +8,7 @@ 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 @@ -51,6 +52,7 @@ export function useNftBalance({ }, skip, }) + const hideSpam = useHideSpamTokensSetting() const hasNext = data?.nftBalances?.pageInfo?.hasNextPage const loadMore = useCallback( @@ -63,7 +65,12 @@ export function useNftBalance({ [data?.nftBalances?.pageInfo?.endCursor, fetchMore], ) - const walletAssets: WalletAsset[] | undefined = data?.nftBalances?.edges?.map((queryAsset) => { + // 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 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/usePoolsFromTokenAddress.ts b/apps/web/src/graphql/data/pools/usePoolsFromTokenAddress.ts index ababd1abaef..e44dad5802d 100644 --- a/apps/web/src/graphql/data/pools/usePoolsFromTokenAddress.ts +++ b/apps/web/src/graphql/data/pools/usePoolsFromTokenAddress.ts @@ -1,5 +1,12 @@ import { SupportedInterfaceChainId, chainIdToBackendChain } from 'constants/chains' -import { PoolTableSortState, TablePool, V2_BIPS, calculateOneDayApr, sortPools } from 'graphql/data/pools/useTopPools' +import { + PoolTableSortState, + TablePool, + V2_BIPS, + calculate1DVolOverTvl, + calculateApr, + sortPools, +} from 'graphql/data/pools/useTopPools' import { useCallback, useMemo, useRef } from 'react' import { useTopV2PairsQuery, @@ -99,11 +106,11 @@ export function usePoolsFromTokenAddress( hash: pool.address, token0: pool.token0, token1: pool.token1, - txCount: pool.txCount, tvl: pool.totalLiquidity?.value, volume24h: pool.volume24h?.value, volumeWeek: pool.volumeWeek?.value, - oneDayApr: calculateOneDayApr(pool.volume24h?.value, pool.totalLiquidity?.value, pool.feeTier), + volOverTvl: calculate1DVolOverTvl(pool.volume24h?.value, pool.totalLiquidity?.value), + apr: calculateApr(pool.volume24h?.value, pool.totalLiquidity?.value, pool.feeTier), feeTier: pool.feeTier, protocolVersion: pool.protocolVersion, } as TablePool @@ -114,11 +121,11 @@ export function usePoolsFromTokenAddress( hash: pool.address, token0: pool.token0, token1: pool.token1, - txCount: pool.txCount, tvl: pool.totalLiquidity?.value, volume24h: pool.volume24h?.value, volumeWeek: pool.volumeWeek?.value, - oneDayApr: calculateOneDayApr(pool.volume24h?.value, pool.totalLiquidity?.value, V2_BIPS), + volOverTvl: calculate1DVolOverTvl(pool.volume24h?.value, pool.totalLiquidity?.value), + apr: calculateApr(pool.volume24h?.value, pool.totalLiquidity?.value, V2_BIPS), feeTier: V2_BIPS, protocolVersion: pool.protocolVersion, } as TablePool diff --git a/apps/web/src/graphql/data/pools/useTopPools.ts b/apps/web/src/graphql/data/pools/useTopPools.ts index 285a0562035..73203926977 100644 --- a/apps/web/src/graphql/data/pools/useTopPools.ts +++ b/apps/web/src/graphql/data/pools/useTopPools.ts @@ -12,24 +12,28 @@ 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) => { switch (sortState.sortBy) { - case PoolSortFields.TxCount: - return sortState.sortDirection === OrderDirection.Desc ? b.txCount - a.txCount : a.txCount - b.txCount + case PoolSortFields.VolOverTvl: + return sortState.sortDirection === OrderDirection.Desc + ? b.volOverTvl - a.volOverTvl + : a.volOverTvl - b.volOverTvl case PoolSortFields.Volume24h: return sortState.sortDirection === OrderDirection.Desc ? b.volume24h - a.volume24h : a.volume24h - b.volume24h case PoolSortFields.VolumeWeek: return sortState.sortDirection === OrderDirection.Desc ? b.volumeWeek - a.volumeWeek : a.volumeWeek - b.volumeWeek - case PoolSortFields.OneDayApr: + case PoolSortFields.Apr: return sortState.sortDirection === OrderDirection.Desc - ? b.oneDayApr.greaterThan(a.oneDayApr) + ? b.apr.greaterThan(a.apr) ? 1 : -1 - : a.oneDayApr.greaterThan(b.oneDayApr) + : a.apr.greaterThan(b.apr) ? 1 : -1 default: @@ -38,18 +42,26 @@ export function sortPools(pools: TablePool[], sortState: PoolTableSortState) { }) } +export function calculate1DVolOverTvl(volume24h: number | undefined, tvl: number | undefined): number | undefined { + if (!volume24h || !tvl) { + return undefined + } + + return volume24h / tvl +} + /** - * Calculate the 1 day APR of a pool/pair which is the ratio of 24h fees to TVL expressed as a percent + * Calculate the APR of a pool/pair which is the ratio of 24h fees to TVL expressed as a percent (1 day APR) multiplied by 365 * @param volume24h the 24h volume of the pool/pair * @param tvl the pool/pair's TVL * @param feeTier the feeTier of the pool or 300 for a v2 pair - * @returns 1 day APR expressed as a percent + * @returns APR expressed as a percent */ -export function calculateOneDayApr(volume24h?: number, tvl?: number, feeTier?: number): Percent { +export function calculateApr(volume24h?: number, tvl?: number, feeTier?: number): Percent { if (!volume24h || !feeTier || !tvl || !Math.round(tvl)) { return new Percent(0) } - return new Percent(Math.round(volume24h * (feeTier / (BIPS_BASE * 100))), Math.round(tvl)) + return new Percent(Math.round(volume24h * (feeTier / (BIPS_BASE * 100)) * 365), Math.round(tvl)) } export const V2_BIPS = 3000 @@ -58,21 +70,22 @@ export interface TablePool { hash: string token0: Token token1: Token - txCount: number tvl: number volume24h: number - volumeWeek: number - oneDayApr: Percent + volumeWeek: number // TODO(WEB-4856): Update to 30 day when the data is available + apr: Percent + volOverTvl: number feeTier: number protocolVersion: ProtocolVersion + // TODO(WEB-4612): add hook information } export enum PoolSortFields { TVL = 'TVL', + Apr = 'APR', Volume24h = '1 day volume', - VolumeWeek = '7 day volume', - OneDayApr = '1 day APR', - TxCount = 'Transactions', + VolumeWeek = '7 day volume', // TODO(WEB-4856): Update to 30 day when the data is available + VolOverTvl = '1 day volume/TVL', } export type PoolTableSortState = { @@ -110,13 +123,14 @@ 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, + skip: !isWindowVisible || isRestExploreEnabled, }) const { loading: loadingV2, @@ -124,22 +138,23 @@ export function useTopPools(sortState: PoolTableSortState, chainId?: SupportedIn data: dataV2, } = useTopV2PairsQuery({ variables: { first: 100, chain: chainIdToBackendChain({ chainId, withFallback: true }) }, - skip: !isWindowVisible || !chainId, + skip: !isWindowVisible || !chainId || isRestExploreEnabled, }) const loading = loadingV3 || loadingV2 const unfilteredPools = useMemo(() => { + // TODO(WEB-4818): add v4 pools here const topV3Pools: TablePool[] = dataV3?.topV3Pools?.map((pool) => { return { hash: pool.address, token0: pool.token0, token1: pool.token1, - txCount: pool.txCount, tvl: pool.totalLiquidity?.value, volume24h: pool.volume24h?.value, volumeWeek: pool.volumeWeek?.value, - oneDayApr: calculateOneDayApr(pool.volume24h?.value, pool.totalLiquidity?.value, pool.feeTier), + apr: calculateApr(pool.volume24h?.value, pool.totalLiquidity?.value, pool.feeTier), + volOverTvl: calculate1DVolOverTvl(pool.volume24h?.value, pool.totalLiquidity?.value), feeTier: pool.feeTier, protocolVersion: pool.protocolVersion, } as TablePool @@ -150,11 +165,11 @@ export function useTopPools(sortState: PoolTableSortState, chainId?: SupportedIn hash: pool.address, token0: pool.token0, token1: pool.token1, - txCount: pool.txCount, tvl: pool.totalLiquidity?.value, volume24h: pool.volume24h?.value, volumeWeek: pool.volumeWeek?.value, - oneDayApr: calculateOneDayApr(pool.volume24h?.value, pool.totalLiquidity?.value, V2_BIPS), + volOverTvl: calculate1DVolOverTvl(pool.volume24h?.value, pool.totalLiquidity?.value), + apr: calculateApr(pool.volume24h?.value, pool.totalLiquidity?.value, V2_BIPS), feeTier: V2_BIPS, protocolVersion: pool.protocolVersion, } as TablePool diff --git a/apps/web/src/graphql/data/protocolStats.ts b/apps/web/src/graphql/data/protocolStats.ts index 61748e8f84e..7195dcfb580 100644 --- a/apps/web/src/graphql/data/protocolStats.ts +++ b/apps/web/src/graphql/data/protocolStats.ts @@ -14,6 +14,8 @@ 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[], @@ -22,12 +24,12 @@ function mapDataByTimestamp( const dataByTime: Record> = {} v2Data?.forEach((v2Point) => { const timestamp = v2Point.timestamp - dataByTime[timestamp] = { [ProtocolVersion.V2]: v2Point.value, [ProtocolVersion.V3]: 0 } + dataByTime[timestamp] = { [ProtocolVersion.V2]: v2Point.value, [ProtocolVersion.V3]: 0, [ProtocolVersion.V4]: 0 } }) v3Data?.forEach((v3Point) => { const timestamp = v3Point.timestamp if (!dataByTime[timestamp]) { - dataByTime[timestamp] = { [ProtocolVersion.V2]: 0, [ProtocolVersion.V3]: v3Point.value } + dataByTime[timestamp] = { [ProtocolVersion.V4]: 0, [ProtocolVersion.V2]: 0, [ProtocolVersion.V3]: v3Point.value } } else { dataByTime[timestamp][ProtocolVersion.V3] = v3Point.value } @@ -40,9 +42,10 @@ export function useHistoricalProtocolVolume( duration: HistoryDuration, ): ChartQueryResult { const isWindowVisible = useIsWindowVisible() + const isRestExploreEnabled = useFeatureFlag(FeatureFlags.RestExplore) const { data: queryData, loading } = useHistoricalProtocolVolumeQuery({ variables: { chain, duration }, - skip: !isWindowVisible, + skip: !isWindowVisible || isRestExploreEnabled, }) return useMemo(() => { @@ -54,6 +57,7 @@ export function useHistoricalProtocolVolume( values: { [PriceSource.SubgraphV2]: values[ProtocolVersion.V2], [PriceSource.SubgraphV3]: values[ProtocolVersion.V3], + [PriceSource.SubgraphV4]: values[ProtocolVersion.V4], }, }) return acc @@ -66,9 +70,10 @@ 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, + skip: !isWindowVisible || isRestExploreEnabled, }) return useMemo(() => { diff --git a/apps/web/src/graphql/data/util.tsx b/apps/web/src/graphql/data/util.tsx index a652f031d7c..4bcacbf74bb 100644 --- a/apps/web/src/graphql/data/util.tsx +++ b/apps/web/src/graphql/data/util.tsx @@ -11,6 +11,7 @@ import { SupportedInterfaceChainId, UX_SUPPORTED_GQL_CHAINS, chainIdToBackendChain, + getChainFromChainUrlParam, isSupportedChainId, } from 'constants/chains' import { NATIVE_CHAIN_ID, WRAPPED_NATIVE_CURRENCY, nativeOnChain } from 'constants/tokens' @@ -18,6 +19,7 @@ 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 { @@ -95,11 +97,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 = supportedChainIdFromGQLChain(token.chain) + const chainId = getChainFromChainUrlParam(token.chain.toLowerCase())?.id if (!chainId) { return undefined } @@ -130,14 +132,14 @@ export function fiatOnRampToCurrency(forCurrency: FORSupportedToken): Currency | } } -export function getSupportedGraphQlChain( - chain: UniverseChainInfo | undefined, - options?: undefined, -): UniverseChainInfo | undefined export function getSupportedGraphQlChain( chain: UniverseChainInfo | undefined, options: { fallbackToEthereum: true }, ): UniverseChainInfo +export function getSupportedGraphQlChain( + chain: UniverseChainInfo | undefined, + options?: { fallbackToEthereum?: boolean }, +): UniverseChainInfo | undefined export function getSupportedGraphQlChain( chain: UniverseChainInfo | undefined, options?: { fallbackToEthereum?: boolean }, @@ -218,10 +220,23 @@ export function unwrapToken< } } -type ProtocolMeta = { name: string; color: keyof ThemeColors } +type ProtocolMeta = { name: string; color: keyof ThemeColors; gradient: { start: string; end: string } } const PROTOCOL_META: { [source in PriceSource]: ProtocolMeta } = { - [PriceSource.SubgraphV2]: { name: 'v2', color: 'accent3' }, - [PriceSource.SubgraphV3]: { name: 'v3', color: 'accent1' }, + [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.SubgraphV4]: { + name: 'v4', + color: 'accent1', // TODO(WEB-4618): update the colors when they are available + gradient: { start: 'rgba(252, 116, 254, 0.20)', end: 'rgba(252, 116, 254, 0.00)' }, + }, /* [PriceSource.UniswapX]: { name: 'UniswapX', color: purple } */ } @@ -232,6 +247,9 @@ 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 c79438d9531..40c07eaec27 100644 --- a/apps/web/src/hooks/Tokens.test.ts +++ b/apps/web/src/hooks/Tokens.test.ts @@ -1,6 +1,7 @@ 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' @@ -18,8 +19,8 @@ describe('useCurrencyInfo', () => { expect(result.current).toBeUndefined() }) - it('returns undefined if skip is true', () => { - const { result } = renderHook(() => useCurrencyInfo(DAI.address, UniverseChainId.Mainnet, true)) + it('returns undefined if skip is true and no common base is found', () => { + const { result } = renderHook(() => useCurrencyInfo(TEST_TOKEN_1.address, UniverseChainId.Mainnet, true)) expect(result.current).toBeUndefined() }) @@ -28,14 +29,18 @@ describe('useCurrencyInfo', () => { it('calls useUniswapCurrencyInfo with the correct arguments', () => { renderHook(() => useCurrencyInfo(DAI.address, UniverseChainId.Mainnet)) - expect(useUniswapCurrencyInfo).toHaveBeenCalledWith(`${UniverseChainId.Mainnet}-${DAI.address}`) + expect(useUniswapCurrencyInfo).toHaveBeenCalledWith(`${UniverseChainId.Mainnet}-${DAI.address}`, { + skip: undefined, + }) }) 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}`) + expect(useUniswapCurrencyInfo).toHaveBeenCalledWith(`${UniverseChainId.Mainnet}-${DAI.address}`, { + skip: undefined, + }) }) }) @@ -45,6 +50,7 @@ describe('useCurrencyInfo', () => { expect(useUniswapCurrencyInfo).toHaveBeenCalledWith( `${UniverseChainId.Mainnet}-${UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet].nativeCurrency.address}`, + { skip: undefined }, ) }) @@ -53,6 +59,7 @@ describe('useCurrencyInfo', () => { expect(useUniswapCurrencyInfo).toHaveBeenCalledWith( `${UniverseChainId.Mainnet}-${UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet].nativeCurrency.address}`, + { skip: undefined }, ) }) @@ -62,6 +69,7 @@ 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 7e382238df9..2dbfd20a440 100644 --- a/apps/web/src/hooks/Tokens.ts +++ b/apps/web/src/hooks/Tokens.ts @@ -1,5 +1,6 @@ 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' @@ -13,7 +14,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 } from 'utilities/src/addresses' +import { isAddress, isSameAddress } from 'utilities/src/addresses' type Maybe = T | undefined @@ -57,17 +58,6 @@ 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 @@ -76,7 +66,7 @@ export function useCurrency(address?: string, chainId?: InterfaceChainId, skip?: /** * Returns a CurrencyInfo from the tokenAddress+chainId pair. */ -export function useCurrencyInfo(currency?: Currency): Maybe +export function useCurrencyInfo(currency?: Currency, chainId?: InterfaceChainId, skip?: boolean): Maybe export function useCurrencyInfo(address?: string, chainId?: InterfaceChainId, skip?: boolean): Maybe export function useCurrencyInfo( addressOrCurrency?: string | Currency, @@ -90,30 +80,72 @@ export function useCurrencyInfo( UNIVERSE_CHAIN_INFO[chainIdWithFallback as UniverseChainId]?.nativeCurrency.address ?? UNIVERSE_CHAIN_INFO[UniverseChainId.Mainnet]?.nativeCurrency.address - const address = - typeof addressOrCurrency === 'string' - ? addressOrCurrency === 'ETH' - ? nativeAddressWithFallback - : addressOrCurrency - : addressOrCurrency?.isNative - ? nativeAddressWithFallback - : addressOrCurrency?.address + const isNative = useMemo(() => checkIsNative(addressOrCurrency), [addressOrCurrency]) + const address = useMemo( + () => getAddress(isNative, nativeAddressWithFallback, addressOrCurrency), + [isNative, nativeAddressWithFallback, addressOrCurrency], + ) const supportedChainId = useSupportedChainId(chainIdWithFallback) - const addressWithFallback = - address === NATIVE_CHAIN_ID || address === 'ETH' || !address ? nativeAddressWithFallback : address + const addressWithFallback = isNative || !address ? nativeAddressWithFallback : address const currencyId = buildCurrencyId(supportedChainId ?? UniverseChainId.Mainnet, addressWithFallback) - const currencyInfo = useUniswapCurrencyInfo(currencyId) + const currencyInfo = useUniswapCurrencyInfo(currencyId, { skip }) return useMemo(() => { + const commonBase = getCommonBase(chainIdWithFallback, isNative, address) + + if (commonBase) { + return commonBase + } + if (!currencyInfo || !addressOrCurrency || skip) { return undefined } return currencyInfo - }, [addressOrCurrency, currencyInfo, skip]) + }, [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 } 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 ed63e54ff87..d7cec5bf55f 100644 --- a/apps/web/src/hooks/useAccountRiskCheck.test.ts +++ b/apps/web/src/hooks/useAccountRiskCheck.test.ts @@ -1,6 +1,8 @@ import useAccountRiskCheck from 'hooks/useAccountRiskCheck' import { ApplicationModal, setOpenModal } from 'state/application/reducer' -import { renderHook, waitFor } from 'test-utils/render' +import { mocked } from 'test-utils/mocked' +import { renderHook } from 'test-utils/render' +import { useIsBlocked } from 'uniswap/src/features/trm/hooks' // Mock the useAppDispatch hook const dispatchMock = jest.fn() @@ -9,48 +11,22 @@ 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' - const mockResponse = { block: true } - const fetchMock = jest.spyOn(window, 'fetch').mockResolvedValueOnce({ - json: jest.fn().mockResolvedValueOnce(mockResponse), - } as any) - + mocked(useIsBlocked).mockReturnValue({ isBlocked: true, isBlockedLoading: false }) renderHook(() => useAccountRiskCheck(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)) - }) + expect(dispatchMock).toHaveBeenCalledWith(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) }) it('should handle non-blocked account', async () => { const account = 'non-blocked-account' - const mockResponse = { block: false } - const fetchMock = jest.spyOn(window, 'fetch').mockResolvedValueOnce({ - json: jest.fn().mockResolvedValueOnce(mockResponse), - } as any) - + mocked(useIsBlocked).mockReturnValue({ isBlocked: false, isBlockedLoading: false }) renderHook(() => useAccountRiskCheck(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)) - }) + 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 8e006872683..a7d6e96da52 100644 --- a/apps/web/src/hooks/useAccountRiskCheck.ts +++ b/apps/web/src/hooks/useAccountRiskCheck.ts @@ -1,30 +1,23 @@ 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 } - // 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]) + if (isBlockedLoading) { + return + } + + if (isBlocked) { + dispatch(setOpenModal(ApplicationModal.BLOCKED_ACCOUNT)) + } + }, [account, isBlockedLoading, isBlocked, dispatch]) } diff --git a/apps/web/src/hooks/useIsExplorePage.ts b/apps/web/src/hooks/useIsExplorePage.ts new file mode 100644 index 00000000000..ba2ff4b3f81 --- /dev/null +++ b/apps/web/src/hooks/useIsExplorePage.ts @@ -0,0 +1,5 @@ +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 new file mode 100644 index 00000000000..8b33a8e882e --- /dev/null +++ b/apps/web/src/hooks/useShowSwapNetworkNotification.ts @@ -0,0 +1,28 @@ +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 3d2553afa17..64e28b880e1 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 { connector } = useAccount() + const account = useAccount() const [searchParams, setSearchParams] = useSearchParams() const { pathname } = useLocation() @@ -28,7 +28,11 @@ export function useSwitchChain() { (chainId: InterfaceChainId) => { const isSupportedChain = isSupportedChainCallback(chainId) if (!isSupportedChain) { - throw new Error(`Chain ${chainId} not supported for connector (${connector?.name})`) + 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 } return trace( { name: 'Switch chain', op: 'wallet.switch_chain' }, @@ -67,7 +71,8 @@ export function useSwitchChain() { }, [ isSupportedChainCallback, - connector?.name, + account.chainId, + account.connector?.name, dispatch, switchChain, multichainUXEnabled, diff --git a/apps/web/src/hooks/useUniswapWalletOptions.ts b/apps/web/src/hooks/useUniswapWalletOptions.ts index 6ea04ed7436..b58e0709ba8 100644 --- a/apps/web/src/hooks/useUniswapWalletOptions.ts +++ b/apps/web/src/hooks/useUniswapWalletOptions.ts @@ -1,30 +1,18 @@ -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' -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. - */ +// +// 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 useIsUniExtensionAvailable() { - const isGALive = useFeatureFlag(FeatureFlags.ExtensionLaunch) const currentConnector = useAccount().connector const currentConnectIsNotUniExtension = currentConnector && currentConnector.id !== CONNECTION.UNISWAP_EXTENSION_RDNS - return isGALive && !currentConnectIsNotUniExtension + return !currentConnectIsNotUniExtension } diff --git a/apps/web/src/lib/utils/searchBar.test.ts b/apps/web/src/lib/utils/searchBar.test.ts new file mode 100644 index 00000000000..db0a3f92784 --- /dev/null +++ b/apps/web/src/lib/utils/searchBar.test.ts @@ -0,0 +1,121 @@ +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 8adcdf81f07..16cc51a8bf7 100644 --- a/apps/web/src/lib/utils/searchBar.ts +++ b/apps/web/src/lib/utils/searchBar.ts @@ -1,7 +1,11 @@ -import { SearchToken, TokenSearchResultWeb } from 'graphql/data/SearchTokens' +import { GqlSearchToken } from 'graphql/data/SearchTokens' import { GenieCollection } from 'nft/types' -import { Chain } from 'uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks' -import { SearchResultType } from 'uniswap/src/features/search/SearchResult' +import { + NFTCollectionSearchResult, + SearchResultType, + TokenSearchResult, +} from 'uniswap/src/features/search/SearchResult' +import { tokenAddressOrNativeAddress } from 'uniswap/src/features/search/utils' import { UniverseChainId } from 'uniswap/src/types/chains' /** @@ -14,9 +18,9 @@ import { UniverseChainId } from 'uniswap/src/types/chains' */ export function organizeSearchResults( isNFTPage: boolean, - tokenResults: SearchToken[], + tokenResults: GqlSearchToken[], collectionResults: GenieCollection[], -): [SearchToken[], GenieCollection[]] { +): [GqlSearchToken[], GenieCollection[]] { const reducedTokens = tokenResults?.slice(0, isNFTPage ? 3 : collectionResults.length < 3 ? 8 - collectionResults.length : 5) ?? [] const reducedCollections = collectionResults.slice(0, 8 - reducedTokens.length) @@ -24,32 +28,26 @@ export function organizeSearchResults( } export const searchTokenToTokenSearchResult = ( - searchToken: SearchToken & { chainId: UniverseChainId; address: string; isToken: boolean; isNative: boolean }, -): TokenSearchResultWeb => { + searchToken: GqlSearchToken & { chainId: UniverseChainId; address: string }, +): TokenSearchResult => { return { type: SearchResultType.Token, - chain: searchToken.chain, chainId: searchToken.chainId, symbol: searchToken.symbol ?? '', - address: searchToken.address, + address: tokenAddressOrNativeAddress(searchToken.address, searchToken.chainId), 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): TokenSearchResultWeb => { +export const searchGenieCollectionToTokenSearchResult = (searchToken: GenieCollection): NFTCollectionSearchResult => { return { type: SearchResultType.NFTCollection, - chain: Chain.Ethereum, chainId: UniverseChainId.Mainnet, - symbol: '', address: searchToken.address ?? '', - name: searchToken.name ?? null, - logoUrl: searchToken.imageUrl, - safetyLevel: null, - isNft: true, + name: searchToken.name ?? '', + imageUrl: searchToken.imageUrl, + isVerified: searchToken.isVerified ?? false, } } diff --git a/apps/web/src/nft/components/collection/Filters.tsx b/apps/web/src/nft/components/collection/Filters.tsx index 3cf07de4e1c..33bd3a17369 100644 --- a/apps/web/src/nft/components/collection/Filters.tsx +++ b/apps/web/src/nft/components/collection/Filters.tsx @@ -6,13 +6,12 @@ import { MarketplaceSelect } from 'nft/components/collection/MarketplaceSelect' import { PriceRange } from 'nft/components/collection/PriceRange' import { TraitSelect } from 'nft/components/collection/TraitSelect' import { FilterSortDropdown } from 'nft/components/common/SortDropdown' -import { Checkbox } from 'nft/components/layout/Checkbox' -import { subhead } from 'nft/css/common.css' import { useCollectionFilters } from 'nft/hooks' import { Trait } from 'nft/hooks/useCollectionFilters' import { TraitPosition } from 'nft/hooks/useTraitsOpen' import { DropDownOption } from 'nft/types' -import { useMemo, useReducer } from 'react' +import { useMemo } from 'react' +import { Checkbox, Flex, Text } from 'ui/src' import { isMobileWeb } from 'utilities/src/platform' export const Filters = ({ traitsByGroup }: { traitsByGroup: Record }) => { @@ -22,7 +21,6 @@ export const Filters = ({ traitsByGroup }: { traitsByGroup: Record state.setSortBy) const hasRarity = useCollectionFilters((state) => state.hasRarity) - const [buyNowHovered, toggleBuyNowHover] = useReducer((state) => !state, false) const handleBuyNowToggle = () => { setBuyNow(!buyNow) @@ -37,28 +35,10 @@ export const Filters = ({ traitsByGroup }: { traitsByGroup: Record - { - e.preventDefault() - handleBuyNowToggle() - }} - onMouseEnter={toggleBuyNowHover} - onMouseLeave={toggleBuyNowHover} - > - - Buy now - - - - - + + Buy now + + {isMobileWeb && } diff --git a/apps/web/src/nft/components/collection/MarketplaceSelect.tsx b/apps/web/src/nft/components/collection/MarketplaceSelect.tsx index f935d7957db..f207d8e1f26 100644 --- a/apps/web/src/nft/components/collection/MarketplaceSelect.tsx +++ b/apps/web/src/nft/components/collection/MarketplaceSelect.tsx @@ -5,13 +5,13 @@ import { Box } from 'nft/components/Box' import { Column, Row } from 'nft/components/Flex' import * as styles from 'nft/components/collection/Filters.css' import { ChevronUpIcon } from 'nft/components/icons' -import { Checkbox } from 'nft/components/layout/Checkbox' import { subheadSmall } from 'nft/css/common.css' import { useCollectionFilters } from 'nft/hooks/useCollectionFilters' import { TraitPosition, useTraitsOpen } from 'nft/hooks/useTraitsOpen' import { getMarketplaceIcon } from 'nft/utils' -import { FormEvent, useEffect, useMemo, useReducer, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import { ThemedText } from 'theme/components' +import { LabeledCheckbox } from 'ui/src' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' const FilterItemWrapper = styled(Row)` @@ -72,12 +72,10 @@ const MarketplaceItem = ({ count?: number }) => { const [isCheckboxSelected, setCheckboxSelected] = useState(false) - const [hovered, toggleHover] = useReducer((state) => !state, false) useEffect(() => { setCheckboxSelected(isMarketSelected) }, [isMarketSelected]) - const handleCheckbox = (e: FormEvent) => { - e.preventDefault() + const handleCheckbox = () => { if (!isCheckboxSelected) { addMarket(value) setCheckboxSelected(true) @@ -89,11 +87,12 @@ const MarketplaceItem = ({ } const checkbox = ( - - - {count} - - + ) const titleWithLogo = ( @@ -104,7 +103,7 @@ const MarketplaceItem = ({ ) return ( -
+
) diff --git a/apps/web/src/nft/components/collection/TraitSelect.tsx b/apps/web/src/nft/components/collection/TraitSelect.tsx index eb8c0f3ca22..d4983a1e4ca 100644 --- a/apps/web/src/nft/components/collection/TraitSelect.tsx +++ b/apps/web/src/nft/components/collection/TraitSelect.tsx @@ -4,7 +4,6 @@ import { Box } from 'nft/components/Box' import { Column, Row } from 'nft/components/Flex' import * as styles from 'nft/components/collection/Filters.css' import { TraitsHeader } from 'nft/components/collection/TraitsHeader' -import { Checkbox } from 'nft/components/layout/Checkbox' import { Input } from 'nft/components/layout/Input' import { subheadSmall } from 'nft/css/common.css' import { Trait, useCollectionFilters } from 'nft/hooks/useCollectionFilters' @@ -13,6 +12,7 @@ import { scrollToTop } from 'nft/utils/scrollToTop' import { CSSProperties, FormEvent, MouseEvent, useCallback, useEffect, useMemo, useState } from 'react' import AutoSizer from 'react-virtualized-auto-sizer' import { FixedSizeList } from 'react-window' +import { LabeledCheckbox } from 'ui/src' import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send' const TRAIT_ROW_HEIGHT = 44 @@ -49,8 +49,7 @@ const TraitItem = ({ setCheckboxSelected(isTraitSelected) }, [isTraitSelected]) - const handleCheckbox = (e: FormEvent) => { - e.preventDefault() + const handleCheckbox = () => { scrollToTop() if (!isCheckboxSelected) { @@ -102,11 +101,12 @@ const TraitItem = ({ ? `${trait.trait_value} trait${pluralize(Number(trait.trait_value))}` : trait.trait_value} - - - {!showFullTraitName && trait.trait_count} - - + ) } diff --git a/apps/web/src/nft/components/layout/Checkbox.css.ts b/apps/web/src/nft/components/layout/Checkbox.css.ts deleted file mode 100644 index 82247d9a137..00000000000 --- a/apps/web/src/nft/components/layout/Checkbox.css.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { style } from '@vanilla-extract/css' -import { sprinkles } from 'nft/css/sprinkles.css' - -export const checkbox = style([ - sprinkles({ - display: 'inline-block', - marginRight: '1', - borderRadius: '4', - height: '24', - width: '24', - borderStyle: 'solid', - borderWidth: '2px', - }), -]) diff --git a/apps/web/src/nft/components/layout/Checkbox.tsx b/apps/web/src/nft/components/layout/Checkbox.tsx deleted file mode 100644 index 0121b8609c6..00000000000 --- a/apps/web/src/nft/components/layout/Checkbox.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import styled from 'lib/styled-components' -import { ApprovedCheckmarkIcon } from 'nft/components/icons' -import React from 'react' -import { ClickableStyle } from 'theme/components' - -const CheckboxLabel = styled.label` - display: flex; - align-items: center; - position: relative; - overflow: hidden; - cursor: pointer; - line-height: 1; -` -const CheckContainer = styled.span<{ checked?: boolean; hovered?: boolean; size?: number }>` - border-color: ${({ checked, hovered, theme }) => (checked || hovered ? theme.accent1 : theme.neutral3)}; - background: ${({ checked, theme }) => (checked ? theme.accent1 : undefined)}; - display: inline-block; - margin-right: 1px; - border-radius: 4px; - height: ${({ size }) => (size ? `${size}px` : '24px')}; - width: ${({ size }) => (size ? `${size}px` : '24px')}; - border-style: solid; - border-width: 1.5px; - position: relative; - ${ClickableStyle} -` -const Input = styled.input` - position: absolute; - top: -24px; - clip: rect(0 0 0 0); - clip-path: inset(50%); - height: 1px; - overflow: hidden; - position: absolute; - white-space: nowrap; - width: 1px; -` -const StyledCheck = styled(ApprovedCheckmarkIcon)<{ checked?: boolean; size?: number }>` - display: ${({ checked }) => (checked ? 'inline-block' : 'none')}; - height: ${({ size }) => (size ? `${size}px` : '24px')}; - width: ${({ size }) => (size ? `${size}px` : '24px')}; - color: white; - position: absolute; - right: 1px; -` - -interface CheckboxProps extends React.InputHTMLAttributes { - hovered: boolean - children?: React.ReactNode - className?: string -} - -export const Checkbox: React.FC = ({ hovered, children, className, ...props }: CheckboxProps) => { - return ( - - {children} - - ) -} diff --git a/apps/web/src/nft/components/profile/list/SelectMarketplacesDropdown.tsx b/apps/web/src/nft/components/profile/list/SelectMarketplacesDropdown.tsx index d3b76255eee..a4030aea9db 100644 --- a/apps/web/src/nft/components/profile/list/SelectMarketplacesDropdown.tsx +++ b/apps/web/src/nft/components/profile/list/SelectMarketplacesDropdown.tsx @@ -3,15 +3,15 @@ import { useOnClickOutside } from 'hooks/useOnClickOutside' import styled from 'lib/styled-components' import { Column, Row } from 'nft/components/Flex' import { ChevronUpIcon } from 'nft/components/icons' -import { Checkbox } from 'nft/components/layout/Checkbox' import { buttonTextMedium, caption } from 'nft/css/common.css' import { themeVars } from 'nft/css/sprinkles.css' import { ListingMarket } from 'nft/types' import { getMarketplaceIcon } from 'nft/utils' import { ListingMarkets } from 'nft/utils/listNfts' -import { Dispatch, FormEvent, useMemo, useReducer, useRef } from 'react' +import { Dispatch, useMemo, useReducer, useRef } from 'react' import { ThemedText } from 'theme/components' import { Z_INDEX } from 'theme/zIndex' +import { Checkbox } from 'ui/src' const MarketplaceRowWrapper = styled(Row)` gap: 6px; @@ -38,7 +38,6 @@ interface MarketplaceRowProps { const MarketplaceRow = ({ market, setSelectedMarkets, selectedMarkets }: MarketplaceRowProps) => { const isSelected = selectedMarkets.includes(market) - const [hovered, toggleHovered] = useReducer((s) => !s, false) const toggleSelected = () => { if (selectedMarkets.length === 1 && isSelected) { @@ -49,12 +48,8 @@ const MarketplaceRow = ({ market, setSelectedMarkets, selectedMarkets }: Marketp : setSelectedMarkets([...selectedMarkets, market]) } - const handleCheckbox = (e: FormEvent) => { - e.preventDefault() - e.stopPropagation() - } return ( - + {getMarketplaceIcon(market.name, '24')} @@ -63,9 +58,7 @@ const MarketplaceRow = ({ market, setSelectedMarkets, selectedMarkets }: Marketp - - - + ) } diff --git a/apps/web/src/nft/components/profile/view/FilterSidebar.tsx b/apps/web/src/nft/components/profile/view/FilterSidebar.tsx index 6d46e36b20d..daf59416092 100644 --- a/apps/web/src/nft/components/profile/view/FilterSidebar.tsx +++ b/apps/web/src/nft/components/profile/view/FilterSidebar.tsx @@ -5,8 +5,6 @@ import styled from 'lib/styled-components' import { AnimatedBox, Box } from 'nft/components/Box' import { Column, Row } from 'nft/components/Flex' import { XMarkIcon } from 'nft/components/icons' -import { Checkbox } from 'nft/components/layout/Checkbox' -import { checkbox } from 'nft/components/layout/Checkbox.css' import { Input } from 'nft/components/layout/Input' import { WALLET_COLLECTIONS_PAGINATION_LIMIT } from 'nft/components/profile/view/ProfilePage' import * as styles from 'nft/components/profile/view/ProfilePage.css' @@ -14,23 +12,14 @@ import { subhead } from 'nft/css/common.css' import { themeVars } from 'nft/css/sprinkles.css' import { useFiltersExpanded, useWalletCollections } from 'nft/hooks' import { WalletCollection } from 'nft/types' -import { - CSSProperties, - Dispatch, - FormEvent, - SetStateAction, - useCallback, - useEffect, - useMemo, - useReducer, - useState, -} from 'react' +import { CSSProperties, Dispatch, FormEvent, SetStateAction, useCallback, useEffect, useMemo, useState } from 'react' import { easings, useSpring } from 'react-spring' import AutoSizer from 'react-virtualized-auto-sizer' import { FixedSizeList, ListOnItemsRenderedProps } from 'react-window' import InfiniteLoader from 'react-window-infinite-loader' import { ThemedText } from 'theme/components' import { TRANSITION_DURATIONS } from 'theme/styles' +import { LabeledCheckbox } from 'ui/src' import noop from 'utilities/src/react/noop' const COLLECTION_ROW_HEIGHT = 44 @@ -63,7 +52,7 @@ const LoadingCollectionItem = ({ style }: { style?: CSSProperties }) => { -
{ const price = showInverseRate ? trade.executionPrice.invert() : trade.executionPrice @@ -190,7 +186,7 @@ export const prepareSwapFormState = ({ exactAmountToken: '', [CurrencyField.INPUT]: { address: currencyIdToAddress(inputCurrencyId), - chainId: currencyIdToChain(inputCurrencyId) ?? UniverseChainId.Mainnet, + chainId: (currencyIdToChain(inputCurrencyId) as WalletChainId) ?? UniverseChainId.Mainnet, type: AssetType.Currency, }, [CurrencyField.OUTPUT]: null, @@ -204,42 +200,6 @@ export const slippageToleranceToPercent = (slippage: number): Percent => { return new Percent(basisPoints, 10_000) } -interface MethodParameterArgs { - permit2Signature?: PermitSignatureInfo - trade: ClassicTrade - address: string - feeOptions?: FeeOptions - flatFeeOptions?: FlatFeeOptions -} - -export const getSwapMethodParameters = ({ - permit2Signature, - trade, - address, - feeOptions, - flatFeeOptions, -}: MethodParameterArgs): { calldata: string; value: string } => { - const slippageTolerancePercent = slippageToleranceToPercent(trade.slippageTolerance) - const baseOptions: UniversalRouterSwapOptions = { - slippageTolerance: slippageTolerancePercent, - recipient: address, - fee: feeOptions, - flatFee: flatFeeOptions, - deadlineOrPreviousBlockhash: trade.deadline, - } - - const universalRouterSwapOptions: UniversalRouterSwapOptions = permit2Signature - ? { - ...baseOptions, - inputTokenPermit: { - signature: permit2Signature.signature, - ...permit2Signature.permitMessage, - }, - } - : baseOptions - return UniversalSwapRouter.swapERC20CallParameters(trade, universalRouterSwapOptions) -} - export function getProtocolVersionFromTrade(trade: Trade): Protocol | undefined { if (!isClassic(trade)) { return undefined diff --git a/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts b/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts index 004f36b5cff..de7aaac81da 100644 --- a/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts +++ b/packages/wallet/src/features/transactions/transactionWatcherSaga.test.ts @@ -19,6 +19,7 @@ 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' @@ -31,7 +32,7 @@ import { watchTransaction, } from 'wallet/src/features/transactions/transactionWatcherSaga' import { getProvider, getProviderManager } from 'wallet/src/features/wallet/context' -import { getTxProvidersMocks, mockApolloClient } from 'wallet/src/test/mocks' +import { getTxProvidersMocks } 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 95874d8a684..62a07a0d1c4 100644 --- a/packages/wallet/src/features/transactions/transactionWatcherSaga.ts +++ b/packages/wallet/src/features/transactions/transactionWatcherSaga.ts @@ -7,6 +7,7 @@ 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, @@ -37,9 +38,10 @@ 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' @@ -423,6 +425,33 @@ 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 f4d55d75887..d07f666fb55 100644 --- a/packages/wallet/src/features/unitags/api.ts +++ b/packages/wallet/src/features/unitags/api.ts @@ -1,15 +1,11 @@ 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, @@ -18,7 +14,6 @@ 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' @@ -42,26 +37,6 @@ 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 fe51805cbbd..a9461444b77 100644 --- a/packages/wallet/src/features/unitags/hooks.ts +++ b/packages/wallet/src/features/unitags/hooks.ts @@ -3,12 +3,13 @@ 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, @@ -20,12 +21,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_SECOND_MS } from 'utilities/src/time/time' +import { ONE_MINUTE_MS, 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, useUnitagClaimEligibilityQuery } from 'wallet/src/features/unitags/api' +import { claimUnitag, getUnitagAvatarUploadUrl } 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' @@ -45,24 +46,29 @@ export const useCanActiveAddressClaimUnitag = (): { const { refetchUnitagsCounter } = useUnitagUpdater() const skip = !deviceId - const { loading, data, refetch } = useUnitagClaimEligibilityQuery({ - address: activeAddress, - deviceId: deviceId ?? '', // this is fine since we skip if deviceId is undefined - skip, + const { isLoading, data, refetch } = useUnitagsClaimEligibilityQuery({ + params: skip + ? undefined + : { + address: activeAddress, + deviceId, + }, }) // Force refetch of canClaimUnitag if refetchUnitagsCounter changes useEffect(() => { - if (skip || loading) { + if (skip || isLoading) { return } - refetch?.() + refetch().catch((error) => + logger.error(error, { tags: { file: 'unitags/hooks.ts', function: 'useCanActiveAddressClaimUnitag' } }), + ) // eslint-disable-next-line react-hooks/exhaustive-deps }, [refetchUnitagsCounter]) return { - canClaimUnitag: !loading && !!data?.canClaim, + canClaimUnitag: !isLoading && !!data?.canClaim, } } @@ -73,26 +79,32 @@ export const useCanAddressClaimUnitag = ( const { data: deviceId } = useAsyncData(getUniqueId) const { refetchUnitagsCounter } = useUnitagUpdater() const skip = !deviceId - const { loading, data, refetch } = useUnitagClaimEligibilityQuery({ - address, - deviceId: deviceId ?? '', // this is fine since we skip if deviceId is undefined - isUsernameChange, - skip, + + const { isLoading, data, refetch } = useUnitagsClaimEligibilityQuery({ + params: skip + ? undefined + : { + address, + deviceId, + isUsernameChange, + }, }) // Force refetch of canClaimUnitag if refetchUnitagsCounter changes useEffect(() => { - if (skip || loading) { + if (skip || isLoading) { return } - refetch?.() + refetch().catch((error) => + logger.error(error, { tags: { file: 'unitags/hooks.ts', function: 'useCanAddressClaimUnitag' } }), + ) // 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: !loading && !!data?.canClaim, + canClaimUnitag: !isLoading && !!data?.canClaim, errorCode: data?.errorCode, } } @@ -126,7 +138,10 @@ export const useCanClaimUnitagName = ( // Skip the backend calls if we found an error const unitagToSearch = error ? undefined : unitag - const { loading: unitagLoading, data } = useUnitagQuery(unitagToSearch) + const { isLoading: unitagLoading, data } = useUnitagsUsernameQuery({ + params: unitagToSearch ? { username: unitagToSearch } : undefined, + staleTime: 2 * ONE_MINUTE_MS, + }) 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 b6e5c729c9a..8b160230416 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): Promise { + generateAddressesForMnemonic(_mnemonicId: string, _startIndex: number, _stopIndex: number): Promise { throw new NotImplementedError('generateAddressesForMnemonic') } - generateAddressesForMnemonicId(_mnemonicId: string): Promise { + generateAddressesForMnemonicId(_mnemonicId: string, _startIndex: number, _stopIndex: number): 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 d4f5cc6a04c..25bf2e4e620 100644 --- a/packages/wallet/src/features/wallet/Keyring/Keyring.test.ts +++ b/packages/wallet/src/features/wallet/Keyring/Keyring.test.ts @@ -1,4 +1,3 @@ -import { WebKeyring } from 'wallet/src/features/wallet/Keyring/Keyring.web' import { SAMPLE_PASSWORD, SAMPLE_SEED, @@ -12,7 +11,8 @@ import { SAMPLE_SEED_ADDRESS_7, SAMPLE_SEED_ADDRESS_8, SAMPLE_SEED_ADDRESS_9, -} from 'wallet/src/test/fixtures' +} from 'uniswap/src/test/fixtures' +import { WebKeyring } from 'wallet/src/features/wallet/Keyring/Keyring.web' 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, 9) + const addresses = await keyring.generateAddressesForMnemonicId(SAMPLE_SEED_ADDRESS_1, 0, 10) 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 51a012fa2e2..073a701c4ed 100644 --- a/packages/wallet/src/features/wallet/Keyring/Keyring.ts +++ b/packages/wallet/src/features/wallet/Keyring/Keyring.ts @@ -1,4 +1,4 @@ -import { NotImplementedError } from 'utilities/src/errors' +import { PlatformSplitStubError } from 'utilities/src/errors' /** * Provides the generation, storage, and signing logic for mnemonics and private keys. @@ -83,34 +83,26 @@ 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 startDerivationIndex number used to specify the derivation index at which to start deriving private keys + * @param startIndex 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 + * @param stopIndex 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, - startDerivationIndex: number, - endDerivationIndex: number, - ): Promise> + generateAddressesForMnemonic(mnemonic: string, startIndex: number, stopIndex: 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 startDerivationIndex number used to specify the derivation index at which to start deriving private keys + * @param startIndex 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 + * @param stopIndex 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, - startDerivationIndex: number, - endDerivationIndex: number, - ): Promise> + generateAddressesForMnemonicId(mnemonicId: string, startIndex: number, stopIndex: number): Promise> /** * Derives private key and public address from mnemonic associated with `mnemonicId` for given `derivationIndex`. @@ -138,7 +130,7 @@ export interface IKeyring { /** Dummy Keyring implementation. */ class NullKeyring implements IKeyring { removeAllMnemonicsAndPrivateKeys(): Promise { - throw new NotImplementedError('removeAllMnemonicsAndPrivateKeys') + throw new PlatformSplitStubError('removeAllMnemonicsAndPrivateKeys') } generateAddressesForMnemonic( @@ -146,7 +138,7 @@ class NullKeyring implements IKeyring { _startDerivationIndex: number, _endDerivationIndex: number, ): Promise { - throw new NotImplementedError('generateAddressesForMnemonic') + throw new PlatformSplitStubError('generateAddressesForMnemonic') } generateAddressesForMnemonicId( @@ -154,11 +146,11 @@ class NullKeyring implements IKeyring { _startDerivationIndex: number, _endDerivationIndex: number, ): Promise { - throw new NotImplementedError('generateAddressesForMnemonicId') + throw new PlatformSplitStubError('generateAddressesForMnemonicId') } isUnlocked(): Promise { - throw new NotImplementedError('isUnlocked') + throw new PlatformSplitStubError('isUnlocked') } unlock(): Promise { @@ -170,67 +162,67 @@ class NullKeyring implements IKeyring { } checkPassword(_password: string): Promise { - throw new NotImplementedError('checkPassword') + throw new PlatformSplitStubError('checkPassword') } changePassword(_newPassword: string): Promise { - throw new NotImplementedError('changePassword') + throw new PlatformSplitStubError('changePassword') } removePassword(): Promise { - throw new NotImplementedError('removePassword') + throw new PlatformSplitStubError('removePassword') } getMnemonicIds(): Promise { - throw new NotImplementedError('getMnemonicIds') + throw new PlatformSplitStubError('getMnemonicIds') } // returns the mnemonicId (derived address at index 0) of the imported mnemonic importMnemonic(_mnemonic: string, _password?: string, _allowOverwrite?: boolean): Promise { - throw new NotImplementedError('importMnemonic') + throw new PlatformSplitStubError('importMnemonic') } removeMnemonic(_menemonicId: string): Promise { - throw new NotImplementedError('removeMnemonic') + throw new PlatformSplitStubError('removeMnemonic') } retrieveMnemonicUnlocked(_address: string): Promise { - throw new NotImplementedError('retrieveMnemonicUnlocked') + throw new PlatformSplitStubError('retrieveMnemonicUnlocked') } // returns the mnemonicId (derived address at index 0) of the stored mnemonic generateAndStoreMnemonic(_password?: string): Promise { - throw new NotImplementedError('generateAndStoreMnemonic') + throw new PlatformSplitStubError('generateAndStoreMnemonic') } getAddressesForStoredPrivateKeys(): Promise { - throw new NotImplementedError('getAddressesForStoredPrivateKeys') + throw new PlatformSplitStubError('getAddressesForStoredPrivateKeys') } // returns the address for a given mnemonic generateAddressForMnemonic(_menemonic: string, _derivationIndex: number): Promise { - throw new NotImplementedError('generateAddressForMnemonic') + throw new PlatformSplitStubError('generateAddressForMnemonic') } // returns the address of the generated key generateAndStorePrivateKey(_menemonicId: string, _derivationIndex: number): Promise { - throw new NotImplementedError('generateAndStorePrivateKey') + throw new PlatformSplitStubError('generateAndStorePrivateKey') } removePrivateKey(_address: string): Promise { - throw new NotImplementedError('removePrivateKey') + throw new PlatformSplitStubError('removePrivateKey') } signTransactionHashForAddress(_address: string, _hash: string, _chainId: number): Promise { - throw new NotImplementedError('signTransactionHashForAddress') + throw new PlatformSplitStubError('signTransactionHashForAddress') } signMessageForAddress(_address: string, _message: string): Promise { - throw new NotImplementedError('signMessageForAddress') + throw new PlatformSplitStubError('signMessageForAddress') } signHashForAddress(_address: string, _hash: string, _chainId: number): Promise { - throw new NotImplementedError('signHashForAddress') + throw new PlatformSplitStubError('signHashForAddress') } } diff --git a/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts b/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts index 4da32b16fbc..6f86b8a63b8 100644 --- a/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts +++ b/packages/wallet/src/features/wallet/Keyring/Keyring.web.ts @@ -360,22 +360,18 @@ export class WebKeyring implements IKeyring { } /** - * Derives public addresses from a mnemonic for a range of derivation indexes. + * Derives public addresses from a mnemonic for a range of derivation indexes, non inclusive * * @param mnemonic mnemonic to generate private key for (current convention is to * use the public address associated with mnemonic at derivation index 0) - * @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 + * @param startIndex 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 + * 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, - startDerivationIndex: number, - endDerivationIndex: number, - ): Promise { - if (startDerivationIndex >= endDerivationIndex) { + async generateAddressesForMnemonic(mnemonic: string, startIndex: number, stopIndex: number): Promise { + if (startIndex >= stopIndex) { throw new Error('End derivation index must be greater than start derivation index') } @@ -387,7 +383,7 @@ export class WebKeyring implements IKeyring { const hdKey = HDKey.fromExtendedKey(xpub) const addresses = [] - for (let i = startDerivationIndex; i <= endDerivationIndex; i++) { + for (let i = startIndex; i < stopIndex; i++) { const pubKey = hdKey.deriveChild(i).publicKey if (!pubKey) { continue @@ -401,23 +397,19 @@ export class WebKeyring implements IKeyring { } /** - * Derives public addresses from `mnemonicId` for a range of derivation indexes. + * Derives public addresses from `mnemonicId` for a range of derivation indexes, non inclusive * * @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 startDerivationIndex number used to specify the derivation index at which to start deriving private keys + * @param startIndex 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 + * @param stopIndex 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, - startDerivationIndex: number, - endDerivationIndex: number, - ): Promise { + async generateAddressesForMnemonicId(mnemonicId: string, startIndex: number, stopIndex: number): Promise { const mnemonic = await this.retrieveMnemonicUnlocked(mnemonicId) - return await this.generateAddressesForMnemonic(mnemonic, startDerivationIndex, endDerivationIndex) + return await this.generateAddressesForMnemonic(mnemonic, startIndex, stopIndex) } /** diff --git a/packages/wallet/src/features/wallet/context.tsx b/packages/wallet/src/features/wallet/context.tsx index d5b33566a13..28870b6bb0b 100644 --- a/packages/wallet/src/features/wallet/context.tsx +++ b/packages/wallet/src/features/wallet/context.tsx @@ -1,7 +1,9 @@ /* 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 { RPCType, WalletChainId } from 'uniswap/src/types/chains' +import { SignerMnemonicAccountMeta } from 'uniswap/src/features/accounts/types' +import { 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' @@ -61,8 +63,8 @@ export function useProviderManager(): ProviderManager { return useContext(WalletContext).value.providers } -export function useProvider(chainId: WalletChainId, rpcType: RPCType = RPCType.Public) { - return useProviderManager().tryGetProvider(chainId, rpcType) +export function useProvider(chainId: WalletChainId) { + return useProviderManager().tryGetProvider(chainId) } export function* getProviderManager() { @@ -70,17 +72,27 @@ export function* getProviderManager() { return (yield* getContext('providers')) ?? walletContextValue.providers } -export function* getProvider(chainId: WalletChainId, rpcType: RPCType = RPCType.Public) { +export function* getProvider(chainId: WalletChainId) { const providerManager = yield* call(getProviderManager) // Note, unlike useWalletProvider above, this throws on missing provider - return providerManager.getProvider(chainId, rpcType) + 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) } /** * Non-generator version of getProvider */ -export function getProviderSync(chainId: WalletChainId, rpcType: RPCType = RPCType.Public) { - return walletContextValue.providers.getProvider(chainId, rpcType) +export function getProviderSync(chainId: WalletChainId) { + return walletContextValue.providers.getProvider(chainId) } export function useContractManager(): ContractManager { diff --git a/packages/wallet/src/features/wallet/hooks.ts b/packages/wallet/src/features/wallet/hooks.ts index a9ca0f7a656..bd4fe47e50a 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 { useENSAvatar, useENSName } from 'uniswap/src/features/ens/api' +import { 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,31 +178,3 @@ 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 499f82fb692..928b809d719 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 SharedProvider({ reduxStore, children }: SharedProviderProps): JSX.Element { +export function SharedWalletProvider({ 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 0593b4fbf1b..25b84da97b8 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 dont always want to wrap all of redux for visual tests, make it default to false if in test mode + // because we don't 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 c4d35a7b341..ffd95971b5d 100644 --- a/packages/wallet/src/state/walletMigrations.ts +++ b/packages/wallet/src/state/walletMigrations.ts @@ -2,7 +2,12 @@ /* 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 @@ -228,3 +233,79 @@ 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 f8e93fe7678..876c91ea3a3 100644 --- a/packages/wallet/src/state/walletMigrationsTests.ts +++ b/packages/wallet/src/state/walletMigrationsTests.ts @@ -1,6 +1,11 @@ /* 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 { @@ -532,3 +537,42 @@ 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 49ade70b2da..3030dbe076a 100644 --- a/packages/wallet/src/state/walletReducer.ts +++ b/packages/wallet/src/state/walletReducer.ts @@ -4,8 +4,6 @@ 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' @@ -15,8 +13,6 @@ export const walletReducers = { ...uniswapReducers, appearanceSettings: appearanceSettingsReducer, behaviorHistory: behaviorHistoryReducer, - fiatCurrencySettings: fiatCurrencySettingsReducer, - languageSettings: languageSettingsReducer, notifications: notificationReducer, telemetry: telemetryReducer, timing: timingReducer, @@ -33,8 +29,6 @@ export const walletPersistedStateList: Array = [ 'notifications', 'telemetry', 'wallet', - 'languageSettings', - 'fiatCurrencySettings', ] export type WalletStateReducersOnly = ReturnType diff --git a/packages/wallet/src/test/fixtures/index.ts b/packages/wallet/src/test/fixtures/index.ts index 15c26d7917f..67eb1b4caa1 100644 --- a/packages/wallet/src/test/fixtures/index.ts +++ b/packages/wallet/src/test/fixtures/index.ts @@ -1,4 +1 @@ -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 deleted file mode 100644 index a2d48feca58..00000000000 --- a/packages/wallet/src/test/fixtures/lib/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './netinfo' -export * from './sdk' diff --git a/packages/wallet/src/test/fixtures/wallet/accounts.ts b/packages/wallet/src/test/fixtures/wallet/accounts.ts index 450a08e11dc..7e974510a4a 100644 --- a/packages/wallet/src/test/fixtures/wallet/accounts.ts +++ b/packages/wallet/src/test/fixtures/wallet/accounts.ts @@ -1,4 +1,5 @@ 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 { @@ -7,7 +8,6 @@ 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/wallet/src/test/fixtures/wallet/index.ts b/packages/wallet/src/test/fixtures/wallet/index.ts index 9229c158e63..7de7aabca25 100644 --- a/packages/wallet/src/test/fixtures/wallet/index.ts +++ b/packages/wallet/src/test/fixtures/wallet/index.ts @@ -1,5 +1,4 @@ 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 a41ea71776b..2e6b9f307c8 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/wallet/src/test/mocks/index.ts b/packages/wallet/src/test/mocks/index.ts index c4101c28b72..1bef1f06af9 100644 --- a/packages/wallet/src/test/mocks/index.ts +++ b/packages/wallet/src/test/mocks/index.ts @@ -1,4 +1,3 @@ -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 95380b1b179..fb40cc34e81 100644 --- a/packages/wallet/src/test/mocks/utils.ts +++ b/packages/wallet/src/test/mocks/utils.ts @@ -1,5 +1,7 @@ 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, @@ -8,8 +10,6 @@ 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 90376293ab9..9b9f7a87eb1 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 { SharedProvider } from 'wallet/src/provider' +import { SharedWalletProvider } 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. @@ -31,6 +31,7 @@ const mockNavigationFunctions: WalletNavigationContextState = { navigateToAccountActivityList: jest.fn(), navigateToAccountTokenList: jest.fn(), navigateToBuyOrReceiveWithEmptyWallet: jest.fn(), + navigateToExternalProfile: jest.fn(), navigateToFiatOnRamp: jest.fn(), navigateToNftDetails: jest.fn(), navigateToNftCollection: jest.fn(), @@ -69,11 +70,11 @@ export function renderWithProviders( function Wrapper({ children }: PropsWithChildren): JSX.Element { return ( - + {children} - + ) } @@ -138,7 +139,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 d456fc81768..721db2ec38e 100644 --- a/packages/wallet/src/test/test-utils.ts +++ b/packages/wallet/src/test/test-utils.ts @@ -1,7 +1,6 @@ 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/wallet/src/test/utils/index.ts b/packages/wallet/src/test/utils/index.ts deleted file mode 100644 index 15a6c29a4e5..00000000000 --- a/packages/wallet/src/test/utils/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './array' -export * from './resolvers' -export * from './wallet' diff --git a/packages/wallet/src/test/utils/wallet/index.ts b/packages/wallet/src/test/utils/wallet/index.ts deleted file mode 100644 index 4997641219b..00000000000 --- a/packages/wallet/src/test/utils/wallet/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './balances' diff --git a/packages/wallet/src/utils/currency.ts b/packages/wallet/src/utils/currency.ts index 14d1f882e75..38928789930 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 new file mode 100644 index 00000000000..f42915d59ca --- /dev/null +++ b/packages/wallet/src/utils/layout.ts @@ -0,0 +1,35 @@ +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 db277470141..468eae80c5f 100644 --- a/packages/wallet/src/utils/linking.ts +++ b/packages/wallet/src/utils/linking.ts @@ -3,13 +3,12 @@ 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() } @@ -115,7 +114,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) + const chainId = currencyIdToChain(currencyId) as WalletChainId if (!chainId) { return } @@ -125,7 +124,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 = UNISWAP_APP_NATIVE_TOKEN + tokenAddress = BACKEND_NATIVE_CHAIN_ADDRESS_STRING } 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 5ffa56b4a66..91eb7943ea4 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/scripts/check-promise-version.sh b/scripts/check-promise-version.sh new file mode 100755 index 00000000000..81ca4cfe26f --- /dev/null +++ b/scripts/check-promise-version.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# We are using a Promise polyfill for Datadog to catch unhandled promise rejections +# This script ensures we use exact same version as React Native + +# Function to extract version from package.json +get_version() { + local package_json="$1" + local package_name="$2" + grep -o "\"$package_name\": *\"[^\"]*\"" "$package_json" | grep -o '[0-9][0-9.]*' +} + +# Get package's promise version +project_promise_version=$(get_version "package.json" "promise") + +if [ -z "$project_promise_version" ]; then + echo "Error: 'promise' is not listed in your package's dependencies or devDependencies." + exit 1 +fi + +# Get current directory, where script is located +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +# Find react-native package.json +react_native_package_json="${SCRIPT_DIR}/../node_modules/react-native/package.json" + +if [ ! -f "$react_native_package_json" ]; then + echo "Error: react-native package not found. Make sure it's installed." + exit 1 +fi + +# Get react-native's promise version +react_native_promise_version=$(get_version "$react_native_package_json" "promise") + +if [ -z "$react_native_promise_version" ]; then + echo "Error: 'promise' is not listed in react-native's dependencies." + exit 1 +fi + +# Compare versions +if [ "$project_promise_version" != "$react_native_promise_version" ]; then + echo "Error: your package uses promise@$project_promise_version, but React Native uses promise@$react_native_promise_version. Set 'promise' version to '$react_native_promise_version' in package.json to fix this error." + exit 1 +else + exit 0 +fi diff --git a/turbo.json b/turbo.json index d9f03d6cfcd..2aff82dd422 100644 --- a/turbo.json +++ b/turbo.json @@ -6,14 +6,6 @@ "package.json" ] }, - "uniswap#tradingapi:generate": { - "inputs": [ - "src/data/tradingApi/api.json" - ], - "outputs": [ - "src/**/__generated__/**" - ] - }, "@uniswap/interface#prepare": { "inputs": [ "package.json" @@ -36,12 +28,12 @@ "^prepare" ] }, - "wallet#prepare": { + "uniswap#tradingapi:generate": { "inputs": [ - "package.json" + "src/data/tradingApi/api.json" ], - "dependsOn": [ - "^prepare" + "outputs": [ + "src/**/__generated__/**" ] }, "uniswap#contracts": { @@ -96,7 +88,8 @@ "data/__generated__/**", "graphql/__generated__/**" ], - "dependsOn": [] + "dependsOn": [], + "cache": false }, "typecheck": { "inputs": [ @@ -106,7 +99,8 @@ "outputs": [], "dependsOn": [ "prepare", - "^typecheck" + "^typecheck", + "^build" ] }, "check:circular": {}, @@ -172,7 +166,8 @@ ], "outputs": [ "**/dist/**", - "./apps/next/.next/**" + "./apps/next/.next/**", + "**/types/**" ], "dependsOn": [ "^build" diff --git a/yarn.lock b/yarn.lock index 33788884adf..5b167571518 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14295,6 +14295,15 @@ __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" @@ -15141,10 +15150,10 @@ __metadata: languageName: node linkType: hard -"@uniswap/client-explore@npm:0.0.7": - version: 0.0.7 - resolution: "@uniswap/client-explore@npm:0.0.7" - checksum: a8b60f3fa0053f1da622b91f6ddb0ccebf6bf119e6605e38be6ab74655be913a69216cbdf3117cff5eb24dab8db16bb1e15e8a814282edc124db4c648aca7595 +"@uniswap/client-explore@npm:0.0.9": + version: 0.0.9 + resolution: "@uniswap/client-explore@npm:0.0.9" + checksum: 206d3c42e724d9261fc9be21cc1ce9ef1fb4ab29f4fda510be5e14d2c1bc0e4aab6779303923bee11941d49c8e3ccffe541cca1dec482abed952ab9dcc804fcc languageName: node linkType: hard @@ -15227,6 +15236,7 @@ __metadata: "@types/uuid": 9.0.1 "@uniswap/analytics-events": 2.36.0 "@uniswap/eslint-config": "workspace:^" + "@uniswap/uniswapx-sdk": ^2.1.0-beta.8 "@uniswap/universal-router-sdk": 2.2.0 "@uniswap/v3-sdk": 3.13.0 "@welldone-software/why-did-you-render": 8.0.1 @@ -15282,13 +15292,6 @@ __metadata: languageName: unknown linkType: soft -"@uniswap/governance@npm:1.0.2": - version: 1.0.2 - resolution: "@uniswap/governance@npm:1.0.2" - checksum: 84e4f246e9031983ddcd5b44b77b0b19fcee2228e0d7df743bd79827c476ffc273e51cd37d0a6278183461a14de6517ead0fefed520e8c4e9c46e7529451ccf0 - languageName: node - linkType: hard - "@uniswap/interface@workspace:apps/web": version: 0.0.0-use.local resolution: "@uniswap/interface@workspace:apps/web" @@ -15358,9 +15361,9 @@ __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 "@uniswap/liquidity-staker": 1.0.2 "@uniswap/merkle-distributor": 1.0.1 "@uniswap/permit2-sdk": 1.3.0 @@ -25923,6 +25926,15 @@ __metadata: languageName: node linkType: hard +"expo-screen-capture@patch:expo-screen-capture@npm%3A5.8.1#./.yarn/patches/expo-screen-capture-npm-5.8.1-78e5827fdf.patch::locator=universe%40workspace%3A.": + version: 5.8.1 + resolution: "expo-screen-capture@patch:expo-screen-capture@npm%3A5.8.1#./.yarn/patches/expo-screen-capture-npm-5.8.1-78e5827fdf.patch::version=5.8.1&hash=0951ea&locator=universe%40workspace%3A." + peerDependencies: + expo: "*" + checksum: b62f7d8b1886a9a8b55038c476d2807d936e70b591099cdc92ecd62d3a48af406db8a4272e6f8fe93747daf9671a181842fcd7c053ab60903e236b7b6486f504 + languageName: node + linkType: hard + "expo-store-review@npm:6.8.3": version: 6.8.3 resolution: "expo-store-review@npm:6.8.3" @@ -44680,6 +44692,7 @@ __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 @@ -44706,6 +44719,7 @@ __metadata: typescript: 5.3.3 uppercamelcase: ^3.0.0 utilities: "workspace:^" + uuid: 9.0.0 wcag-contrast: 3.0.0 languageName: unknown linkType: soft @@ -45009,10 +45023,14 @@ __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 @@ -45021,7 +45039,12 @@ __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 @@ -45033,7 +45056,7 @@ __metadata: "@types/chrome": 0.0.254 "@types/react-window": 1.8.2 "@uniswap/analytics-events": 2.36.0 - "@uniswap/client-explore": 0.0.7 + "@uniswap/client-explore": 0.0.9 "@uniswap/eslint-config": "workspace:^" "@uniswap/router-sdk": 1.9.2 "@uniswap/sdk-core": 5.3.0 @@ -45042,6 +45065,7 @@ __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 @@ -45051,11 +45075,14 @@ __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 @@ -45069,6 +45096,7 @@ __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 @@ -45077,6 +45105,7 @@ __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:^" @@ -46104,10 +46133,6 @@ __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 @@ -46128,7 +46153,6 @@ __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 @@ -46138,7 +46162,6 @@ __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